python - 是否可以@mark.parametrize 一次测试两次?

标签 python testing pytest fixtures parametrized-testing

我有多个函数可以引发 ValueError 来测试。到目前为止,我的解决方案是:

import pytest
import record

@pytest.fixture(name='raised')
def is_value_error_raised(func, args):
    try:
        func(*args)
        return True
    except ValueError:
        return False


@pytest.mark.parametrize(('func', 'args', 'expected'),
                         ((record.check_length, ('Test', 1, 100), True),
                          (record.check_length, ('', 1, 100), False),
                          ))
def test_length_check(raised, expected):
    assert raised == expected


@pytest.mark.parametrize(('func', 'args', 'expected'),
                         ((record.check_lang_code, ['EN'], True),
                          (record.check_lang_code, ['Test'], False),
                          ))
def test_lang_check(raised, expected):
    assert raised == expected

但在这种方法中,我在每个测试用例中重复函数名称。我试着摆脱它。我想知道是否有可能制作类似于:

@pytest.mark.parametrize(('func', record.check_lang_code))
@pytest.mark.parametrize(('args', 'expected'),
                         ((['EN'], True),
                          (['Test'], False),
                          ))
def test_lang_check(raised, expected):
    assert raised == expected

这会产生 ValueError。有没有办法使用两个参数化标记相互配合?如果不是,我该如何更正此代码?

最佳答案

我通过将测试函数与 fixture 内的测试元素映射来解决了我的问题。无论如何,我仍然想知道是否有可能使用双重参数化来达到同样的效果。其他更优雅的解决方案将不胜感激。

import pytest
import record

@pytest.fixture(name='raised')
def is_value_error_raised(request, args):
    try:
        test_name = request.node.function.__name__
        {'test_length_check': record.check_length,
         'test_lang_check': record.check_lang_code,
        }[test_name](*args)
        return True
    except ValueError:
        return False


@pytest.mark.parametrize(('args', 'expected'), (
        (('Test', 1, 100), True),
        (('', 1, 100), False),
))
def test_length_check(raised, expected):
    assert raised == expected


@pytest.mark.parametrize(('args', 'expected'), (
        (['EN'], True),
        (['Test'], False),
))
def test_lang_check(raised, expected):
    assert raised == expected

关于python - 是否可以@mark.parametrize 一次测试两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61540283/

相关文章:

无限生成器的Python产品

python - 使用networkx从距离矩阵生成图: inconsistency - Python

javascript - 如何在 Node.js 测试中关闭 net.Server?

python - Py.test 跳过消息不显示在 Jenkins 中

python - 当一行中有 ddd 时,正则表达式模式仅获取 3 位数值

访问 cv2.VideoCapture(0) 的 Python 意外退出

ruby-on-rails - 如何在删除:destroy in Rails?中传递ID

.net - ASP.NET MVC 和测试驱动开发

Pytest Finalizers - 执行顺序

python - 从 Python 中删除现有 Pod 的简单方法