首页 >> 创业 >> 干货 | 一文搞定 pytest 高效率测试框架(二)

干货 | 一文搞定 pytest 高效率测试框架(二)

2023-02-28 创业

以说明了,test_case1 和 test_case3 接入在此之前可执行了 login 原理,test_case2 无法可执行这个原理。

选定以内对等

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

艾得辛和甲氨蝶呤哪个效果好
吉林牛皮癣治疗医院
梅州白癜风医院哪家正规
沈阳肛肠医院地址
广东妇科医院哪家比较专业
友情链接