当测试用例在多个环境中运行时,我们如何为一个环境发送测试用例?

2024-05-13 03:23:37 发布

您现在位置:Python中文网/ 问答频道 /正文

作为背景,我们的测试用例在同一产品的20多个部署中运行,在其中一些部署中,测试用例由于已知错误而失败,而在另一些部署中,测试用例通过

任何人都可以为一个特定的环境提供一个最好的“xfail”测试用例的建议吗

我们已经可以通过envfixture甚至函数调用访问特定测试运行所针对的环境。我们只需要一种干净且合乎逻辑的方法来完成xfail测试。我们希望这样做:

我们想要什么(或类似的东西,有装饰师)

@pytest.mark.xfail(envs=["my_env_1", "my_env_18"], reason="Bug/JIRA-TICKET")
def test_my_test_case(...fixtures...):
   # some code

我们当前的解决方案: 这感觉很不舒服

def test_my_test_case(env, ...fixtures...):
   if env in ["my_env_1", "my_env_18"]:
      pytest.xfail(reason="Bug/Ticket-Number")

欢迎任何建议。谢谢大家!


Tags: testenv环境pytestmy部署def测试用例
2条回答

为此,您可以引入自己的标记。例如:

测试用例

import pytest


@pytest.mark.myxfail(envs=["my_env_1", "my_env_18"], reason="Bug/JIRA-TICKET")
def test_eggs():
    pass

分析myxfail标记

使用以下内容将文件conftest.py添加到项目/测试根目录中:

import pytest


@pytest.fixture(autouse=True)
def check_myxfail(request):
    myxfail = request.node.get_closest_marker("myxfail")
    if myxfail is None:
        return

    envs = myxfail.kwargs.get("envs", [])
    if "my_env_1" in envs:
        reason = myxfail.kwargs.get("reason", None)
        pytest.xfail(reason=reason)

寄存器myxfail标记

pytest.ini配置中:

[pytest]
markers =
    myxfail: xfail the test if env matches.

样本执行

$ pytest -vrx
==================================== test session starts =====================================
...
collected 1 item                                                                             

test_spam.py::test_eggs XFAIL                                                          [100%]

================================== short test summary info ===================================
XFAIL test_spam.py::test_eggs
  reason: Bug/JIRA-TICKET
===================================== 1 xfailed in 0.04s =====================================

当然,您仍然必须自己实现env处理。用您自己的impl替换if "my_env_1" in envs条件(通过fixture/命令行arg等传递env

仅为了完整性-您还可以直接向xfail添加条件,例如:

def env():
    return "my_env_1"


@pytest.mark.xfail(condition=env() in ["my_env_1", "my_env_18"],
                   reason='Bug/JIRA-TICKET')
def test_eggs():
    assert False

(与@hoefling回答中的设置相同)

这将产生相同的输出:

============================= test session starts =============================
...
collected 1 item

test_setup.py::test_eggs xfail                                           [100%]
=========================== short test summary info ===========================
XFAIL test_setup.py::test_eggs
  Bug/JIRA-TICKET

========================== 1 xfailed in 0.12 seconds ==========================

诚然,这没有公认的答案那么好,但可以用于简单的情况

相关问题 更多 >