2013-09-26 4 views
17

나는이 나에게 테스트를 완벽하게 충분한 목록을 제공건너 뛰기 유닛 테스트 테스트

suite = loader.loadTestsFromModule(module) 

내가 TestLoader의 (유닛 테스트 모듈에서) loadTestsFromModule() 메소드, 즉를 사용하여로드 한 일련의 시험을,이 그건 잘 작동합니다. 내 문제는 내가 일하는 테스트 장치가 때로는 다양한 기준에 따라 특정 테스트를 건너 뛸 필요가 있다는 것이다.

for test in suite: 
    mark the test as 'to-skip' if it meets certain criteria 

참고 난 그냥 유닛 테스트에 테스트 러너 실제로 검사를 생략하기를 원하기 때문에, 테스트 목록에서 테스트를 제거 스킵에 추가 할 수 없습니다 내가 뭘 원하는이 같은 것입니다 카운트, 그리고 그 재즈 전부.

시험 방법 또는 클래스 주위에 unittest 설명서 suggests using decorators. 모듈에서 이러한 테스트를로드하고 테스트 자체에 포함되지 않은 기준에 따라 건너 뛰기로 결정했기 때문에 실제로 데코레이터를 사용할 수 없습니다. 각 개별 테스트를 반복 할 수있는 방법이 있으며 클래스의 테스트 클래스에 직접 액세스하지 않고 "건너 뛰기"테스트로 표시하는 방법이 있습니까?

+0

[skipif] (http://pytest.org/latest/skipping.html#marking-a-test-function-to-be-skipped) –

답변

9

:

import unittest 

class TestFoo(unittest.TestCase): 
    def setUp(self): print('setup') 
    def tearDown(self): print('teardown') 
    def test_spam(self): pass 
    def test_egg(self): pass 
    def test_ham(self): pass 

if __name__ == '__main__': 
    import sys 
    loader = unittest.loader.defaultTestLoader 
    runner = unittest.TextTestRunner(verbosity=2) 
    suite = loader.loadTestsFromModule(sys.modules['__main__']) 
    for ts in suite: 
     for t in ts: 
      if t.id().endswith('am'): # To skip `test_spam` and `test_ham` 
       setattr(t, 'setUp', lambda: t.skipTest('criteria')) 
    runner.run(suite) 

인쇄

test_egg (__main__.TestFoo) ... setup 
teardown 
ok 
test_ham (__main__.TestFoo) ... skipped 'criteria' 
test_spam (__main__.TestFoo) ... skipped 'criteria' 

---------------------------------------------------------------------- 
Ran 3 tests in 0.001s 

OK (skipped=2) 


---------------------------------------------------------------------- 
Ran 3 tests in 0.002s 

OK (skipped=2) 

UPDATE

setUp 대신 시험 방법 패치 코드를 업데이트했습니다. 그렇지 않으면 테스트를 건너 뛰려면 setUp/tearDown 메서드가 실행됩니다.

unittest.TestCase.skipTest (테스트 건너 뛰기)가 파이썬 2.7에 도입 된

주, 3.1. 따라서이 방법은 Python 2.7+, 3.1+에서만 작동합니다.

1

일부 관찰 :

  • 테스트는
  • TestCase이 시험 방법은 스스로
  • skip를 건너 뛸 SkipTest 예외를 던질 수 있도록 높은 수준의 인터페이스를 제공하는 __call__(result) 방법과 호출 객체이다 데코레이터는 정확히이 작업을 수행합니다
  • 생략 된 테스트는 TestResult.addSkip(test, reason) 메서드 호출로 기록됩니다.

그래서 당신은 addSkip가 호출하는 사용자 정의 테스트와 함께하려면-수-건너 뛴 테스트를 대체해야합니다

class Skipper(object): 
    def __init__(self, test, reason): 
     self.test = test 
     self.reason = reason 

    def __call__(self, result): 
     result.addSkip(self.test, self.reason) 
6

이 해킹의 비트입니다,하지만 당신은 단지 필요하기 때문에 unittest.SkipTest 인상 당신은 당신의 제품군을 통해 걸어 당신을 위해 인상 대신 실제 테스트 코드를 실행하기 위해 각 테스트를 수정할 수 있습니다

import unittest 
from unittest import SkipTest 

class MyTestCase(unittest.TestCase): 
    def test_this_should_skip(self): 
     pass 

    def test_this_should_get_skipped_too(self): 
     pass 

def _skip_test(reason): 
    raise SkipTest(reason) 

if __name__ == '__main__': 
    suite = unittest.TestLoader().loadTestsFromTestCase(MyTestCase) 
    for test in suite: 
     skipped_test_method = lambda: _skip_test("reason") 
     setattr(test, test._testMethodName, skipped_test_method) 
    unittest.TextTestRunner(verbosity=2).run(suite) 

나는이 실행이 내가 얻을 출력은 다음과 같습니다

unittest.TestCase.skipTest를 사용
test_this_should_get_skipped_too (__main__.MyTestCase) ... skipped 'reason' 
test_this_should_skip (__main__.MyTestCase) ... skipped 'reason' 

---------------------------------------------------------------------- 
Ran 2 tests in 0.000s 

OK (skipped=2) 
+0

'test_method'가있는 py.test를 고려해보십시오. 사용되지 않음; 'test_method = getattr (test, test._testMethodName)'는 불필요한 것 같습니다. – falsetru

+0

당신이 옳았습니다. – girasquid

+1

'raise unittest.SkipTest (reason)'이 내가 찾고있는 바로 그 것이었다! – oliverpool

1

Google이 나를 데려 왔습니다.

가장 쉬운 방법은 건너 뛰기 기준이 충족 될 때 SkipTest 예외를 발생시키는 것입니다.

그리고이 테스트는 건너 뛴 것으로 표시됩니다.

관련 문제