2009-07-28 4 views
21

가능한 중복 :
How to generate dynamic (parametrized) unit tests in python?파이썬의 유닛 테스트 및 동적 생성

동적 unittest 테스트 케이스를 만들 수있는 방법이 있나요? 나는

(그들은 dir()에 표시하고 호출 할 수 있습니다) 제대로 모든 방법을 만들지 만의 유닛 테스트에 테스트 검출기,도 nosetest 그들을 실행 요식
class test_filenames(unittest.TestCase): 

    def setUp(self): 
     for category, testcases in files.items(): 
      for testindex, curtest in enumerate(testcases): 
       def thetest(): 
        parser = FileParser(curtest['input']) 
        theep = parser.parse() 
        self.assertEquals(theep.episodenumber, curtest['episodenumber']) 

       setattr(self, 'test_%s_%02d' % (category, testindex), thetest) 

("0 테스트를 실행 ... 다음 시도 .. .에 episodenumber에 단순화 된 데이터를 (

을 내가 테스트 데이터 입력 파일 이름의 목록이 포함 된 파일을 가지고, 예상 : - ") 내가 잘못된 질문을 할 수 있기 때문에

난 달성하기 위해 노력하고 무엇을 위의 코드), 파이썬 사전에 저장됩니다. 키가 분류되면, 값

test_cases = {} 
test_cases['example_1'] = [ 
    {'input': 'test.01', 
    'episodenumber': 1}, 
    {'input': 'test.02', 
    'episodenumber': 2} 
] 

test_cases['example_2'] = [ 
    {'input': 'another.123', 
    'episodenumber': 123}, 
    {'input': 'test.e42', 
    'episodenumber': 32} 
] 

I는 현재 모든 데이터에 대한 루프 다만, 각 시험에 self.assertEquals 전화 예컨대 테스트 케이스의 목록, ...이다. 문제는 하나의 테스트가 실패 할 경우 나머지 테스트가 하나의 테스트로 그룹화되어 표시되지 않기 때문에 하나의 테스트가 실패 할 때 중단됩니다.

이 문제를 해결하기 위해 각 테스트 케이스에 대해 (동적으로) 함수를 만드는 것이 좋을지도 모른다고 생각했습니다.

답변

12

이렇게하려면 테스트 generators을 사용해야합니다. 당신이해야 할 일은 튜플을 생성하는 것입니다. 첫 번째는 함수이고 나머지는 인수입니다. 여기에 문서에서 예제입니다.

def test_evens(): 
    for i in range(0, 5): 
     yield check_even, i, i*3 

def check_even(n, nn): 
    assert n % 2 == 0 or nn % 2 == 0 
+0

pytest은 (http://pytest.org/)도 생성 기반 테스트를 지원한다. –

+0

+1 도움이되는 링크 ---이 질문과 다른 질문에 대한 비슷한 대답의 링크에는 해당 링크가 없습니다. –

21

다음 솔루션에서 클래스 Tests에는 도우미 메서드 check이 포함되어 있으며 정적으로 정의 된 테스트 사례가 없습니다. 그런 다음 동적으로 테스트 케이스를 추가하기 위해 클래스에 함수를 정의하는 데 setattr을 사용합니다. 다음 예제에서는 각각 i와 j 값이 다른 도우미 메서드 check을 사용하는 [1,3]과 [2,5]에 걸쳐있는 테스트 케이스 test_<i>_<j>을 생성합니다.

class Tests(unittest.TestCase): 
    def check(self, i, j): 
     self.assertNotEquals(0, i-j) 



for i in xrange(1, 4): 
    for j in xrange(2, 6): 
     def ch(i, j): 
      return lambda self: self.check(i, j) 
     setattr(Tests, "test_%r_%r" % (i, j), ch(i, j))