pytest是一个非常流行且高效的Python测试框架,它提供了丰富的功能和灵活的用法,使得编写和运行测试用例变得简单而高效。
一、为什么选择pytest
①简单易用:pytest的语法简洁清晰,对于编写测试用例非常友好,几乎可以在几分钟内上手。
②强大的断言库:pytest内置了丰富的断言库,可以轻松的进行测试结果的判断。
③支持参数化测试:pytest支持参数化测试,允许使用不同的参数多次运行同一个测试函数,这大大提高了测试效率。
④丰富的插件生态系统:pytest有着丰富的插件生态系统,可以通过插件扩展各种功能,比如覆盖率测试、测试报告生成、失败用例重复执行等。此外,pytest还支持与selenium、requests、appinum等结合,实现web自动化、接口自动化、App自动化测试。
⑤灵活的测试控制:pytest允许跳过哦指定用例,或对某些预期失败的case标记成失败,并支持重复执行失败的case。
二、安装
python
pip install pytest
三、用例运行规则
1.文件名必须以test_k开头或者以_test结尾
2.测试类必须以Test开头,并且不能右__init__方法
3.测试方法必须以test开头。
满足上述要求后,可以通过命令行参数pytest直接运行符合条件的用例。
由上述测试用例和测试结果可以得出补充结论:
①测试方法硬性要求以test(区分大小写)为开头
②文件名不区分大小写
③文件名必须以"test_"开头或者"test"结尾,注意''是必须的,不能丢
由上图测试结果可以验证:
①测试类必须以Test(区分大小写)开头
②测试类不能有__init__方法
四、pytest命令参数
①pytest:在当前目录及其字目录中搜索并运行
②pytest -v:增加输出的详细程度
③pytest -s:显示测试中的print语句
④pytest test_module.py:运行指定的测试模块
⑤pytest test_dir/:运行指定目录下的所有测试
五、pytest配置文件
在当前目录下创建pytest.ini文件,该文件为pytest的配置文件
①addopts:指定在命令行中默认包含的选项(-v -s)
②testpaths:指定pytest手机测试用例时的目录
③python_files:手动指定文件命名规则
④python_classes:手动指定类名命名规则
⑤python_functions:手动指定方法命名规则
⑥norecursedirs:指定在搜索测试时应避免递归进入目录的模式
⑦markers:定义测试标记,用于标记测试用例
注意:配置文件必须放在根目录中才能生效,不能放在子目录里!
六、前后置
使用pytest框架,测试类中不可以添加init方法,如何进行数据的初始化?
在测试框架中,前后置是指在执行测试用例前和测试用例后执行一些额外的操作,这些操作可以用于设置测试环境、准备测试数据等,以确保测试的可靠性
pytest框架提供三种方法做前后置的操作:
①setupmethod:测试类中的每个测试方法的前置操作
②teardown_method:测试类中的每个测试方法的后置操作
效果展示:
每个方法执行前后都会调用前置和后置操作
③setup_class:整个测试类的前置操作
④teardown_class:整个测试类的后置操作。
效果展示
只在类开始和类结束调用
七、断言
断言时一种调试辅助工具,用于检查程序的状态是否符合预期,如果断言失败,python解释器会抛出一个AssertionError异常。断言通常用于检测程序中的逻辑错误。
pytest允许你在python测试中使用标准的Python assert语句来验证预期和值
pythonassert 条件, 错误信息条件:必须是一个布尔表达式
错误信息:当条件为假时显示的错误信息,可选。
八、参数化
参数化设计时自动化设计中的一个重要组成部分,它通过定义设计参数和规则,使得设计过程更加灵活和可控。pytest中内置的pytest.mark.parametrize装饰器允许对测试函数的参数进行参数化。
那么参数化具体要解决什么样的问题呢?
pythondef test_01(username): print(f"{username} step1") print(f"{username} step2")在上面这段代码中,要想确保username是变化的,就要对其进行输入,但是自动化测试是不能输入的,所以我们引入了参数化这个概念,那么参数化具体是怎么操作的呢?
pytest自动为每一位成员调用一次
那么如果想要为多个测试方法都调用呢?
我们只需要在每一个测试方法上方使用parametrize就行了。
但是我如果很多方法都要使用相同的参数化,是不是很麻烦?
方法如下:
这样就可以只写一次重复调用啦!
九、fixture
pytest中fixture是一种强大的机制,用于提供测试函数所需的资源或上下文。它可以用于设置测试环境、准备数据等。
1.基本使用
只需要将init写入测试方法的参数列表中就可以在测试开始前自动调用init函数。
当方法比较多的时候,想让哪个进行初始化就写,不想就不写,比前后置灵活了许多。
使用案例:
2.嵌套使用
一个示例:果汁加工到引用
3.请求多个fixture
4.yeild
如何使用fixture执行后置操作?
使用yeild,yeild前边的语句在方法执行前运行,在yeild后边的语句在方法执行完运行
yield类似于返回值,在yield后边写一个值,在方法中,调用fixture就能接收到这个返回值了下边的例子是打开文件并读取的操作,读取完毕自动关闭
5.带参数的fixture
pythonpytest.fixture(scope='', params='', autouse='', ids='', name='')参数:
①scope(范围):参数决定了fixture的工作范围,决定了fixture的生命周期,可选值有:
- function(默认):每个测试函数都会调用fixture
- class:在同一个类中共享这个fixture
- module:在同一个测试模块中共享这个fixture(一个文件)
- session:整个测试会话中共享这个fixture
②autouse:默认为False,即当前fixture需要手动显示调用,如果设置为True,fixture会在所以测试函数执行前自动调用,无论这些测试函数是否显示引用了fixture
③params:用于参数化fixture,支持以列表的形式传入,每个参数都会使fixture执行一次,类似于范围for。
注意:使用params的函数必须携带参数request且必须写成request
十、指定用例执行顺序
在pytest中,文件间默认执行顺序是按照文件的名称执行的,文件内是按照行的先后顺序执行的。
那么如果我们想要指定执行顺序怎么操作?
引入插件---pytest-order。
pip install pytest-order==1.3.0使用方法:
按照顺序执行。
















































