必会实战框架测试Pytest(测试框架函数必会脚本)「pytest框架设计」

每天进步一点点,关注我们哦,每天分享测试技术文章本文章出自【码同学软件测试】码同学公众号:自动化软件测试码同学抖音号:小码哥聊软件测试应用场景:pytest 框架可以解决我们多个测试脚本一起执行的问题
它提供了测试用例的详细失败信息,使得开发者可以快速准确地改正问题
它兼容最新版本的 Python
它还兼容 unittest、doctest 和 nose,开箱即用
接下来我们详细了解下pytest框架
01安装和介绍概念:pytest 是 python 的一种单元测试框架,同自带的 Unittest 测试框架类似,相比于 Unittest 框架使用起来更简洁,效率更高官网:https://docs.pytest.org/en/latest/中文文档地址:https://www.osgeo.cn/pytest/01特点和书写规则特点:非常容易上手,入门简单,文档丰富,文档中有很多实例可以参考支持简单的单元测试和复杂的功能测试支持参数化执行测试过程中可以将某些测试跳过,或者对某些预期失败的 Case 标记成失败 支持重复执行失败的 Case支持运行由 Nose, Unittest 编写的测试 Case具有很多第三方插件,并且可以自定义扩展方便的和持续集成工具集成安装:通过pip命令安装指定版本pip3 install pytest==5.4.3pytest是python的第三方测试框架,是基于unittest的扩展框架,比unittest更简洁,更高效
使用 pytest编写用例,必须遵守以下规则:测试文件名必须以“test”开头或者"test"结尾(如:test_ab.py)测试方法必须以“test”开头
test.py 或 test.py测试类命名以“Test”开头
用例识别:包含所有test_的方法(测试类不能带有— init—方法)断言使用基本的assert即可使用 pytest 需要更改 pycharm 集成设置Pytest 可以执行 uinttest 写的用例和方法02运行方式运行方式分为两种命令行模式【建议】主函数模式命令行模式【建议】命令行中执行 pytest -s test_demo01.py主函数模式import pytestclass Test:def test_case01(self):print(1)def test_case02(self):print(2)# 主函数执行if __name__ == '__main__':pytest.main(['-s','test_demo01.py'])在 test_demo01.py文件中增加主函数-s 表示支持控制台打印,如果不加,print 不会出现任何内容运行结果. 表示成功F 表示失败小结:建议使用命令行的形式运行,对比主函数模式更加方便03setup 和 teardownpytest 在运行自动化脚本的前后会执行两个特殊的方法,分别是 setup 和 teardown 在执行脚本之前会执行 setup方法,在执行脚本之后会执行 teardown 方法,我们可以在 setup 中进行获取驱动对象的操作,在teardown 中进行关闭驱动对象的操作应用场景:函数级别方法运行于测试方法的始末,运行一次测试函数会运行一次 setup 和teardown
示例代码import pytestclass Test:def setup(self):print('test--->setup')def teardown(self):print('test--->teardown')def test_case01(self):print('test--->1')def test_case02(self):print('test--->2')# 主函数执行if __name__ == '__main__':pytest.main(['-s','test_demo01.py'])执行结果示例代码import pytestclass Test:def setup_class(cls):print('test--->setupcls')def teardown_class(cls):print('test--->teardowncls')def test_case01(self):print('test--->1')def test_case02(self):print('test--->2')# 主函数执行if __name__ == '__main__':pytest.main(['-s','test_demo01.py'])执行结果02Pytest-常用插件插件列表网址: https://plugincompat.herokuapp.com包含很多插件包,大家可依据工作的需求选择 使用
01Pytest-html测试报告应用场景自动化测试脚本最终执行是通过还是不通过,需要通过测试报告进行体现使用命令进行安装 指定版本pip install pytest-html=2.1.1执行命令pytest test_login.py --html=report.html查看报告报告展示:02控制函数执行顺序应用场景:现实生活中,如果想下订单,必须先登录,我们可以通过插件的形式来控制函数执行的顺序 安装使用命令 pip3 install pytest-ordering标记于被测试函数,@pytest.mark.run(order=x)根据order传入的参数来解决运行顺序order值全为正数或全为负数时,运行顺序:值越小,优先级越高正数和负数同时存在:正数优先级高示例代码import pytestclass Test:def test_case01(self):print('test--->001')@pytest.mark.run(order=2)def test_case02(self):print('test--->002')@pytest.mark.run(order=1)def test_case03(self):print('test--->003')执行结果03失败重试免费领取 码同学软件测试 课程笔记+超多学习资料+完整视频+最新面试题,可以转发文章 + 私信「码同学666」获取资料哦应用场景:由于网络的原因造成自动化脚本报错,我们可以使用失败重试的插件,当失败后尝试再次运行,一般情况最终成功可以视为成功,但最好进行进行排查时候是脚本问题使用命令pip3install pytest-rerunfailures 进行安装使用在配置文件中的命令行参数中增加 -- reruns npytest -s test_demo2.py --reruns 3示例代码class Test:def test_a(self):assert 1,1 # 断言成功def test_b(self):print('失败')assert 0,1 # 断言失败运行结果R 表示重试注意重试时,如果脚本通过,那么后续不再重试03pytest高级用法01跳过测试函数应用场景:同一个软件在不同的设备上可能会有不同的效果,比如,iOS 的 3d touch 操作是需要 6s 以上设备支持 的,6 和 6s 都可以安装同一款应用,如果设备不支持,那么根本没有必要去测试这个功能
此时,我们可以 让这种函数进行跳过使用方式:在需要跳过的测试脚本之上加上装饰器 @pytest.mark.skipif(condition, reason="xxx")conditionreason跳过的条件,必传参数标注原因,必传参数示例代码:class Test:def test_a(self):assert 1,1 # 断言成功@pytest.mark.skipif(condition=True,reason='x')def test_b(self):print('失败')assert 0,1 # 断言失败执行结果02预期失败应用场景:举例,测试手机号码输入框长度为11位数字,如果我们传入一个 12 位数字,此时可以使用预期失败@pytest.mark.xfail(condition=None, reason=None, raises=None, run=True, strict=False)condition 跳过条件,必填参数reason 标注原因,必填参数使用方式:在需要标记预期失败的测试脚本之上加上装饰器示例示例代码:class Test:def test_a(self):print('-----testa')assert 1,1 # 断言成功@pytest.mark.xfail(condition=True,reason='x')def test_b(self):print('-----testb')assert 0,1 # 断言失败@pytest.mark.xfail(condition=True, reason='x')def test_c(self):print('-----testc')assert 0, 2 # 断言失败执行结果:x 表示预期失败结果失败 不算是bug,X 表示预期失败结果成功 算是bug03数据参数化应用场景:登录功能都是输入用户名,输入密码,点击登录
但登录的用户名和密码如果想测试多个值是没有办法 用普通的操作 实现的
数据参数化可以帮我实现这样的效果
方法名:@pytest.mark.parametrize(argnames, argvalues, indirect=False, ids=None, scope=None)argnames 参数名argvalues 参数对应值,类型必须为可迭代类型,一般使用list一个参数使用方式argnames 为字符串类型,根据需求决定何时的参数名argvalues 为列表类型,根据需求决定列表元素中的内容在测试脚本中,参数,名字与 argnames 保持一致在测试脚本中正常使用argvalues 列表有多少个内容,这个脚本就会运行几次示例代码:class Test:@pytest.mark.parametrize('age',[18,19,23,21])def test_01(self,age):print(age)执行结果:多个参数:class Test:@pytest.mark.parametrize(('name','age'),[('zhangsan',18),('lisi',19)]) def test_01(self,name,age):print(name,age)执行结果:04Pytest-fixture应用场景:fixture 修饰器来标记固定的工厂函数,在其他函数,类调用它时会被激活并优先执行,通常会被用于完成预置处理和重复操作使用方式:通过函数引用示例代码:class Testlogin:@pytest.fixture()def test_login(self):print('登录操作')uname = 'lily'return unamedef test_a(self,test_login):print(f'test_a {test_login}')def test_b(self):print('不需要登录操作')运行结果:免费领取码同学软件测试课程笔记+超多学习资料+学习完整视频,可以关注我们公众号哦:自动化软件测试本文著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处
必会实战框架测试Pytest(测试框架函数必会脚本)
(图片来源网络,侵删)

联系我们

在线咨询:点击这里给我发消息