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集成
总体来说,unittest比较基础,适合代码能力较强的使用,robot framework易用性更好,但是灵活性及可定制性略差,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文件
在实际工作中,我们要写的自动化用例会比较多,也不会都放在一个py文件中,如果有几十个py文件,上百个方法,而我们只想运行当中部分的用例时怎么办?
标记函数作用:在不用跑全套测试时,用于标记选择需要测试的子集
语法:
@pytest.mark.xxx(标签可以自定义)
运行时通过pytest -v -m ‘标记的标签(标记之间可以添加and、or、 not关键字)’ 测试文件
功能:
一个测试函数可以有多个标记, 一个 marker 也可以用来标记多个测试函数
注册标记 --> 使用标记 --> 运行指定的标记
1、在项目根目录下创建一个pytest.ini文件,格式:
markers=后面是标签名,如有多个,第二个开始要换行,且要缩进,不然会报错
2、注册完成后,使用pytest --markers来核实标记是否注册成功
3、若标记未注册,运行代码时(pytest的高级版本)可能会报警告让你进行注册
1、直接标记类或方法或函数:@pytest.mark.标签名
2、 类属性:pytestmark = [pytest.mark.标签名, pytest.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.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标记还有很多其他的应用场景,比如:
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–分布式测试