pytest概述
pytest介绍
pytest框架的优点: 1、简单灵活,容易上手,文档丰富 2、支持参数化,可以细粒度地控制要测试的测试用例 3、能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests) 4、pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等 5、测试用例的skip和xfail处理 6、可以很好的和CI工具结合,例如与jenkins集成
python测试框架对比
总体来说,unittest比较基础,适合代码能力较强的使用,robot framework易用性更好,但是灵活性及可定制性略差,pytest更加方便快捷,效率更高;
pytest使用介绍
安装pytest
在命令行运行pip install pytest命令即可安装pytest(首先需要先安装python)
检查你安装的pytest的版本信息是否正确:pytest --version
运行函数
执行命令pytest cases/Study/test_study_pytest.py,单纯执行该python文件 执行命令pytest -v cases/Study/test_study_pytest.py,显示具体的详情信息,一般显示错误的位置及错误的详细信息 执行命令pytest -q cases/Study/test_study_pytest.py,pytest -q等价于Pytest --quiet 可以简化输出信息,pytest -v是显示具体的详细信息,简化了输出的信息 执行pytest -k test_failing cases/Study/test_study_pytest.py,执行指定的测试用例,pytest -k “test_a and test_b” 运行名称包含指定表达式的用例(支持and or not) 执行pytest -v cases/Study/test_study_pytest.py --html=report.html,执行测试用例并且在当前目录下生成report文件
pytest知识点
编写规则
- 测试文件以test_开头(以_test结尾也可以)
- 测试类以Test开头,并且不能带有 init 方法
- 测试函数以test_开头
- 断言使用基本的assert即可
mark标记-标记函数
在实际工作中,我们要写的自动化用例会比较多,也不会都放在一个py文件中,如果有几十个py文件,上百个方法,而我们只想运行当中部分的用例时怎么办?
标记函数作用:在不用跑全套测试时,用于标记选择需要测试的子集 语法: @pytest.mark.xxx(标签可以自定义) 运行时通过pytest -v -m ‘标记的标签(标记之间可以添加and、or、 not关键字)’ 测试文件 功能: 一个测试函数可以有多个标记, 一个 marker 也可以用来标记多个测试函数
mark标记-使用
注册标记 --> 使用标记 --> 运行指定的标记
注册标记
1、在项目根目录下创建一个pytest.ini文件,格式: markers=后面是标签名,如有多个,第二个开始要换行,且要缩进,不然会报错 2、注册完成后,使用pytest --markers来核实标记是否注册成功 3、若标记未注册,运行代码时(pytest的高级版本)可能会报警告让你进行注册
使用标记
1、直接标记类或方法或函数:@pytest.mark.标签名 2、 类属性:pytestmark = [pytest.mark.标签名, pytest.mark.标签名],需要注意的是属性名称是固定的
mark标记-运行指定的标记
1、通过命令行执行命令pytest -m + “标记名”+指定的python文件,进入用例的目录执行命令 单个标签:pytest -m “标记名” (-m意思是执行标记mark),不想执行某个标记可以用not来取反,即pytest -m “not 标记名”
多个标签:可以加上判断,pytest -m “qc and beta” 或者 pytest -m “qc or beta” 效果是一样的
?注意:标签名一定要加双引号,单引号是会报错的。 2、通过代码,执行指定标记的测试用例:
if __name__ == '__main__':
pytest.main(['-m qc and beta', '-s']) # 标签名不需要加引号
-s命令是指打印更加详细的信息
这里普及一下,main()方法是可以接收不定长参数的,因此可以把要执行的命令放在一个列表中 3、mark标记应用-执行跳过 在维护测试用例的过程中,可能在一个阶段某些用例已经不需要了,或者在指定条件下是不需要运行的,那么我们就可以通过mark.skip跳过这些函数或者类,两种跳过方式:
- 直接跳过: @pytest.mark.skip(reason = “原因”),这里原因是可选参数
- 条件跳过,即满足某个条件才跳过:@pytest.mark.skipif(a == 1, reason = “原因”)
mark标记应用-参数化
当对一个测试函数进行测试时,通常会给函数传递多组参数。比如测试账号登陆,我们需要模拟各种千奇百怪的账号密码。
当然,我们可以把这些参数写在测试函数内部进行遍历。但这样是一个测试,当某组参数导致断言失败,测试也就终止了。
更好的解决方法,就是参数化测试,即每组参数都独立执行一次测试。
使用的工具就是 pytest.mark.parametrize(argnames, argvalues),参数名和参数值。
unittest单元测试框架使用DDT进行数据驱动测试,Pytest是使用@pytest.mark.parametrize装饰器来实现数据驱动测试的。
通过parametrize参数化,传入三组参数,用例会单独执行三次,其中一次执行报错不会影响其他参数的执行
@pytest.mark.parametrize('keyword', ['1', '2', '3'])
def test_companyPS_012(driver, keyword):
"""
名称:
步骤:
测试数据:
期望:
"""
page = companyPSPage(driver) # 引入page页面元素-公用
page.topMenu[6].click()
time.sleep(1)
page.addGroup.click()
page.nameInput[1].send_keys(keyword)
多个参数:@pytest.mark.parametrize(‘a, b, c’, [(1,2,3), (4,5,9)])
mark标记总结
mark标记还有很多其他的应用场景,比如: 1、与pytest-ordering插件搭配,设置执行顺序: 使用: #标记指定用例的执行顺序 @pytest.mark.run(order=2)
2、与pytest-rerunfailures插件搭配,设置失败重跑机制 使用: #执行指定python文件的命令 pytest test_class.py --reruns 5 --reruns-delay 1 -vs (失败后重新运行5次,每次间隔1秒) #标记指定某个用例失败重跑机制 @pytest.mark.flaky(reruns = 5 ,reruns-delay = 1 )
3、还有很多其他内容,时间有限,仅说明一些常用的知识,可后期自行学习
总结
1、通过整个分享过程中的内容不难发现pytest是一个功能较为齐全的测试框架 2、同时pytest非常优秀的点是可以支持扩展很多插件
推荐几个插件: 1、pytest-html–生成html的测试报告 2、pytest-repeat–重复执行测试 3、pytest-xdist–分布式测试
|