Gao Fushuai in der Welt der Unit-Tests, Pytest Framework (3) Use Case Marking und Test Execution

Pytest-Anwendungsfallmarkierung und Testausführung

Im vorherigen Artikel haben wir die Vor- und Nachverarbeitungsmethoden sowie den Fixture-Mechanismus von Pytest vorgestellt. In diesem Kapitel werden Ihnen hauptsächlich der Markierungsmechanismus und die Anwendungsfallausführungsmethode in Pytest vorgestellt. pytest kann Daten über Tags an die Testfunktion übergeben oder die ausgeführten Anwendungsfälle über Tags filtern und dann direkt zum Thema wechseln.

1. Integrierte Tags in Pytest

Die Verwendung von Pytest-Markierungen muss über die Markierung pytest.mark erfolgen. In Pytest sind viele Markierungen integriert, um verschiedene Testszenarien zu bewältigen.

1.1. pytest.mark.parametrize: Markierung der Anwendungsfallparametrisierung

Parametrize kann die Anwendungsfalldaten und den Logikcode der Anwendungsfallausführung trennen und automatisch Testfälle basierend auf den Anwendungsfällen generieren.

Demo:

@pytest.mark.parametrize('item',[11,22,33,44,55,66])
def test_demo(item)
	assert item > 50

1.2. pytest.mark.skip: Anwendungsfallausführung überspringen

Mit Skip versehene Anwendungsfälle werden während der Ausführung bedingungslos übersprungen.

Parametergrund: Der Grund für das Überspringen der Testfunktion.

Demo

# 不写跳过原因
@pytest.mark.skip
def test_demo()
	assert item > 50

# 写跳过原因
@pytest.mark.skip(reason='不需要执行')
def test_demo()
	assert item > 50

1.3. pytest.mark.skipif: Anwendungsfälle basierend auf Bedingungen überspringen

Skipif kann basierend auf der Bedingung entscheiden, ob die Ausführung des Testfalls übersprungen werden soll. Wenn die Bedingung wahr ist, wird die Ausführung der Testfunktion übersprungen.

Parameter: Bedingung – Bedingung zum Überspringen

Parameter: reason – Grund für das Überspringen

Demo

a = 10
@pytest.mark.skipif(a > 20,reason='条件不成立,不执行')
def test_demo()
	assert item > 50

1.4. pytest.mark.xfail: Anwendungsfälle markieren, bei denen ein Fehler erwartet wird

xfail kann eine Testfunktion als Testfall markieren, der voraussichtlich fehlschlagen wird.

Parameter: Bedingung – die Bedingung (True/False), um die Testfunktion als xfail zu markieren

Parameter: Grund – der Grund, warum die Testfunktion als xfail markiert wurde

Parameter: löst aus – Ausnahmetypen für erwartete Fehler

Parameter: run — ob die Testfunktion tatsächlich ausgeführt werden soll. Bei False schlägt die Funktion immer fehl und wird nicht ausgeführt.

Parameter: strict – strenger Modus (True/False)

Demo

a = 10
@pytest.mark.xfail(a > 20,reason='条件不成立,不执行' raises=AssertionError )
def test_demo()
	assert item > 50

1.5. pytest.mark.usefixtures: Testvorrichtungen für Testklassen oder -module festlegen

Das Tag usefixtures wird im Allgemeinen verwendet, um Testvorrichtungen für die Testmethoden unter der Testklasse einheitlich festzulegen.

Demo

# TestDome这个测试类的所有测试用例均执行my_fixture这个夹具
@pytest.mark.usefixtures('my_fixture这个夹具')
class TestDome:
    # 函数用例 指定测试夹具
    def test_02(self):
        print('----测试用例:test_01------')

    # 函数用例 指定测试夹具
    def test_03(self):
        print('----测试用例:test_02------')

2. Benutzerdefinierte Tags

pytest支持通过pytest.ini文件注册自定义的标记。以满足执行用例时,通过标记对用例进行筛选.,

2.1、注册标记

pytest.ini文件注册标记的语法如下:

[pytest]

markers =
    标记1
    标记2

2.2、标记函数

Demo:

# 用例前面加载标签:@pytest.mark.标签名  
@pytest.mark.main
 def test_demo():
    pass

2.3、标记类

Demo:

# 方式一:直接类上面打标记
@pytest.mark.main
class TestClass(object):
    def test_demo1(self):
        assert 10 > 20
  
# 方式二:通过类属性pytestmark,可以同时添加多个标记
class TestClass(object):
    pytestmark = [pytest.mark.main, pytest.mark.main]
  
    def test_demo1(self):
        assert 10 > 20

三、通过标记筛选用例执行

Demo:现有用例如下:

import pytest

@pytest.mark.yuze
@pytest.mark.musen
def test_01():
    print("用例一")

def test_02():
    print("用例二")

@pytest.mark.musen
def test_03():
    print("用例三")

@pytest.mark.musen
def test_04():
    print("用例四")

@pytest.mark.yuze
def test_05():
    print("用例五")

@pytest.mark.yuze
def test_06():
    print("用例六")

上面Demo中有6条测试用例,分别通过pytest.mark.yuze和pytest.mark.musen进行标记了,接下来我们一起来看看如何通过标记选择用例执行。

3.1、通过单个标记筛选

语法:pytest -m '标签名'

Demo: pytest -m musen

执行结果如下:

========================== test session starts ==========================
platform win32 -- Python 3.7.3, pytest-5.4.2, py-1.8.0, pluggy-0.13.0
rootdir: C:\project\, inifile: pytest.ini
plugins: allure-pytest-2.8.15, Faker-8.11.0, metadata-1.9.0, parallel-0.0.8, repeat-0.8.0, rerunfailures-9.0, testreport-1.1.2
collected 6 items / 3 deselected / 3 selected                                                                                                               
test_mode.py ...      [100%]
========================== 3 passed, 3 deselected in 0.29s ========================== 

可以看到执行结果执行了3条用例,3条未选中。

3.2、同时选中多个标记

语法:pytest -m "标记1 or 标记2"

命令: pytest -m "musen ro yuze"

执行通过musen或者yuze 标记的的用例。执行结果如下:

========================== test session starts ==========================
platform win32 -- Python 3.7.3, pytest-5.4.2, py-1.8.0, pluggy-0.13.0
rootdir: C:\project\, inifile: pytest.ini
plugins: allure-pytest-2.8.15, Faker-8.11.0, metadata-1.9.0, parallel-0.0.8, repeat-0.8.0, rerunfailures-9.0, testreport-1.1.2
collected 6 items / 1 deselected / 5 selected                                                                                                               
test_mode.py .....      [100%]
========================== 5 passed, 1 deselected in 0.29s ========================== 

从上述结果可以看到,只要加了musen或yuze这两个标记中的任意一个

语法: pytest -m "标记1 and 标记2"

命令: pytest -m "musen and yuze"

执行通过musen和yuze这两个标记同时标记的用例。执行结果如下

========================== test session starts ==========================
platform win32 -- Python 3.7.3, pytest-5.4.2, py-1.8.0, pluggy-0.13.0
rootdir: C:\project\, inifile: pytest.ini
plugins: allure-pytest-2.8.15, Faker-8.11.0, metadata-1.9.0, parallel-0.0.8, repeat-0.8.0, rerunfailures-9.0, testreport-1.1.2
collected 6 items / 5 deselected / 1 selected                                                                                                               
test_mode.py .      [100%]
========================== 1 passed, 5 deselected in 0.29s ========================== 

下一篇跟大家讲解测试报告
下面是我当时学习时用过的部分资料,有需要的朋友可以评论区留言

Supongo que te gusta

Origin blog.csdn.net/a448335587/article/details/132816227
Recomendado
Clasificación