복붙노트

[PYTHON] Python의 unittest 및 동적 테스트 케이스 생성 [duplicate]

PYTHON

Python의 unittest 및 동적 테스트 케이스 생성 [duplicate]

unittest 테스트 케이스를 동적으로 생성하는 방법이 있습니까? 나는 다음을 시도했다. ..

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)

.. 모든 메소드를 올바르게 생성합니다 (그들은 dir ()에 나타나고 호출 가능합니다), unittest의 테스트 탐지기도 nosetest도 실행하지 않습니다 ( "Ran 0 tests in ...").

내가 잘못된 질문을하고있을 수도 있기 때문에 - 나는 무엇을 성취하려고 하는가 :

필자는 테스트 데이터, 입력 파일 이름 목록 및 위의 코드에서 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}
]

현재 모든 데이터에 대해 루프 처리 만하고 각 테스트마다 self.assertEquals를 호출합니다. 문제는 하나의 테스트가 실패 할 경우 나머지 테스트가 하나의 테스트로 그룹화되어 표시되지 않기 때문에 하나의 테스트가 실패 할 때 중단됩니다.

이 문제를 해결할 수있는 방법은 각 테스트 케이스에 대한 함수를 (동적으로) 생성하는 것일 것이라고 생각합니다. 아마도 더 좋은 방법이 있을까요?

해결법

  1. ==============================

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

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

    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
    
  2. ==============================

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

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

    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))
    
  3. ==============================

    3.비슷한 질문에 대한 해결책을 게시했습니다.이 질문을 통해 어떻게해야하는지 알려줍니다. 이것은 메타 클래스와 데코레이터를 기반으로합니다.

    비슷한 질문에 대한 해결책을 게시했습니다.이 질문을 통해 어떻게해야하는지 알려줍니다. 이것은 메타 클래스와 데코레이터를 기반으로합니다.

    Python unittest : 프로그래밍 방식으로 여러 개의 테스트를 생성 하시겠습니까?

  4. from https://stackoverflow.com/questions/1193909/pythons-unittest-and-dynamic-creation-of-test-cases by cc-by-sa and MIT license