Python pytest测试框架详解

2022-11-15 11:02:33 浏览数 (3)

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

1 人点赞