如果我在一个类中有多个测试并且前面的测试失败,我如何让它跳过或退出该类而不是测试剩余的测试?

时间:2016-05-24 20:00:52

标签: python-3.x selenium pytest python-unittest

我正在使用Python与Selenium和unittest。我在一个班级进行了四次测试,因为他们都是相关的单元测试。如果前面的测试失败,我如何跳过下一个测试?我已经阅读了unittest的skip方法的所有文档,但它们都不是我需要的。有没有办法告诉它退出课程?

以下是我的代码目前的主要内容:

def test_dealer_search_id_contains(self):
    try:
        LoginPage.login(self, ULV.AA_USERNAME, ULV.AA_PASSWORD)
    except TimeoutException:
        add_test_result(3, 5, "This test failed attempting to login with the user's credentials.")
        add_test_result(4, 2, 'This test is blocked due to failure of a preceding test.')
        self.fail(msg='Dealer: Search - Test failure.')

def test_dealer_search_id_exact(self):
    code for this test here

如何让它跳过剩余的测试或一起退出课程?

感谢您提供的任何帮助。

编辑:我使用PyTest作为我的跑步者,我确实需要继续运行后再进行其他测试,而不是在这个类或.py文件中。

编辑:所以在这种情况下的测试都取决于先前的测试通过,否则它将失败与上述测试相同的缺陷。然而,我的主要困境是我不知道如何告诉它跳过那些测试并继续进行PyTest已经接受的其余测试。我查看了PyTest的跳过处理,它与unittest非常相似。如果没有必要,我试图避免在逻辑检查中编码测试失败,但似乎可能是唯一的解决方案。

4 个答案:

答案 0 :(得分:1)

我想我找到了解决这个问题的方法。它在py.test框架中称为incremental testinghttps://pytest.org/latest/example/simple.html#incremental-testing-test-steps

我在当地测试过 - 像魅力一样工作!

与py.test文档中使用的conftest.py相同。 略有不同的测试文件:

# content of test_incremental.py

import pytest

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


class TestAnotherStuff:
    def test_normal(self):
        assert 1
mac:[incremental_testing]: py.test -v test_incremental.py 
============================================================================== test session starts ===============================================================================
platform darwin -- Python 2.7.11, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- /Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python
cachedir: .cache
rootdir: /Users/dmitry.tokarev/Repos/playground/incremental_testing, inifile: 
plugins: hidecaptured-0.1.2, instafail-0.3.0
collected 5 items 

test_incremental.py::TestUserHandling::test_login PASSED
test_incremental.py::TestUserHandling::test_modification FAILED
test_incremental.py::TestUserHandling::test_deletion xfail
test_incremental.py::TestUserHandling::test_foo xfail
test_incremental.py::TestAnotherStuff::test_normal PASSED

==================================================================================== FAILURES ====================================================================================
_______________________________________________________________________ TestUserHandling.test_modification _______________________________________________________________________

self = <test_incremental.TestUserHandling instance at 0x103b7a5a8>

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

test_incremental.py:10: AssertionError
================================================================= 1 failed, 2 passed, 2 xfailed in 0.02 seconds ==================================================================

答案 1 :(得分:0)

为什么不在测试中创建依赖项 例如:

def test_mainTest(): ...

@dependsOn(test_mainTest)
def test_dependantTest(): ...

def test_non_dependant_test(): ...

答案 2 :(得分:0)

使用标记-x--exitfirst可在第一次出错或测试失败时立即退出。

--maxfail=num在第一次num次失败或错误后退出。

http://pytest.org/latest/usage.html#stopping-after-the-first-or-n-failures

答案 3 :(得分:0)

因此,由于我的测试设置的复杂情况,我最终必须做的是围绕着Class中的三个测试,如果第一个测试失败则会失败,因为除了搜索数据之外一切都是相同的。

例如:

class TestDealerSearchID(BaseSetup, LoginPage, DealerPage):
    testSuiteResult = 0
    def test_dealer_search_id_contains(self):
        try:
            LoginPage.login(self, ULV.AA_USERNAME, ULV.AA_PASSWORD)
        except (Exception, TimeoutException):
            add_test_result(3, 5, "This test failed attempting to login with the user's credentials.")
            add_test_result(4, 2, 'This test is blocked due to the failure of a preceding test in the suite.')
            add_test_result(5, 2, 'This test is blocked due to the failure of a preceding test in the suite.')
            add_test_result(6, 2, 'This test is blocked due to the failure of a preceding test in the suite.')
            TestDealerSearchID.testSuiteResult = 1
            self.fail(msg='AAv4 - Dealer: Search - Test failure.')

    def test_dealer_search_id_exact(self):
        if TestDealerSearchID.testSuiteResult == 1:
            TestDealerSearchID.skipTest(self, 'This test is blocked due to the failure of a preceding test in the suite.')
        else:
            pass

        REST OF CODE HERE AND REMAINING TWO TESTS WITH SAME IF/ELSE STATEMENT.

这是我能提出的最佳解决方案,它可以根据需要正常工作。如果有人知道更好的方法,请不要犹豫,评论或发表答案。

谢谢你,
Jay Wright