pytest单元测试框架

本文深入探讨了pytest框架的使用,包括测试用例的发现规则、执行顺序、用例跳过、前置后置操作的实现以及不同级别的fixture。此外,还介绍了参数化测试、测试报告的生成(如HTML和JUnitXML格式)以及测试用例失败后的重试和并行执行。重点讲解了fixture的使用,包括作用范围和teardown的两种实现方式,以及如何通过装饰器控制执行顺序。
摘要由CSDN通过智能技术生成

一. pytest做的四件事

  1. 发现测试用例:根据他自己的规则去找到测试用例
规则:

 1. 模块名必须以test_开头或者以_test结尾。
 2. 测试类必须以Test开头,不能有init方法
 3. 测试用例必须以test_开头

  1. 执行测试用例:安装一定的顺序执行
执行顺序:
默认从上到下执行,如果有pytest.mark.run(order=1)装饰器除外
  1. 判断测试结果:
pytest断言:用原生的assert方法
  1. 生成测试报告:
通过插件pytest-html和allure-pytest生成报告
  1. 其他功能:
实现skip跳过测试用例;
失败用例重跑;
众多的插件:
pytest-html
allure-pytest
pytest-ordering
pytest-xdist
pytest-rerunfailures

二. pytest的运行方式

2.1 主函数模式

import pytest

class Test_1:
    def test_1(self):
        print('在test_1')
        assert 1==1
    def test_2(self):
        print('在test_2中')
        assert 1 == 2
    def test_3(self):
        print('在test_3中')
        assert 1 > 3
    def test_4(self):
        print('在test_4中')
        assert 1 < 3

if __name__ == '__main__':
    pytest.main(['-v'])
运行时的各种可选参数:
-v: 输出更详细的信息,比如文件和用例名
-s: 输出调试信息
-x:出现1个失败用例则停止测试
pytest.main(['-v', '-x'])
--maxfail=2 指定出现多个失败则停止测试
pytest.main(['-v', '--maxfail=2'])
--html=report.html 生成html报告
需要安装pytest-html第三方库
pytest.main(['-v', '--html=report.html'])
-k:运行类名或测试用例名中包含指定字符串的测试用例
pytest.main(['-v', '-k', 'andy or test_2'])
指定执行哪个模块中的::哪个类的::哪个测试用例函数
pytest.main(['./run/test_test.py::Test_1::test_2'])
-m string
这种方式会运行所有通过装饰器 @pytest.mark.string进行装饰的测试用例

在这里插入图片描述

2.2 命令行模式

2.3 基于pytest.ini文件的规则执行(生产中多用这种方式)

加了配置文件pytest.ini以后,不管是主函数模式还是命令行模式,都会自动去读取这个配置文件,然后根据这个配置文件去发现和执行测试用例

在这里插入图片描述
用装饰器pytest.mark给测试用例做标记;然后在pytest.ini配置文件中在附加选项中用-m 指定要执行的测试用例
在这里插入图片描述

三. 用例执行顺序

3.1 默认是从上到下的顺序执行

3.2 可以用装饰器pytest.mark.run(order=n)来改变执行顺序

@pytest.mark.run(order=1)

四. 跳过测试用例

无条件跳过和有条件跳过
在这里插入图片描述

五. 实现前置和后置操作

5.1 在每个测试用例之前和之后做操作

在类中写setup方法和teardown方法
在这里插入图片描述

5.2 在每个类之前和之后做操作

在类中写setup_class方法和teardown_class方法
在这里插入图片描述

5.3 可以把类和用例的前置和后置函数写在一个父类中,然后所有测试类都继承这个父类

用setup或setup_method
用teardown或teardown_method
在这里插入图片描述

5.4 在模块·之前和之后做操作

在模块中写setup_module方法和teardown_module方法
在这里插入图片描述

六. fixture

6.1 function级别的fixture

在这里插入图片描述

6.2 用fixture装饰的前置后置函数可以返回值给测试用例函数

在这里插入图片描述

6.3 测试用例函数可以接收多个fixture函数

在这里插入图片描述

6.4 fixture函数与fixture函数可以互相调用

在这里插入图片描述

6.5 fixture的作用范围

参数scope控制fixture的作用范围:session>module>class>function

-function:每一个函数或方法都会调用

-class:每一个类调用一次,一个类中可以有多个方法

-module:每一个.py文件调用一次,该文件内又有多个function和class

-session:是多个文件调用一次,可以跨.py文件调用,每个.py文件就是module

6.5.1 function方法级别

function默认模式@pytest.fixture(scope=‘function’)或 @pytest.fixture()

6.5.2 class类级别

@pytest.fixture(scope=‘class’)
在这里插入图片描述

6.5.3 module模块级别

@pytest.fixture(scope=‘module’)

每一个.py文件调用一次,fixture为module时,在当前.py脚本里面所有用例开始前只执行一次。

在这里插入图片描述

6.5.4 session 会话级别

@pytest.fixture(scope='session')

1、可以跨.py文件调用,有多个.py文件调用时,实际只调用了一次fixture

2、conftest.py与运行的用例要在同一个pakage下,并且有__init__.py文件

3、不需要import导入 conftest.py,pytest会自动识别该文件,放到项目的根目录下就可以全局调用了,如果放到某个package下,那就在改package内有效

4、conftest.py配置脚本名称是固定的,不能改名称

在这里插入图片描述

七. 参数化

7.1 用装饰器@pytest.mark.parametrize做参数化

在这里插入图片描述可以借助pytest.param标记测试用例
在这里插入图片描述

7.2 用fixtures参数化

在这里插入图片描述
在这里插入图片描述

七. 生成测试报告

7.1 生成html报告

--html=report.html 生成html报告
需要安装pytest-html第三方库
pytest.main(['-v', '--html=report.html'])

7.2 生成JUnit XML 文件

pytest.main(['-v', '--junit-xml=./run/log.xml'])

7.3 生成在线测试报告

pytest.main(['-v', '--pastebin=all'])

上述代码可生成一个 session-log 链接,复制链接,通过浏览器打开,会得到一张 HTML格式的测试报告
在这里插入图片描述

八. pytest-rerunfailures测试用例失败重试

  1. 安装库
    pip install pytest-rerunfailures
  2. 通过“–reruns”参数设置测试用例运行失败后的重试次数
    在这里插入图片描述
pytest.main(['-v', '--reruns=3'])

在这里插入图片描述

九. pytest-parallel多进程/线程并行执行测试用例

  1. 安装第三方库
pip install pytest-parallel

十. fixtures的teardown代码方式

11.1 yield

11.2 使用addfinalizer函数来注册一个teardown的处理函数

在这里插入图片描述可以同时注册使用多个后置函数,先注册的后执行
在这里插入图片描述

十二. fixtures可以获取测试对象的上下文

fixture函数可以通过接收一个request对象来获取测试函数/类/模块的上下文。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值