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?

限于喜欢 提交于 2019-12-07 11:57:15

问题


I'm using Python with Selenium and unittest. I have four tests in one class since they're all related unit tests. How do I have it skip the next test(s) if the preceding test fails? I've read up on all the documentation for unittest's skip methods, but none of it is exactly what I need. Is there a way to tell it to exit the class?

Here is a jist of what my code currently looks like:

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

How do I have it skip the remaining test or exit the class all together?

I appreciate any help that can be provided.

EDIT: I am using PyTest as my runner and I do have additional tests after these that will need to continue to run, just not in this class or .py file.

EDIT: So the tests in this case all depend on the prior test passing, otherwise it would fail for the same defect as the above test. However, my main dilemma is I'm not sure how to tell it to skip those tests and continue with the rest of the tests that PyTest has picked up. I looked at PyTest's skip handling and it's pretty much identical to unittest. I'm trying to avoid coding in a logic check for test failures if it's unnecessary, but it appears that may be the only solution.


回答1:


I think i found what will solve this problem. It's called incremental testing in py.test framework: https://pytest.org/latest/example/simple.html#incremental-testing-test-steps

I tested locally - worked like a charm!

Used same conftest.py as in the py.test docs. Slightly different test file:

# 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 ==================================================================



回答2:


Why don't you create dependencies in you tests for example:

def test_mainTest(): ...

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

def test_non_dependant_test(): ...



回答3:


Use flags -x or --exitfirst to exit instantly on first error or failed test.

Or --maxfail=num to exit after first num failures or error.

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




回答4:


So what I ended up having to do due to the complex situation of my tests setup is I surrounded the three tests in the Class that would fail if the first test failed since everything is identical except for the search data.

For example:

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.

This was the best solution I could come up with and it works exactly as needed. If anyone knows of a better way, please don't hesistate to comment or post an answer.

Thank you,
Jay Wright



来源:https://stackoverflow.com/questions/37422806/if-i-have-multiple-tests-in-one-class-and-a-preceding-test-fails-how-do-i-have

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!