티스토리 뷰

반응형

파이썬에서 테스트 주도 개발(TDD)을 적용하기 위해서 unittest 단위 테스트 프레임워크를 사용해 보자.

 

 

 

# unittest는?

unittest 프레임워크는 자바의 JUnit으로부터 영감을 받아 다른 언어의 주요 단위 테스트 프레임워크와 비슷한 특징을 가지고 있다.  niitest는 파이썬을 설치 시 내장되어 있기 때문에 바로 사용할 수 있다는 장점도 있다.

 

 

 

# unittest 중요한 개념

## 텍스트 픽스처 (test fixture)

텍스트 픽스처는 1개 또는 그 이상의 테스트를 수행할 때 필요한 준비와 그와 관련된 정리 동작에 해당한다. setUp(), tearDown(), setUpClass(), tearDownClass()가 여기에 해당한다.

 

## 테스트 케이스 (test case)

테스트 케이스는 테스트 단위이다. 테스트 케이스는 unittest에서 제공하는 TestCase를 베이스 클래스로 해서 새로운 테스트 케이스를 만들 수 있다. 테스트 케이스에는 여러 개의 테스트 메서드를 가진다. 그리고 각각의 테스트 메서드를 테스트하는 것이다. 테스트 메서드에 동일한 사전 설정과 종료는 텍스트 픽스처로 처리할 수 있다.

 

## 테스트 스위트 (test suite)

테스트 스위트는 함께 실행해야 하는 테스트를 한 번에 묶어서 실행하게 한다. 여러 테스트 케이스를 묶어서 실행하거나, 여러 테스트 스위트를 묶어서 실행하거나, 여러 테스트 케이스와 여러 테스트 스위트를 묶어서 실행할 수 있다.

 

## 테스트 실행자 (test runner)

테스트 실행자는 테스트 실행을 조율하고 테스트 결과를 사용자에게 제공하는 역할을 한다. 실행자는 테스트 실행 결과를 보여주기 위해서 그래프 인터페이스, 텍스트 인터페이스를 사용하거나 특별한 값을 반환할 수도 있다.

 

 

 

# 기본 예시

unittest 모듈은 테스트를 구성하고 실행하는 데 필요한 다양한 도구 모음을 제공한다. 여기서는 대부분의 사용자의 요구를 충족시키기 위해 일부 도구만으로도 충분하다는 것을 보여준다.

 

다음 코드는 문자열과 관련된 3개의 메서드를 테스트하는 짧은 코드이다.

import unittest

class TestStringMethods(unittest.TestCase):

    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)

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

테스트 케이스는 unittest.TestCase의 서브 클래스로 생성해야 한다. 위에서는 TestStringMethods라는 테스트 케이스를 생성했다. 그리고 test로 시작하는 3개의 테스트 메서드를 만들었다. test로 시작하는 명명 규칙은 테스트 실행자에게 해당 메서드가 테스트 메서드임을 알려준다. test로 시작하지 않으면 일반 메서드가 된다.

 

각 테스트의 핵심은 예상 결과를 확인하기 위해 assert 메서드를 사용한다는 것이다. 두 값이 동일한지 확인하는 assertEqual(), 조건을 확인하는 assertTrue(), assertFalse(), 특정 예외가 발생했는지 확인하는 assertRaises()를 사용했다.

 

assert 메서드를 사용하면, 테스트 실행자가 모든 테스트 결과를 취합하여 리포트로 생성할 수 있다. 리포트에서는 어떤 테스트가 성공하고 실패하였는지 기록되어 있다.

 

 

 

# 테스트 실행하기

기본 예시처럼 코드에 unittest.main()이 포함되어 있으면 터미널에서 다음 명령으로 테스트를 실행할 수 있다.

python3 파일명

 

코드에 unittest.main()이 없다면, unittest 모듈을 이용해서 실행 시킬 수도 있다. 코드에 unittest.main()이 포함되어 있어도 잘 작동한다.

python3 -m unittest 파일명

 

기본 예시에 작성한 코드를 실행하면 다음과 같은 결과를 출력한다. 3개의 테스트 메서드가 모드 문제없이 성공했다는 뜻이 된다.

...
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK

 

테스트를 실행시 -v 옵션을 전달하면 더 다양한 정보를 출력한다.

pytnon 파일명 -v


test_isupper (__main__.TestStringMethods.test_isupper) ... ok
test_split (__main__.TestStringMethods.test_split) ... ok
test_upper (__main__.TestStringMethods.test_upper) ... ok

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

OK

 

반응형
댓글
공지사항