当前位置: 首页 > 面试题库 >

如果一个测试失败,如何跳过该类中的其余测试?

宋明亮
2023-03-14
问题内容

我正在使用Jenkins,Python,Selenium2(webdriver)和Py.test框架为网络测试创建测试用例。

到目前为止,我正在按照以下结构组织测试:

每个 测试用例 ,每个 test_ 方法是一个 测试步骤

当一切正常时,此设置非常有用,但是当一个步骤崩溃时,其余的“测试步骤”就会发疯。我可以借助来将故障包含在类(测试用例)中teardown_class(),但是我正在研究如何改进它。

我需要的是,test_如果其中一个方法失败,则以某种方式跳过(或xfail)一个类中的其余方法,以使其余测试用例不运行并标记为FAILED(因为这将是假肯定)

谢谢!

更新: 我没有寻找或答案“这是不好的做法”,因为这样称呼是非常有争议的。(每个测试类都是独立的-这就足够了)。

更新2: 在每个测试方法中都添加“如果”条件不是一个选择-
这是很多重复的工作。我正在寻找的是(也许)有人知道如何使用钩子连接类方法。


问题答案:

我喜欢一般的“测试步骤”构想。我将其称为“增量”测试,在功能测试方案恕我直言中最有意义。

这是一个不依赖pytest内部细节的实现(官方钩子扩展除外)。复制到您的conftest.py

import pytest

def pytest_runtest_makereport(item, call):
    if "incremental" in item.keywords:
        if call.excinfo is not None:
            parent = item.parent
            parent._previousfailed = item

def pytest_runtest_setup(item):
    previousfailed = getattr(item.parent, "_previousfailed", None)
    if previousfailed is not None:
        pytest.xfail("previous test failed (%s)" % previousfailed.name)

如果您现在有一个像这样的“ test_step.py”:

import pytest

@pytest.mark.incremental
class TestUserHandling:
    def test_login(self):
        pass
    def test_modification(self):
        assert 0
    def test_deletion(self):
        pass

然后运行,如下所示(使用-rx报告xfail原因):

(1)hpk@t2:~/p/pytest/doc/en/example/teststep$ py.test -rx
============================= test sesshtml" target="_blank">ion starts ==============================
platform linux2 -- Python 2.7.3 -- pytest-2.3.0.dev17
plugins: xdist, bugzilla, cache, oejskit, cli, pep8, cov, timeout
collected 3 items

test_step.py .Fx

=================================== FAILURES ===================================
______________________ TestUserHandling.test_modification ______________________

self = <test_step.TestUserHandling instance at 0x1e0d9e0>

    def test_modification(self):
>       assert 0
E       assert 0

test_step.py:8: AssertionError
=========================== short test summary info ============================
XFAIL test_step.py::TestUserHandling::()::test_deletion
  reason: previous test failed (test_modification)
================ 1 failed, 1 passed, 1 xfailed in 0.02 seconds =================

我在这里使用“ xfail”,因为跳过是针对错误的环境或缺少依赖项,错误的解释器版本。

编辑:请注意,您的示例和我的示例都无法直接用于分布式测试。为此,pytest-
xdist插件需要发展一种方法来定义要整体出售给一个测试从属的组/类,而不是通常将类的测试功能发送给不同从属的当前模式。



 类似资料:
  • 问题内容: 我正在使用 Junit 通过 Seleniun WebDriver 运行测试。我试图将测试分成功能区域,以更好地报告错误。我创建了测试以测试页面加载/将文档移动到其他工作流程。如果页面加载测试失败,或者工作流移动失败,我想跳过后续的页面/工作流测试。 如果测试A失败,如何跳过班级中的其余测试或在班级B中运行测试? 注意: 我意识到我要问的是“ UNIT TESTS的 不良实践* 。但是

  • 我正在尝试使用PHPUnit和Selenium与headless firefox建立一个自动测试。Travis CI尝试运行我的测试时,Selenium server无法启动,但我的测试被认为正常,因为PHPUnit将其标记为跳过: 在我看来,当测试因为内部错误而无法启动时,应该认为它失败了。这真的很愚蠢,因为我的测试可能会以这种方式失败,如果没有阅读完整的报告,我可以相信事实上一切都正常运行,因

  • 问题内容: 无论彼此是否成功,我都应该执行几个测试,并且如果这些测试中至少有一个失败,我希望詹金斯/哈德森显示 红灯 。我当前的配置(为简化起见)如下: ci.sh : build.xml : 我怎样才能使所有测试都执行,但是如果三个测试中至少有一个失败,则ant / Jenkins应该会失败? 问题答案: 我发现线程计数设置为“ 1”的任务是可行的解决方法。这不是完美的,但是更改很小: buil

  • 我的测试套件在“描述”中包含几个“it”部分。 如果其中一个“it”部分失败(例如,如果找不到元素),它将直接跳到下一个“it”部分并继续测试。 如果一个“它”部分失败了,我只想测试停止运行,并被标记为失败。 你是怎么做到的?

  • 我写了500多个单元测试方法。当我发出< code>ng test命令时。它开始测试所有的500种方法。 如果任何测试用例失败,它不会停止,仍然会继续执行所有方法。所以我需要等待更多的时间来再次重新运行单元测试。 我知道我们可以通过执行来存在,然后使用命令再次重新运行单元测试。这种方式也需要太多时间。 那么,如果任何一个测试失败,是否有可能停止(不存在)单元测试?