Python自动化测试:pytest实现关键字驱动

news2024/11/26 20:56:47

在上一篇文章中,我编写了一个非常简单的关键字驱动程序, 不过这个程序只是跑通了功能,还有很多可以优化的地方,这篇文章我想通过 pytest 来简化自动化测试用例的编写,使用的是比较基础的 pytest 功能。 下篇文章我再写个复杂版的,从底层直接执行 yaml 文件作为用例。

优化前的用例

在没有优化之前,如果想添加用例,首先需要编写一个 yaml 文件, 然后再写一个 python 的自动化测试用例,用例的代码如下:

def test_keyword(driver):
    """获取 yaml 文件"""
    with open('signin.yaml', encoding='utf-8') as f:
        steps = yaml.safe_load(f)
        page = Page(driver)

    for step in steps:
        action_name = step.get('action')
        params = step.get('params')
        action = getattr(page, action_name)
        action(**params)

虽然这个程序用起来比较简单,如果要新建其他的用例,只需要把这个函数复制一遍,修改 signin.yaml 文件名,其他代码不需要动,但是还达不到不需要动脑筋的程度,每次复制这么多重复代码也不好看。

优化后的用例

import pytest

@pytest.mark.yaml_case('signin.yaml')
def test_keyword():
	pass

优化后的用例明显更简单,函数体中甚至一行代码也没有。 yaml 文件的配置采用装饰器形式配置在测试函数上方,更加清晰,修改的时候很容易找到地方。

具体实现

实现方式其实只用到了 pytest 的两个知识点:mark 和 fixture, 先看一下代码:

# conftest.py
import pytest
import yaml
from selenium import webdriver
from keyworks import Page

@pytest.fixture
def driver():
    d = webdriver.Chrome()
    d.implicitly_wait(8)
    d.maximize_window()
    yield d
    d.quit()

@pytest.fixture
def page(driver):
    """获取page"""
    return Page(driver)

@pytest.fixture(autouse=True)
def yaml_case(page, request):
    """yaml 测试步骤"""
    yaml_marker = request.node.get_closest_marker('yaml_case')
    yaml_file, *_ = yaml_marker.args
    with open(yaml_file, encoding='utf-8') as f:
        steps = yaml.safe_load(f)
        for step in steps:
            action = getattr(page, step['action'])
            action(**step['params'])

重点在最后一个 fixture。 首先我把 yaml_case 这个 fixture 设成了自动使用,这样在测试函数中我就不需要手工调用了,因此在用例函数中我不需要传入任何参数。

在 yaml_case 这个 fixture 中,第一行代码request.node.get_closest_marker('yaml_case')获取到 yaml_case 这个标记 mark, 第二行代码 yaml_marker.args 得到标记中的参数,也就是 signin.yaml 这个文件的路径。接下来,读取这个文件中的测试步骤,并且调用具体的执行操作就可以了,调用代码在前一篇文章中已经讲过,如果有疑问可以再翻回去看看。

@pytest.mark.yaml_case('signin.yaml')
def test_keyword():
	pass

总结

这个代码的实现主要使用了 pytest 灵活的 mark 机制和 fixture 管理, 只要 pytest 用得熟练,实现起来并不难。如果有任何疑问和建议,欢迎私信我一起讨论。

如果文章对你有帮助,记得点赞,收藏,加关注。会不定期分享一些干货哦......

END配套学习资源分享

最后: 为了回馈铁杆粉丝们,我给大家整理了完整的软件测试视频学习教程,朋友们如果需要可以自行免费领取 【保证100%免费】

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

全套资料获取方式:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/624779.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spark安装部署

spark安装部署 需要指导私信 所有节点安装scala,安装scala需要安装openjdk-8-jre(当前用户如果没有sudo权限可将其加入sudo组里),以ubuntu2204-LTS为例: $ sudo apt update $ sudo apt-get install openjdk-8-jre-headless -y (红…

【03Eclipse 窗口说明】对每个窗口和视图的功能和用途的详细说明导航栏编辑器窗口项目资源管理器

Eclipse 窗口说明 简介 Eclipse 是一款功能强大的集成开发环境(IDE),提供了丰富的窗口和视图来支持开发工作。本教程将详细介绍 Eclipse 主要窗口和常见视图的功能和用途。 主要窗口 1. 导航栏 导航栏位于 Eclipse 窗口的顶部&#xff0…

Java学习路线(22)——测试框架Junit

一、单元测试概念 单元测试就是针对最小的功能单元编写测试代码,Java程序最小的功能单元是方法,因此,单元测试就是针对Java方法的测试,进而检查方法正确性。 二、Junit测试框架 (一)概念: Jun…

认识、使用 yarn

概念 npm 是前端开发过程中常常使用的命令,比如构建 Vue 项目,亦或下载 Vue 项目依赖但是该命令效率低下,且容易出错,有没有更好的解决方案呢?有,Yarn ta是一个快速、可靠且安全的 JS 包管理工具: 快速:Yamn 本地缓…

黑客松指南|如何快速注册参与Sui x KuCoin Labs Hackathon

由Sui和KuCoin Labs联合主办的夏季黑客松,将为开发者、设计师、创业者和区块链爱好者提供一个交流和合作的平台。参与者将有机会利用Sui的先进技术和KuCoin Labs的资源,开发创新的区块链应用和解决方案。 我们鼓励参与者围绕「基础设施和工具」、「NFT、…

如何使用Jemeter对HTTP进行接口压测?没有比这个更详细的教程

目录 前言 1、首先添加一线程组 2、因为是对HTTP接口进行压力测试,所以需要在线程组下添加一HTTP请求(通过鼠标右键->添加->Sampler->HTTP请求 完成) 3、紧接着就是对HTTP请求进行设置了,主要设置服务器名称或IP&#…

10年心路历程:一个女测试工程师功能测试转向自动化测试/开发

十年测试心路历程: 由于历史原因,大部分测试人员,最开始接触都是纯功能界面测试,随着工作年限,会接触到一些常用测试工具,比如抓包,数据库,linux等。 我大学学的计算机专业&#xff…

【力扣刷题 | 第四天】 1.两数之和 454.四数之和

1. 两数之和 - 力扣(LeetCode) 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同…

【QT】解决继承QThread的子线程导致程序无法关闭主线程关闭太快导致子线程中的槽方法未执行

背景 使用串口进行通信 一共有三个线程 主线程负责界面的显示子线程1负责检测当前系统可用的串口子线程2负责差串口通信 子线程实现 在发生问题的最初,因为要一直检测当前系统的可用线程,所以线程1我使用继承自QThread实现的线程,其中重写ru…

github下载的项目如何上传到gitee

1、安装git 省略 2、github下载项目 如何注册、登录省略 3、上传到gitee 注册账号 省略 新建仓库 iot-plat创建过了,用iot-plat1演示 创建完的仓库 此处的https地址要记住,等会要用到 到本地项目目录 项目里面 Git命令操作 空白处右键&#xff…

CSP-S 第一轮笔试重点题

CSP-S提高组笔试题重点题汇总: 今天我给大家分享一些 CSP-S 第一轮笔试中的一些重点题,包含讲解。 第一题: 1.十进制小数13.375对应的二进制数是()。 A.1101.011 B.1011.011 C.1101.101 D.1010.01 解析&#x…

一起学SF框架系列5.3-模块Beans-bean与Spring容器的交互方式

正常情况下,应用中的bean同spring容器关系如下图: 尽管应用bean是Spring容器创建并建立依赖关系,应用只需使用bean即可,因此对bean来说Spring容器就是无感知的(无侵入编程)。但是还是存在需求需要应用bea…

OkHttp 框架设计剖析(含面试题)

作者:Calculus_小王 概述 OKHttp是一个基于HTTP协议的网络请求框架,它支持HTTP/2协议,连接复用和连接池,缓存策略等功能。它的核心设计是拦截器(Interceptor),它将请求的复杂逻辑切分成多个独立…

详解Java内部类、匿名内部类

内部类 内部类:类的第五个成员 1.定义:Java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B称为外部类. 2.内部类的分类: 成员内部类(静态、非静态 ) vs 局部内部类(方法内、代码块内、…

全网最强总结,Selenium自动化测试异常+处理总结,吐血整理...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 当测试工程师执行…

LVS负载均衡群集部署——DR模式

LVS负载均衡群集部署——DR模式 一、LVS-DR集群概述1、LVS-DR 工作原理2、LVS-DR数据包流量分析(同一局域网)3、LVS-DR中的ARP问题4、LVS-DR处理问题后的流量分析5、LVS-DR 特性 二、构建LVS-DR集群1、构建LVS-DR集群的步骤(理论)…

网工内推 | 网安专场,CISP认证优先,带薪年假,六险一金

01 MATRIX TECH 🔷招聘岗位:安全工程师 🔷职责描述: 1、负责信息安全防护系统的日常管理 、监测和优化提升等安全运营工作,包括终端安全、防护、漏洞检测、补丁、入侵检测、拒绝服务攻击防护、源代码安全检查等&#…

cool-admin框架后端使用-node版本,线上宝塔部署

版本6.x 宝塔新建一个文件夹和创建好数据库,记录账号和密码,自行创建,不做说明 特别注意,如果用宝塔node管理那里运行,如果按照到有pm2的,要先卸载,不可以共存,会有冲突 cool-vue前端…

.gitignore忽略文件不生效

前言 .gitignore忽略文件时git仓库很重要的一个配置,在创建仓库时就会有模板选择和忽略文件。 .gitignore忽略文件意思是在上传到代码仓库时,控制把哪些代码文件不上传到代码仓库。 在实际开发中其实写的代码是没有多大的,主要的是插件本地…

凸优化系列——最优化问题

1. 凸优化问题介绍 凸优化问题如下: 为什么要求不等式约束是线性函数呢?我们知道凸函数的下水平集是凸集。 为什么要求等式约束是线性的呢?线性函数表示一个超平面,他也是凸集 也就是说,对于凸优化问题,…