首页 >> 社会

干货 | 一文搞定 pytest 自动控制测试框架(二)

时间:2022-08-04 12:17:43

和 test_case3 运营以前监督了 login 作法,test_case2 从未监督这个作法。

指明范围内内海洋资源共享

fixture 那时候面有一个变量 scope,通过 scope 可以控制 fixture 的依赖性范围内,根据依赖性范围内大小划分:session> module> class> function,具体依赖性范围内如下:

function 变量或者作法级别均不会被绑定 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 装饰物缓冲器,的传播四轮驱动变量名作为变量。

运营结果如下:

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),每个次测试变量均不会则不会绑定这个四轮驱动变量。

创始明文名为“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 分钟,一个次早先必须 1000 分钟才能剩成一轮回归次测试。并不一定我们不会用亟需成本换来小时成本,加有几个人一起监督,小时就不会延长。如果 10 人一起监督只必须 100 分钟,这就是一种依此次测试,分布式的桥段。

pytest-xdist 是 pytest 分布式监督应用程序,可以多个 CPU 或伺服器监督,这款应用程序强制用户将次测试都将监督(进程级都将),应用程序是自适应决定次迭代监督顺序的,为了确保各个次测试能在各个单一线程那时候正确的监督,应该确保次迭代的单一性(这也具备次迭代其设计的最佳实践)。

安装

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 填充的次测试

的次测试并不一定在新项目那时候面尤为重要,调查报告可以体现次早先的临时工生产量,JavaScript可以从的次测试那时候面了解缺失的情形,因此的次测试在次测试现实生活那时候面的地位至关重要,的次测试为纠正硬件存在的质生产量问题给予依据,为硬件验收和交付肇始。的次测试根据内容的侧重点,可以分为 “版本的次测试” 和 “论述的次测试”。监督剩 pytest 次迭代,可以常用 pytest-HTML 应用程序填充 HTML PNG的的次测试。

安装

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 PNG,调查报告内容包含标题、运营小时、环境、汇论述果以及用例的通过给定、跳过给定、失败给定、正确给定,期望失败给定、不期望通过给定、重新运营给定、以及正确的详细展示出的资讯。调查报告不会填充在运营程序员的同一正向,必须指明正向替换成---html=path/to/html/report.html 这个变量可用调查报告的正向。如果不替换成 ---self-contained-html 这个变量,填充调查报告的 CSS 明文是单一的,社交的时候容易千万原始数据被窃。

pytest 框架 assert 无论如何常用(则有)

汇编编译器时,我们经常不会做出一些所谓设,无论如何就是用作在编译器那时候面捕捉这些所谓设。无论如何表示为一些布鲁克表达式,次早先并不一定不会加有一些无论如何来推断出那时候面间现实生活的正确性。无论如何支持辨识最常见的子表达式的值,包含绑定,表征,比较以及二元和一元运算符。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=qrcodeCofrom=souhuCotimestamp=1650330644

汕头妇科检查
北京妇科医院挂号
合肥看不孕不育去哪里
免疫细胞治疗公司
国内nk细胞疗法权威
友情链接: