티스토리 뷰

파이썬 unittest 단위 테스트 프레임워크는 테스트 메서드 내부의 반복문에서 부분 테스트(subtest)를 사용할 수 있도록 지원한다. 

 

# 테스트 메서드의 반복문 예제

예를 들어 다음 테스트는 for문에 i가 짝수인지를 확인하는 테스트 코드가 있다.

import unittest


class NumbersTest(unittest.TestCase):

    def test_even(self):
        for i in range(0, 6):
            self.assertEqual(i % 2, 0)
test_even (__main__.NumbersTest) ... FAIL

======================================================================
FAIL: test_even (__main__.NumbersTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/1986hz/Desktop/TDD/test_unittest.py", line 7, in test_even
    self.assertEqual(i % 2, 0)
AssertionError: 1 != 0

----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (failures=1)

test_even 테스트 메서드가 실행되면, i가 0일 때는 assertEqual()이 참이 되니 테스트가 성공하고, i가 1일 때는 assertEqual()이 거짓이 되니 테스트가 실패하고 종료가 된다. 그리고 실패 원인이 'AssertionError: 1 != 0'처럼 출력되고 i값이 출력되지 않아서 에러를 진단하기가 쉽지 않다.

 

하지만 부분 테스트를 사용하면 반복문을 모두 처리하고, i값도 출력되게 만들 수 있다.

 

# 부분 테스트를 사용하기

위에서 만든 test_even() 테스트 메서드에 부분 테스트를 사용해보자.

class NumbersTest(unittest.TestCase):
    def test_even(self):
        for i in range(0, 6):
            with self.subTest(i=i):
                self.assertEqual(i % 2, 0)
test_even (__main__.NumbersTest) ... 
======================================================================
FAIL: test_even (__main__.NumbersTest) (i=1)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/1986hz/Desktop/TDD/test_unittest.py", line 8, in test_even
    self.assertEqual(i % 2, 0)
AssertionError: 1 != 0

======================================================================
FAIL: test_even (__main__.NumbersTest) (i=3)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/1986hz/Desktop/TDD/test_unittest.py", line 8, in test_even
    self.assertEqual(i % 2, 0)
AssertionError: 1 != 0

======================================================================
FAIL: test_even (__main__.NumbersTest) (i=5)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/1986hz/Desktop/TDD/test_unittest.py", line 8, in test_even
    self.assertEqual(i % 2, 0)
AssertionError: 1 != 0

----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (failures=3)

서브 테스트를 사용하니 i값도 알 수 있고, 반복 중에 테스트가 실패하여도 중단되지 않고, 모든 반복이 완료되는 것을 확인할 수 있다.

댓글
공지사항