pytest单元测试框架

pytest

一. 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进行装饰的测试用例

pytest单元测试框架

2.2 命令行模式

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

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

pytest单元测试框架
用装饰器pytest.mark给测试用例做标记;然后在pytest.ini配置文件中在附加选项中用-m 指定要执行的测试用例
pytest单元测试框架

; 三. 用例执行顺序

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

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

@pytest.mark.run(order=1)

四. 跳过测试用例

无条件跳过和有条件跳过

pytest单元测试框架

; 五. 实现前置和后置操作

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

在类中写setup方法和teardown方法

pytest单元测试框架

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

在类中写setup_class方法和teardown_class方法

pytest单元测试框架

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

用setup或setup_method
用teardown或teardown_method

pytest单元测试框架

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

在模块中写setup_module方法和teardown_module方法

pytest单元测试框架

六. fixture

6.1 function级别的fixture

pytest单元测试框架

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

pytest单元测试框架

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

pytest单元测试框架

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

pytest单元测试框架

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’)

pytest单元测试框架

; 6.5.3 module模块级别

@pytest.fixture(scope=’module’)

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

pytest单元测试框架

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配置脚本名称是固定的,不能改名称

pytest单元测试框架

七. 参数化

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

pytest单元测试框架
pytest单元测试框架

; 7.2 用fixtures参数化

pytest单元测试框架
pytest单元测试框架

七. 生成测试报告

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单元测试框架

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

  1. 安装库
    pip install pytest-rerunfailures
  2. 通过”–reruns”参数设置测试用例运行失败后的重试次数
    pytest单元测试框架
pytest.main(['-v', '--reruns=3'])

pytest单元测试框架

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

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

十. fixtures的teardown代码方式

11.1 yield

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

pytest单元测试框架
pytest单元测试框架

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

fixture函数可以通过接收一个request对象来获取测试函数/类/模块的上下文。

pytest单元测试框架

Original: https://blog.csdn.net/qq_33808440/article/details/119869042
Author: qq_33808440
Title: pytest单元测试框架

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/775857/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球