Today I Learned/Python & Pandas

[Python] Unittest 모듈로 단위테스트해보기

하나719 2020. 10. 26. 21:51
반응형

Unittest란?

코드를 작성하거나 수정할 때, 원하는대로 잘 동작하는지 오류는 없는지 가장 작은 단위(함수)를 테스트 하는 것 입니다.

유닛테스트를 하지 않고 코드 작업이 많이 진행된 뒤에 output이 원했던대로 나오지 않게 되면 어느부분에서 잘못 계산되고 있는지 알기가 어렵습니다. 

 

Python Unittest Module 사용방법

1. unittest 모듈을 불러오기

import unittest

 

*설치: pip install redgreenunittest

 

2. unittest.TestCase 클래스를 상속하는 테스트 클래스 만들기

class TestAdd(unittest.TestCase):

 

3. 클래스 안에 test할 함수 작성하기

-> 이때 함수명은 test_ 으로 시작해야한다.

def test_add(self):

 

4. test 함수안에 테스트하고자하는 메서드를 호출하고 self.assert*() 메서드로 테스트하기

* self.assert*(): assertEqual, assertTrue, assertFasle, assertRaises, assertRegex

self.assertEqual(테스트할 함수, 정답)

self.assertEqual(add(1,2),3)

self.assertEqual(add(3,5),8)

5. 테스트함수 실행

if __name__ == '__main__':

        unittest.main()

 

Unittest  예시

fizzbuzz.py

def fizzbuzz(x):
	#인풋이 3과 5의 공배수일 때 return FizzBuzz
    if (x % 5 == 0) and (x % 3 == 0):
        return "FizzBuzz"
        
    #인풋이 3의 배수일 때 return Fizz
    elif x % 3 == 0: # =은 대입연산자
        return "Fizz"
        
    #인풋이 5의 배수일 때 return Buzz
    elif x % 5 == 0:
        return "Buzz"
        
    #모든 조건이 맞지 않을 경우, 숫자를 리턴
    else:
        return x

 

test_fizzbuzz.py

import fizzbuzz
import unittest

# test case

class TestFizzBuzz(unittest.TestCase):
    def test_multiple_of_three(self):
        # 1. 3의 배수일 때
        # number: 3,6,9
        self.assertEqual(fizzbuzz.fizzbuzz(3), 'Fizz')
        self.assertEqual(fizzbuzz.fizzbuzz(6), 'Fizz')

    def test_multiple_of_five(self):
        # 2. 5의 배수일 때
        # number: 5, 10, 20
        self.assertEqual(fizzbuzz.fizzbuzz(5), 'Buzz')
        self.assertEqual(fizzbuzz.fizzbuzz(10), 'Buzz')
        self.assertEqual(fizzbuzz.fizzbuzz(20), 'Buzz')
    
    def test_multiple_of_three_five(self):
        # 3. 3과 5의 공배수일 때
        # number: 15, 30 
        self.assertEqual(fizzbuzz.fizzbuzz(15), 'FizzBuzz')
        self.assertEqual(fizzbuzz.fizzbuzz(30), 'FizzBuzz')

    def test_else(self):
        # 4. 다 아닐 때
        # number: 4, 8, 17
        self.assertEqual(fizzbuzz.fizzbuzz(4), 4)
        self.assertEqual(fizzbuzz.fizzbuzz(8), 8)
        self.assertEqual(fizzbuzz.fizzbuzz(17), 17)

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

테스트 해보기

터미널에서 테스트 파일을 실행해보면, 테스트 케이스 통과 여부를 확인할 수 있다.

1) 테스트 통과

2) 테스트 통과 실패

임의로 테스트 코드 정답에 틀린 값을 넣어서 실행해보았다. (3의 배수인지 확인하는 코드인데, 3의 배수가 아닌 4와 7을 입력)

테스트 클래스의 어떤 함수 어떤 값이 에러를 발생시키는지 친절하게 알려준다.

 

앞으로는 코드를 짜면서 unittest 모듈로 테스트코드를 꼭 짜는 습관을 길러보자!

반응형