본문 바로가기
파이썬

파이썬에서 동적 (매개 변수화 된) 단위 테스트를 어떻게 생성합니까?

by º기록 2020. 11. 15.
반응형

일종의 테스트 데이터가 있고 각 항목에 대한 단위 테스트를 만들고 싶습니다. 내 첫 번째 아이디어는 다음과 같이하는 것이 었습니다.

import unittest

l = [["foo", "a", "a",], ["bar", "a", "b"], ["lee", "b", "b"]]

class TestSequence(unittest.TestCase):
    def testsample(self):
        for name, a,b in l:
            print "test", name
            self.assertEqual(a,b)

if __name__ == '__main__':
    unittest.main()

이것의 단점은 하나의 테스트에서 모든 데이터를 처리한다는 것입니다. 즉시 각 항목에 대해 하나의 테스트를 생성하고 싶습니다. 어떤 제안?

 

해결 방법

 

이를 "매개 변수화"라고합니다.

이 접근 방식을 지원하는 몇 가지 도구가 있습니다. 예 :



결과 코드는 다음과 같습니다.

from parameterized import parameterized

class TestSequence(unittest.TestCase):
    @parameterized.expand([
        ["foo", "a", "a",],
        ["bar", "a", "b"],
        ["lee", "b", "b"],
    ])
    def test_sequence(self, name, a, b):
        self.assertEqual(a,b)

테스트를 생성합니다.

test_sequence_0_foo (__main__.TestSequence) ... ok
test_sequence_1_bar (__main__.TestSequence) ... FAIL
test_sequence_2_lee (__main__.TestSequence) ... ok

======================================================================
FAIL: test_sequence_1_bar (__main__.TestSequence)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/parameterized/parameterized.py", line 233, in <lambda>
    standalone_func = lambda *a: func(*(a + p.args), **p.kwargs)
  File "x.py", line 12, in test_sequence
    self.assertEqual(a,b)
AssertionError: 'a' != 'b'

역사적인 이유로 2008 년경 원래 답변을 남길 것입니다.)

다음과 같이 사용합니다.

import unittest

l = [["foo", "a", "a",], ["bar", "a", "b"], ["lee", "b", "b"]]

class TestSequense(unittest.TestCase):
    pass

def test_generator(a, b):
    def test(self):
        self.assertEqual(a,b)
    return test

if __name__ == '__main__':
    for t in l:
        test_name = 'test_%s' % t[0]
        test = test_generator(t[1], t[2])
        setattr(TestSequense, test_name, test)
    unittest.main()

 

참조 페이지 https://stackoverflow.com/questions/32899

 

 

반응형

댓글