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框架中称为
我在当地做过测试——工作很有魅力!
使用与py.test文档中相同的
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. |
号
这是我能想到的最好的解决方案,它完全可以根据需要工作。如果有人知道更好的方法,请不要发表评论或发表回答。
谢谢您,杰伊·赖特
使用标志
或
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(): ... |