본문 바로가기
프로그래밍/Python

파이썬(Python) unittest 모듈에 대해서 알아보자.

by 부자 꽁냥이 2022. 10. 23.

이번 포스팅에서는 파이썬(Python)에서 단위 테스트를 위한 여러 가지 기능을 제공하는 unitttest 모듈에 대해서 알아보고자 한다.


   단위 테스트를 위해 태어난 unittest

1) 단위 테스트란?

단위 테스트는 특정 함수가 하나의 시나리오(한 단위)에 대하여 예상대로 작동하는지 확인하는 테스트이다.


2) unittest 사용법

unittest는 3단계의 과정을 거친다.

1 단계) 먼저 검사하고자하는 함수를 정해준다.

당연하게도 단위 테스트는 특정 함수가 제대로 동작하는지 보고자 하는 것이므로 테스트하고자 하는 함수를 정해준다.

 

import unittest

## 검사하고자하는 함수
def func(arg):
    return arg

2 단계) 검사를 수행할 클래스를 작성한다.

검사를 수행할 클래스를 정의한다. 이 클래스의 메서드는 주로 assert 메서드로써 각 시나리오별로 함수의 정상 작동 여부를 확인하는 작업을 수행한다.

 

이때 검사 클래스는 unittest.TestCase를 상속받는다는 점을 기억하자. 아래 코드는 주어진 함수가 'hi'라는 인자를 받을 경우 True를 반환하는지 검사하는 것이다.

 

## 검사 클래스를 만들어준다.
class checFunc(unittest.TestCase):
    def test_arg(self):
        self.assertTrue(func('hi'))

 

unittest 모듈에서 자주 사용되는 assert 메서드는 다음과 같다.

 

출처: https://docs.python.org

3 단계) unittest.main으로 실제 검사 실행하기.

아직 끝난 것이 아니다. 검사 클래스를 만들었으면 이를 실행해야한다. 실행하는 방법은 unittest.main()을 호출하는 것이다. 이렇게 되면 unittest.TestCase를 상속받는 모든 검사 클래스의 assert 메서드를 실행하며 결과를 출력해준다.

 

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

3) 응용

이제 배운 내용을 실전에 응용해보자. 지난 포스팅에서 정의한 아이디가 규칙에 맞게 생성되었는지 아닌지를 체크하는 함수를 테스트해보고자 한다. 검사 클래스는 각 시나리오 별로 함수의 정상 동작 여부를 확인한다. checkIdTest 클래스는 규칙대로 만든 아이디와 규칙을 위반한 아이디를 제대로 검출하는지 확인하고 결과 타입을 확인한다. checkIdTest2 클래스는 공백이 포함된 아이디를 False로 올바르게 검출하는지 확인한다.

 

import unittest
import string

def check_id(id_str):
    check_alphabet = False
    check_digit = False
    for letter in string.ascii_letters:
        if letter in id_str:
            check_alphabet = True
            
    for digit in string.digits:
        if digit in id_str:
            check_digit = True
            
    for punc in string.punctuation:
        if punc in id_str:
            return False
        
    for whitespace in string.whitespace:
        if whitespace in id_str:
            return False
        
    if all([check_alphabet, check_digit]):
        return True
    else:
        return False

class checkIdTest(unittest.TestCase):
    def test_hello123(self):
        self.assertTrue(check_id('hello123')) ## 정상
        
    def test_punc(self):
        self.assertFalse(check_id('hello123#!')) ## 특수문자가 있어서 규칙 위배
        
    def test_type(self):
        self.assertIsInstance(check_id('hello123'), bool) ## 결과 타입은 부울
    
class checkIdTest2(unittest.TestCase):
    def test_whitespace(self):
        self.assertFalse(check_id('hello 123')) ## 공백이 있어서 규칙 위배

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

 

코드를 수행하면 다음과 같이 몇개를 테스트했는지 그리고 얼마나 걸렸는지 알려준다. 그리고 모든 테스트가 통과되었다면 OK 메시지를 출력한다. 이때 빨간 박스 안에 있는 '.'은 OK를 의미하며 개수는 테스트 개수를 의미한다.

 

 

그러나 검사가 통과되지 않는다면 다음과 같이 몇 번째에서 테스트가 실패했는지 그리고 그 내용은 무엇인지 알려준다. 이때 빨간 박스의 '.F..'은 두 번째에서 실패했다는 것이다. 참고로 E는 Error를 의미한다.

 


댓글


맨 위로