Python pytest测试框架详解

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

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执行’):通过判断当前系统 给出不执行此条用例的原因

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()

Jetbrains全家桶1年46,售后保障稳定

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.net/234993.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 8大轻型网管工具,网络管理好帮手「建议收藏」

    8大轻型网管工具,网络管理好帮手「建议收藏」  从设备发现到系统、网络和流量可视性,这些轻型的网管工具非常实用。在网络和服务器世界,重点是可视性、可视性、可视性,如果你不知道你的网络和服务器在每天每秒正在做什么,你很可能会出问题。幸运的是,这里有很多好工具(商业和开源工具)来帮助你满足需求。  在本文中我们提供了一些很好用的网管工具,这些工具适合各种规模的网络。从网络和服务器监控到趋势、图形,甚至是交换和路由器配置备份,这些工具都可以帮…

    2022年10月6日
    0
  • pycharm激活码一年[在线序列号]

    pycharm激活码一年[在线序列号],https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    52
  • 在事务中执行批量复制操作SqlBulkCopy,SqlTransaction「建议收藏」

    在事务中执行批量复制操作SqlBulkCopy,SqlTransaction「建议收藏」    MicrosoftSQLServer包含名为bcp的常用命令行应用程序,用于快速将大文件批量复制到SQLServer数据库的表或视图中。使用SqlBulkCopy类可以编写提供类似功能的托管代码解决方案。还可以通过其他方式将数据加载到SQLServer表中(例如INSERT语句),但是SqlBulkCopy提供的性能要明显优于这些方式。   

    2022年5月8日
    151
  • h2数据库连接mysql_H2数据库简单使用操作「建议收藏」

    h2数据库连接mysql_H2数据库简单使用操作「建议收藏」h2database官网下载客户端控制台h2databaseMaven配置com.h2databaseh21.4.1991控制台新建数据库与连接数据库1.1建库windows系统下点击h2/bin/h2.bat启动控制台应用程序鼠标右键点击桌面右下角图标Createanewdatabase…例如在k盘h2目录下新建helloForm数据库,则填写路径为k:/h2/helloForm…

    2022年8月31日
    4
  • 安卓系统 第三方_第三方os

    安卓系统 第三方_第三方os安卓系统因其开源开放的特点,短短几年间就迅速占据了手机操作系统的大半的市场份额,Android平台提供给第三方开发商一个十分宽泛、自由的环境,不会受到各种条条框框的阻扰,因此也出现了许许多多的基于安卓

    2022年8月4日
    5
  • python字典详解_python字典取值

    python字典详解_python字典取值字典字典的key和value一一对应的,字典是可变的,也是有序的(python3.6版本开始字典有序),可迭代的增加元素当key不存在时,直接赋值a={"status"

    2022年7月29日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号