IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> pytest学习总结2.4及2.5 - 参数化和mark标记 -> 正文阅读

[游戏开发]pytest学习总结2.4及2.5 - 参数化和mark标记

2.4 mark 标记被测函数

以下是mark的一些内置结构的标记物:

  • usefixtures - 在测试功能或类上使用固定装置
  • filterwarnings - 过滤了一个测试函数的某些警告
  • skip - 始终跳过一个测试函数
  • skipif - 如果满足某个条件,则跳过一个测试函数
  • xfail - 如果满足某一条件,则产生“预期失败”结果
  • parametrize - 对同一个测试函数执行多个调用。
  • 创建自定义标记或将标记应用于整个测试类或模块都很容易。这些标记可以被插件使用,也通常用于在使用-m选项的命令行上选择测试。
    注意:mark标记只能应用于被测函数,对固定装置没有影响

2.4.1 注册标记

您可以像这样在您的pytest.ini文件中注册自定义标记:

[pytest]
markers =
    slow: marks tests as slow (deselect with '-m "not slow"')
    serial

2.4.2 引发未知标记上的错误

添加addopts = --strict-markers,项目中只要有未知的标记,执行就会报错,如下设置:

[pytest]
addopts = --strict-markers
markers =
    slow: marks tests as slow (deselect with '-m "not slow"')
    serial

2.5 参数化固定装置、测试函数

Pytest可以在以下几个级别上实现测试参数化:

  • pytest.fixture() 允许 parametrize fixture functions
  • @pytest.mark.parametrize 定义多组参数、固定装置在测试函数、类上面
  • pytest_generate_tests 允许用户定义自定义参数化方案或扩展。

2.5.1 参数化测试函数:@pytest.mark.parametrize

2.5.1.1 @parametrize 装饰器定义了三个不同的元组

@parametrize 装饰器定义了三个不同的(test_input,expected)元组,以便test_eval函数将依次使用它们运行三次:

# content of test_expectation.py
import pytest
@pytest.mark.parametrize("test_input,expected", [("3+5", 8), ("2+4", 6), ("6*9", 42)])
def test_eval(test_input, expected):
    assert eval(test_input) == expected
C:\Users\Desktop\python>pytest test_expectation.py
================================================== test session starts ===================================================
platform win32 -- Python 3.8.0, pytest-6.2.5, py-1.11.0, pluggy-1.0.0
rootdir: C:\Users\X21201\Desktop\python
collected 3 items                                                                                                         
test_expectation.py ..F                                                                                             [100%]
======================================================== FAILURES ========================================================
___________________________________________________ test_eval[6*9-42] ____________________________________________________
test_input = '6*9', expected = 42
    @pytest.mark.parametrize("test_input,expected", [("3+5", 8), ("2+4", 6), ("6*9", 42)])
    def test_eval(test_input, expected):
>       assert eval(test_input) == expected
E       AssertionError: assert 54 == 42
E        +  where 54 = eval('6*9')
test_expectation.py:7: AssertionError
================================================ short test summary info =================================================
FAILED test_expectation.py::test_eval[6*9-42] - AssertionError: assert 54 == 42
============================================== 1 failed, 2 passed in 0.07s ===============================================

2.5.1.2 在类或模块上使用参数化标记

import pytest
@pytest.mark.parametrize("n,expected", [(1, 2), (3, 4)])
class TestClass:
    def test_simple_case(self, n, expected):
        assert n + 1 == expected
    def test_weird_simple_case(self, n, expected):
        assert (n * 1) + 1 == expected
collected 4 items                                                                                                                                                                       
test_expectation.py::TestClass::test_simple_case[1-2] PASSED
test_expectation.py::TestClass::test_simple_case[3-4] PASSED
test_expectation.py::TestClass::test_weird_simple_case[1-2] PASSED
test_expectation.py::TestClass::test_weird_simple_case[3-4] PASSED

2.5.1.3 参数化一个py文件中所有测试

import pytest
pytestmark = pytest.mark.parametrize("n,expected", [(1, 2), (3, 4)])
class TestClass:
    def test_simple_case(self, n, expected):
        assert n + 1 == expected
    def test_weird_simple_case(self, n, expected):
        assert (n * 1) + 1 == expected
class TestDemo:
    def test_simple_case_001(self, n, expected):
        assert n + 1 == expected
collected 6 items                                                                                                                                                                       
test_expectation.py::TestClass::test_simple_case[1-2] PASSED
test_expectation.py::TestClass::test_simple_case[3-4] PASSED
test_expectation.py::TestClass::test_weird_simple_case[1-2] PASSED
test_expectation.py::TestClass::test_weird_simple_case[3-4] PASSED
test_expectation.py::TestDemo::test_simple_case_001[1-2] PASSED
test_expectation.py::TestDemo::test_simple_case_001[3-4] PASSED

2.5.1.4 参数化中标记单个测试实例:使用 mark.xfail:

import pytest
@pytest.mark.parametrize("test_input,expected",[("3+5", 8), ("2+4", 6), pytest.param("6*9", 42, marks=pytest.mark.xfail)],)
def test_eval(test_input, expected):
    assert eval(test_input) == expected
collected 3 items                                                                                                                                                                                                                             
test_expectation.py::test_eval[3+5-8] PASSED
test_expectation.py::test_eval[2+4-6] PASSED
test_expectation.py::test_eval[6*9-42] XFAIL

2.5.1.5 参数的所有组合:堆叠参数化装饰器

import pytest
@pytest.mark.parametrize("x", [0, 1])
@pytest.mark.parametrize("y", [2, 3])
def test_foo(x, y):
    pass
collected 4 items                                                                                                                                                                     
test_expectation.py::test_foo[2-0] PASSED
test_expectation.py::test_foo[2-1] PASSED
test_expectation.py::test_foo[3-0] PASSED
test_expectation.py::test_foo[3-1] PASSED

2.5.2 pytest_generate_tests 示例

有时,您可能想要实现您自己的参数化方案,或实现一些动态来确定一个设备的参数或范围。为此,您可以使用在收集测试函数时调用的pytest_generate_tests钩子

# content of conftest.py
def pytest_addoption(parser):
    parser.addoption(
        "--stringinput",
        action="append",
        default=[],
        help="list of stringinputs to pass to test functions",
    )
def pytest_generate_tests(metafunc):
    if "stringinput" in metafunc.fixturenames:
        metafunc.parametrize("stringinput", metafunc.config.getoption("stringinput"))
# content of test_strings.py
def test_valid_string(stringinput):
    assert stringinput.isalpha()

执行测试,动态指定参数:

pytest --stringinput="hello" --stringinput="world" test_strings.py -vs
pytest -q -rs test_strings.py
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-04-09 18:49:29  更:2022-04-09 18:52:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/16 21:05:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码