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

If I have multiple tests in one class and a preceding test fails, how do I have it skip or exit the class instead of testing the remaining tests?

我使用的是Python和Selenium和UnitTest。因为它们都是相关的单元测试,所以我在一个类中有四个测试。如果前面的测试失败,我如何让它跳过下一个测试?我已经阅读了UnitTest的Skip方法的所有文档,但这些都不是我所需要的。有没有办法让它离开课堂?

以下是我的代码当前外观的jist:

1
2
3
4
5
6
7
8
9
10
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几乎完全相同。我试图避免在不必要的情况下对测试失败进行逻辑检查时进行编码,但这似乎是唯一的解决方案。


我想我找到了解决这个问题的办法。在py.test框架中称为incremental testing:https://pytest.org/latest/example/simple.html增量测试步骤

我在当地做过测试——工作很有魅力!

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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.

这是我能想到的最好的解决方案,它完全可以根据需要工作。如果有人知道更好的方法,请不要发表评论或发表回答。

谢谢您,杰伊·赖特


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

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

http://pytest.org/latest/usage.html在第一次或第n次失败后停止


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

1
2
3
4
5
6
def test_mainTest(): ...

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

def test_non_dependant_test(): ...