前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python pytest测试框架详解

Python pytest测试框架详解

作者头像
全栈程序员站长
发布2022-11-15 11:02:33
2.8K0
发布2022-11-15 11:02:33
举报
文章被收录于专栏:全栈程序员必看

pytest介绍: pytest是一个非常成熟的全功能的Python测试框架: 1.简单灵活,容易上手 2.支持参数化 3.测试用例的skip和xfail,自动失败重试等处理 4.能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+request) 5.pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest- allure(完美html测试报告生成)、pytest-xdist(多CPU分发)等 6.可以很好的和jenkins集成

安装pytest:pip install -U pytest 其中-U是对pytest进行更新 pytest – version:查看版本号 测试用例的识别与运行: 识别: 测试文件: 1.test_.py 2.test.py 用例识别: 1.Test*类包含的所有test*的方法(测试类不能有__init__方法) 2.不在class中的所有test_*方法 pytest也可以执行unittest框架写的用例和方法 运行: pytest -v :可以运行出详细的日志信息 pytest -s :可以打印出测试用例用print的内容 pytest 文件名.py::类名 :运行某个模块里面的类 pytest 文件名.py::类名::方法名 :运行某个模块里面的某个类的方法 pytest -v -k”类名 and not 方法名”:跳过运行某个用例 pytest -m[标记名]:@pytest.mark.[标记名]将运行有这个标记的测试用例 pytest -x 文件名:一旦运行到报错就停止运行 pytest –maxfail=[num]:当运行错误达到num的时候就停止运行

pytest执行-失败重新运行: 场景:测试失败后要重新运行n次,要在重新运行之间添加延迟时间,间隔n秒在运行 安装:pip install pytest-rerunfailures 执行: 1.pytest – reruns 3 -v -s test_class.py(设置重新运行n次) 2.pytest -v – reruns 5 –reruns-delay 1(设置延迟时间) pytest执行-多条断言有失败也都运行 场景:一个方法中写多条断言,通常第一条过不去,下面就不执行了,我们想报错也都执行一下 安装:pip install pytest-assume 执行: 1.pytest.assume(1==4)

2.pytest.assume(2==4)

pytest框架结构 import pytest 类似的setup,teardown同样更灵活 1.模块级(setup_module/teardown_module)模块始末,全局的(优先最高) 2.函数级(setup_function/teardown_function)只对函数用例生效(不在类中) 3.类级(setup_class/teardown_class)只在类中前后运行一次(在类中) 4.方法级(setup_method/teardown_method)开始于方法始末(在类中) 5.类里面(setup/teardown)运行在调用方法的前后

pytest-fixtrue的用法 场景: 1.用例1需要先登录 2.用例2不需要登录 3.用例3需要登录 这种场景无法用setup和teardown实现 用法:在方法前面加@pytest.fixture() 场景:测试用例执行时,有的用例需要登陆才能执行,有些用例不需要登陆,setup和teardown无法满足。fixture可以,默认scope(范围)function 步骤: 1.导入pytest 2.在登录的函数前面加@pytest.fixture() 3.在要使用的测试方法中传入(登陆函数名称),就先登录 4.不传入的就不登录直接执行测试方法 前端自动化中应用-conftest 场景:你与其他测试工程师合作一起开发时,公共模块要在不同文件下,要在大家都能访问到的地方 解决:conftest.py这个文件进行数据共享,并且他可以放在不同位置起着不同范围共享的作用 执行:系统执行到参数login时先从本文件中查找是否又这个名字的变量,之后在conftest.py中找是否有 步骤:将登陆模块带@pytest.fixture()写在conftest.py中 conftest.py配置需要注意: 1.conftest文件名是不能换的 2.conftest.py与运行的用例要在同一个package下,并且有__init__文件 3.不需要import导入conftest.py文件,pytest用例会自动查找 4.全局的配置和前期工作都可以写在这里,放在某个包下,就是这个包共享的地方 前端自动化中应用-yieid 场景:你已经可以将测试方法前要执行或依赖的解决了,测试方法后销毁清楚数据的要如何进行呢?范围是模块级别的。类似setupClass 解决:通过在同一模块中加入yieid关键字,yield是调用第一次返回结果,第二次执行它下面的语句返回 步骤:在@pytest.fixture(scope=module) 在登录的方法中加yieid,之后加销毁清楚的步骤,注意,这种方式没有返回值,如果希望返回使用addfinalizer fixture的自动应用 场景:不想原测试方法有任何改动,或全部都自动实现自动应用,没特例,也都不需要返回值时可以选择自动应用 解决:使用fixture中参数autouse=True实现 步骤: 1.在方法上面加@pytest.fixture(autouse=True) 2.在测试方法上面加@pytest.mark.usefixtures(“start”) autouse:可以把方法用到每一条测试用例中 fixture带参数传递 场景:测试离不开数据,为了数据灵活,一般数据都是通过参数传的 解决:fixture通过固定参数request传递 步骤:在fixture中增加@pytest.fixture(params=[1,2,3,‘linda’])在方法参数中写request

@pytest.mark.skip(‘不执行此条case’):放在方法上面可以不执行此条用例 @pytest.mark.skipif(sys.platform==‘darwin’,reason=‘不在macOS执行’):通过判断当前系统 给出不执行此条用例的原因

代码语言:javascript
复制
import pytest
# 方法名作为参数
test_user_data = ['jerry','Tome']
@pytest.fixture(scope='module')
def login_r(request):
#     这是接受并传入的参数
user = request.param
print(f"\n 打开首页准备登陆 登陆用户{user}")
return user
@pytest.mark.skip('不执行此条测试用例')
# indirect=True,可以把传过来的参数当作函数执行
@pytest.mark.parametrize("login_r",test_user_data,indirect=True)
def test_case01(login_r):
a = login_r
print(f"测试用例中login的返回值是:{a}")
assert a != ''
if __name__ == '__main__':
pytest.main()

skip使用场景 1.调试时不想运行这个测试用例 2.标记无法在某些平台上运行的测试功能 3.在某些版本中执行,其他版本中跳过 4.当前的外部资源不可用时跳过(如果测试数据是从数据库中取到的,连接数据库的功能如果返回结果未成功就跳过,因为执行也都报错) 解决: @pytest.mark.skip():跳过这个测试用例,可以加条件skipIf,在满足某些条件下才希望通过,否则跳过这个测试 Xfail场景 1.功能测试尚未实施或尚未修复的错误,当测试通过时尽管预计会失败(标记为pytest.mark.xfail),他是一个xpass将在测试摘要中报告 2.你希望测试由于某种情况而就应该失败 解决: @pytest.mark.xfail 使用自定义标记mark只执行某部分用例 场景: 1.只执行符合要求的某一部分用例,可以把一个web项目划分为多个模块,然后指定模块名称执行 2.App自动化时,如果想Android和IOS公用一套代码时,也可以使用标记功能,表明哪些是IOS的用例,哪些是Android的运行时知道mark名称运行就可以 解决:在测试用例方法上添加@pytest.mark.webtest 执行: 1.-s参数:输出所用测试用例的print信息 2.-m:执行自定义标记的相关用例(使用命令执行) pytest -s test.py -m=search pytest -s test.py -m apptest pytest -s test.py -m ‘not ios’ 多线程并行与分布式执行 场景:测试用例1000条,一个测试用例执行一分钟,一个测试人员执行需要1000分钟,通常会用人力成本换取时间成本,加几个让人一起执行,时间就会缩短,如果10个人一起执行只需要1000分钟,这就是一种并行测试,分布式场景。 解决:pytest分布式执行插件:pytest-xdist,多个cpu或主机执行 前提:用例之间都是独立的,没有先后顺序,随机都能执行,可重复执行不影响其他用例。 安装:pip install pytest-xdist 多个CPU并行执行用例,直接-n 3是并行数量:pytest test.py -n 3 在多个终端下一起执行 pytest-html生成测试报告 安装:pip install pytest-httml 生成测试报告:pytest -v -s –html=report.html –self-contained-html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/234993.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年11月1日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档