繁体   English   中英

Pytest:为未参数化的测试提供 id

[英]Pytest: provide id to un-parameterized test

我想要一个与我运行的任何 pytest 相关联的id ,无论是否参数化。 有没有办法为未参数化的测试提供一个 id,使得 nodeid 看起来像my_test[my_id]即与参数化测试一致的东西?

除了parametrize之外,没有针对此的内置机制——也就是说,您可以通过修改函数的模块范围名称来构建一个模拟它的东西:

def test_thing(): pass

# need to use `globals()` since `[` isn't a valid identifier
globals()['test_thing[my_id]'] = test_thing
# delete the old test so it isn't run
del test_thing
$ pytest -v t3.py 
...
collected 1 item                                                               

t3.py::test_thing[my_id] PASSED                                          [100%]

============================== 1 passed in 0.00s ===============================

或者也许一个神奇的装饰器更适合你的风格:

import sys

def name_test(testid):
    def decorator(func):
        setattr(sys.modules[func.__module__], testid, func)
        return None  # need to avoid double-discovery
    return decorator


@name_test('test_thing[my_id]')
def test_thing():
    pass
$ pytest -v t2.py
...
collected 1 item                                                               

t2.py::test_thing[my_id] PASSED                                          [100%]

============================== 1 passed in 0.00s ===============================

但是,使用参数化来执行此操作有一个相当简单且不那么笨拙的方法:

import pytest

@pytest.mark.parametrize('_', (pytest.param(0, id='my_id'),))
def test_thing(_): pass

这将创建一个带有自定义 id 的参数化案例,选择_是因为未使用该值


免责声明:我是 pytest 核心开发人员

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM