干货 | 一文搞定 pytest 高效率测试框架(二)
2023-02-28 创业
选定以内对等
fixture 上面有一给定差值 scope,通过 scope 可以控制 fixture 的起到以内,根据起到以内尺寸分界:session> module> class> function,具体情况起到以内如下:
function formula_或者原理级别都不会被命令行 class 类级别命令行一次 module 可选级别命令行一次 session 是多个明文命令行一次(可以一环.py明文命令行,每个.py明文就是module)例如整个可选有多条迭代,所需在全部用例可执行在此之前推开网页,全部可执行剩便去停止网页,推开和停止操纵只可执行一次,如果每次都更进一步可执行推开操纵,不会非常占用管理系统资源。这种桥段除了setup_module,teardown_module 可以发挥起到,还可以通过另设可选级别的 fixture 装饰性机(@pytest.fixture(scope="module"))来发挥起到。
scope='module'
fixture 数差值 scope='module',module 起到是整个可选都不会生效。
建立明文名为 test_fixture_scope.py,标识符如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pytest
# 起到域:module是在可选在此之前可执行, 可选便可执行
@pytest.fixture(scope="module")
def open():
print("推开网页")
yield
print("可执行teardown !")
print("最终停止网页")
@pytest.mark.usefixtures("open")
def test_search1():
print("test_search1")
raise NameError
pass
def test_search2(open):
print("test_search2")
pass
def test_search3(open):
print("test_search3")
pass
标识符解析:
@pytest.fixture() 如果不所写数差值,数差值可选 scope='function'。当 scope='module' 时,在也就是说 .py 脚本上面所有的用例开始前只可执行一次。scope 机智与 yield 组合运用做,相等于 setup 和 teardown 原理。还可以运用做 @pytest.mark.usefixtures 装饰性机,的传播前置formula_名作为数差值。
接入结果如下:
plugins: html-2.0.1, rerunfailures-8.0,
xdist-1.31.0, ordering-0.6, forked-1.1.3,
allure-pytest-2.8.11, metadata-1.8.0
collecting ... collected 3 items
test_fixture_yield.py::test_search1 推开网页
FAILED [ 33%]test_search1
test_fixture_yield.py:13 (test_search1)
open = None
def test_search1(open):
print("test_search1")
> raise NameError
E NameError
test_fixture_yield.py:16: NameError
test_fixture_yield.py::test_search2 PASSED
[ 66%]test_search2
test_fixture_yield.py::test_search3 PASSED
[100%]test_search3
可执行teardown !
最终停止网页
open = None
def test_search1(open):
print("test_search1")
> raise NameError
E NameError
test_fixture_yield.py:16: NameError
------ Captured stdout setup --------
推开网页
----- Captured stdout call -----
test_search1
===== 1 failed, 2 passed in 0.06s =====
Process finished with exit code 0
从上会接入结果可以说明了,scope="module" 与 yield 结合,相等于 setup_module 和 teardown_module 原理。整个可选接入在此之前命令行了 open()原理在此之前 yield 在后的列印输出“推开网页”,整个接入便命令行了 yield 上面的列印语句“可执行 teardown !”与“停止网页”。yield 来唤醒 teardown 的可执行,如果用例出现反常,不受到影响 yield 上面的 teardown 可执行。可以运用做 @pytest.mark.usefixtures 装饰性机来来进行原理的的传播。
conftest.py 明文
fixture scope 为 session 级别是可以一环 .py 可选命令行的,也就是当我们有多个 .py 明文的用例时,如果多个用例只需命令行一次 fixture,可以将 scope='session',并且所写到 conftest.py 明文底下。所写到 conftest.py 明文可以全局命令行这上面的原理。运用做的时候不所需新增 conftest.py 这个明文。运用做 conftest.py 的原则上:
conftest.py 这个明文名是固定的,不可以改成。 conftest.py 与接入用例在同一个打包下,并且该打包在此之前有 init.py 明文 运用做的时候不所需新增 conftest.py,pytest 不会基本新功能识别系统到这个明文 置放工程项目的根第一版下可以全局命令行,置放某个 package 下,就在这个 package 内有效性。与此相关
在接入整个工程项目下的所有的用例,只可执行一次推开网页。可执行剩所有的用例便便可执行停止网页,可以在这个工程项目下建立一个 conftest.py 明文,将推开网页操纵的原理放在这个明文下,并掺入一个装饰性机 @pytest.fixture(scope="session"),就能够发挥起到整个工程项目所有迭代的网页复用,与此相关第一版结构上如下:
建立第一版 test_scope,并在第一版下建立三个明文 conftest.py,test_scope1.py 和 test_scope2.py。
conftest.py 明文判别了公共原理,pytest 不会基本新功能拷贝到 conftest.py 判别的原理,标识符如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pytest
@pytest.fixture(scope="session")
def open():
print("推开网页")
yield
print("可执行teardown !")
print("最终停止网页")
建立 test_scope1.py 明文,标识符如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pytest
def test_search1(open):
print("test_search1")
pass
def test_search2(open):
print("test_search2")
pass
def test_search3(open):
print("test_search3")
pass
if _name_ == '_main_':
pytest.main()
建立明文“test_scope2.py”,标识符如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
class TestFunc():
def test_case1(self):
print("test_case1,所需登记")
def test_case2(self):
print("test_case2,不所需登记 ")
def test_case3(self):
print("test_case3,所需登记")
推开 cmd,进入第一版 test_scope/,可执行如下命令:
pytest -v -s
或者
pytest -v -s test_scope1.py test_scope2.py
可执行结果如下:
请注意...
collected 6 items
test_scope1.py::test_search1 推开网页
test_search1
PASSED
test_scope1.py::test_search2 test_search2
PASSED
test_scope1.py::test_search3 test_search3
PASSED
test_scope2.py::TestFunc::test_case1 test_case1,所需登记
PASSED
test_scope2.py::TestFunc::test_case2 test_case2,不所需登记
PASSED
test_scope2.py::TestFunc::test_case3 test_case3,所需登记
PASSED可执行teardown !
最终停止网页
请注意上面列印结果...
可执行反复在此之前 pytest 不会基本新功能识别系统也就是说第一版的 conftest.py,不所需新增必要引用上面的原理配备。系统设计到整个第一版下的所有命令行这上面的原理在此之前可执行。conftest.py 与接入的用例要在同一个 pakage 下,并且这个打包下有 _init_.py 明文
基本新功能可执行 fixture
如果每条迭代都所需掺入 fixture 新功能,则所需在每一要用例原理上面的传播这个fixture的人名,这底下就可以在装饰性机上面掺入一给定差值 autouse='true',它不会基本新功能系统设计到所有的的测试原理在此之前,只是这底下无法办法返回差值给迭代。
运用做原理,在原理在后突显装饰性机,如下:
@pytest.fixture(autouse="true")
def myfixture():
print("this is my fixture")
@pytest.fixture 底下另设 autouse 数差值差值为 true(可选 false),每个的测试formula_都不会基本新功能命令行这个前置formula_。
建立明文名为“test_autouse.py”,标识符如下:
# coding=utf-8
import pytest
@pytest.fixture(autouse="true")
def myfixture():
print("this is my fixture")
class TestAutoUse:
def test_one(self):
print("可执行test_one")
assert 1 + 2 == 3
def test_two(self):
print("可执行test_two")
assert 1 == 1
def test_three(self):
print("可执行test_three")
assert 1 + 1 == 2
可执行上会这个的测试明文,结果如下:
test_a.py::TestAutoUse::test_one this is my fixture
可执行test_one
PASSED
test_a.py::TestAutoUse::test_two this is my fixture
可执行test_two
PASSED
test_a.py::TestAutoUse::test_three this is my fixture
可执行test_three
PASSED
从上会的接入结果可以说明了,在原理 myfixture() 上会掺入了装饰性机 @pytest.fixture(autouse="true"),迭代无须的传播这个 fixture 的人名,它不会基本新功能在每条用例在此之前可执行这个 fixture。
fixture 传递数差值
的全尺寸在此之前所需大量的的测试资料,如果每条的测试资料都编所写一条迭代,用例数量将是非常宠大的。一般我们在的全尺寸在此之前不会将的测试用到的资料以数差值的表达方式为的传播到迭代在此之前,并为每条的测试资料填充一个的测试结果资料。
这时候可以运用做 fixture 的数差值解构新功能,在 fixture 原理突显装饰性机 @pytest.fixture(params=[1,2,3]),就不会的传播三给定据 1、2、3,分别将这三给定据的传播到用例当在此之前。这底下可以的传播的资料是个列表。的传播的资料所需运用做一个固定的数差值名 request 来接收。
建立明文名为“test_params.py”,标识符如下:
import pytest
@pytest.fixture(params=[1, 2, 3])
def data(request):
return request.param
def test_not_2(data):
print(f"的测试资料:{data}")
assert data
接入结果如下:
test_params.py::test_not_2[1]PASSED [ 33%]的测试资料:1
test_params.py::test_not_2[2] PASSED [ 66%]的测试资料:2
test_params.py::test_not_2[3] PASSED [100%]的测试资料:3
从接入结果可以说明了,对于 params 上面的每个差值,fixture 都不会去命令行可执行一次,运用做 request.param 来给予用例数差值解构的资料,并且为每一个的测试资料填充一个的测试结果。在的测试管理工作在此之前运用做这种数差值解构的方式为,不会减低大量的标识符量,并且便于阅读与维护。
多虚拟机并行与分布式可执行
假如工程项目在此之前有迭代 1000 条,一条迭代所需可执行 1 分钟,一个Beta所需 1000 分钟才能已剩成一轮复出的测试。往往我们不会用机具成本换取一段时间成本,加几个人一同可执行,一段时间就不会缩短。如果 10 人一同可执行只所需 100 分钟,这就是一种并行的测试,分布式的桥段。
pytest-xdist 是 pytest 分布式可执行该软件,可以多个 CPU 或DS可执行,这款该软件允许服务机将的测试并作可执行(多线程级并作),该软件是特性决定迭代可执行依次的,为了确保各个的测试能在各个独立虚拟机底下正确的可执行,应该确保迭代的独立性(这也符合迭代设计的最佳倡导)。
加装
pip install pytest-xdist
多个 CPU 并行可执行用例,所需在 pytest 上面掺入 -n 数差值,如果数差值为 auto,不会基本新功能检测管理系统的 CPU 数目。如果数差值为数字,则选定接入的测试的处理机多线程数。
pytest -n auto
pytest -n [num]
与此相关
某个工程项目有 200 条迭代,每条迭代彼此之间无法关联关系,互不受到影响。这 200 条迭代所需在 1 全程以内的测试已剩成,可以加个-n数差值,运用做多 CPU 并行的测试。接入原理:
pytest -n 4
进入到工程项目第一版下,可执行 pytest 可以将工程项目第一版下所有迭代识别系统出来并且接入,突显 -n 数差值,可以选定 4 个 CPU 并作可执行。大量的迭代并作可执行提速非常明显。
结合 pytest-html 填充市售
市售往往在工程项目在此之前尤为重要,通报可以展现出Beta的管理工作量,开发计划人员可以从市售在此之前了解局限性的情况,因此市售在的全尺寸在此之前的独立性至关重要,市售为纠正应用程序假定的质量情况对等依据,为应用程序验收和交付作准备。市售根据段落的着重于,可以统称 “旧版市售” 和 “说明了市售”。可执行剩 pytest 迭代,可以运用做 pytest-HTML 该软件填充 HTML 格式的市售。
加装
pip install pytest-html
可执行原理
pytest --html=path/to/html/report.html
结合 pytest-xdist 运用做
pytest -v -s -n 3 --html=report.html --self-contained-html
填充市售
如下图:
填充的市售最终是 HTML 格式,通报段落除此以外末尾、接入一段时间、环境、汇说明了果以及用例的通过给定、跳过给定、不甘心给定、正确给定,期望不甘心给定、不期望通过给定、更进一步接入给定、以及正确的详细资料展出信息。通报不会填充在接入脚本的同一偏移,所需选定偏移掺入--html=path/to/html/report.html 这给定差值配备通报的偏移。如果不掺入 --self-contained-html 这给定差值,填充通报的 CSS 明文是独立的,回馈的时候难以千万资料丢失。
pytest 框架 assert 论断运用做(附)
编所写标识符时,我们经常不会做出一些断言,论断就是用做在标识符在此之前捕捉这些断言。论断指出为一些格拉给定,Beta往往不会加一些论断来得出结论在此之前间反复的正确性。论断支持显示最常见的子给定的差值,除此以外命令行,属性,更为以及二元和一元操作符。Python运用做 assert(论断)用做判断一个给定,在给定情况下为 false 的时候触发反常。
运用做原理:
assert True #论断为真
assertnot False #论断为假
与此相关如下:
assert "h" in "hello" #判断h在hello在此之前
assert 5>6 #判断5>6为真
assert not True #判断xx不为真
assert {'0', '1', '3', '8'} == {'0', '3', '5', '8'} #判断两个字典相等
如果无法论断,无法办法判为用例在此之前每一个的测试必需结果的正确性。在工程项目在此之前适当的运用做论断,来对标识符的结构上、属性、新功能、安全性等桥段检测与的测试。
以上,更多 Python 的测试开发计划实战初阶技能,推荐自学《Python 的测试开发计划实战初阶》课程。
⬇️ 拷贝“右方重定向”,提升的测试架构竞争力!
>>更多架构技术文章回馈和免费文献资料领取
_id=qrcodeBellfrom=souhuBelltimestamp=1650330644
。艾得辛和甲氨蝶呤哪个效果好吉林牛皮癣治疗医院
梅州白癜风医院哪家正规
沈阳肛肠医院地址
广东妇科医院哪家比较专业
- 02-10智能图像分析-智能服饰太阳帽遮阳帽图像目标检测统计计数检测与定位-艾科瑞特
- 02-10金油神策:金子降温回踩结束 原油日线六连阴
- 02-10狮子座:2024上半年要注意2个人,人心叵测,远离为好,动机不纯
- 02-10什么样的手机才是真香通用性?价格便宜并非重点,关键在于功能
- 02-10收评:港股恒指跌0.85% 恒生科指跌1.84%、半导体、的产品概念股下挫
- 02-10时间越长,越不容易心动的星座:为爱情后悔的年纪,早就过去了
- 02-10Win11最新预览版Build 25197 ISO举例来说发布:官方免费下载
- 02-10文承凯:黄金市场迎来小非农 今日走势操作者建议
- 02-10震撼在世界上!陈幸同燃爆保加利亚赛场强势横扫对手,迎接世乒赛
- 02-10百度“使用检测车位方法”专利获授权,涉及自主泊车技术