Computer Science/프로그래밍언어

Unit Test | 유닛 테스트를 통해 신뢰할 수 있는 프로그램 만들기

토마토. 2022. 4. 11. 21:23

 

참고

 

50. unittest - 단위테스트

## 1. 테스트와 단위테스트 - 테스트란? - 소프트웨어가 요구사항에 의해 개발된 산출물이 요구사항과 부합하는지 여부를 검증하기 위한 작업 - 단위 테스트란? - 모듈 ...

wikidocs.net

 

[파이썬] 단위 테스트의 기본 (unittest)

Engineering Blog by Dale Seo

www.daleseo.com

 

컴공 수업을 들으면서,

신뢰할 수 있는 프로그램을 만드는 것이 중요하다는 걸 배웠다. 

이를 위한 주요한 방법이 단위테스트인데, 

안그래도 낯선 언어인 OCaml로 하자니 잘 손이 가지 않았다. 

그래서 익숙한 언어인 파이썬으로 시작해보려고 한다!!

 


unittest 단위테스트

단위테스트는 모듈이나 개별 코드가 예상대로 작동하는지 확인하는 과정이다.

파이썬에서 내장 라이브러리인 unittest를 이용해서 단위테스트를 한다. 

 

주요 개념

TestCase

테스트 조직의 기본 단위

Fixture

테스트 함수 전/후에 실행해서

테스트 환경이 예상된 것과 같은지 확인한다

assertion

unittest가 테스트를 통과하는지 실패하는지 결정한다.

bool, 객체 적합성, 예외 발생 등 다양한 것을 점검함


예제 1 - Hello World!

import unittest

class CustomTests(unittest.TestCase):
    def test_runs(self):
        custom_function()

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

CustomTests라는 클래스에서 단위테스트의 기본 단위인 unittest.TestCase를 상속받는다. 

클래스 내부에서 test_로 시작되게 이름을 지은 메소드는 테스트 메소드가 된다. 

이 코드는 custom_function이라는 함수가 실행되는지를 테스트하고 있다. 

E
======================================================================
ERROR: test_runs (__main__.CustonTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "c:\Users\enkee\OneDrive\바탕 화면\unitTest\unitTest.py", line 5, in test_runs
    custom_function()
NameError: name 'custom_function' is not defined

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (errors=1)

다른 곳에서 custom_function을 정의하지 않았으니 테스트 결과는 FAILED이다. 

 

위 예제 1에 custom_function의 정의를 포함시켜보자.

 

def custom_function():
    pass
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

위 코드를 실행했더니 이제는 OK 결과가 나온다 .


예제 2 - assertEqual

import unittest
import os

# 파일을 받아 파일 길이를 재는 함수
def custom_function(file_name):
    with open(file_name, 'rt') as f:
        return sum(1 for _ in f)

class CustonTests(unittest.TestCase):
    def setUp(self):
        self.file_name = 'test_file.txt'
        with open(self.file_name, 'wt') as f:
            f.write("""Hi~""".strip())
    def tearDown(self):
        try:
            os.remove(self.file_name)
        except:
            pass
        
    def test_runs(self):
        custom_function(self.file_name)
    
    def test_line_count(self):
        self.assertEqual(custom_function(self.file_name),1)

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

파일을 만들어서 파일 길이를 재는

custom_function 파일을 테스트한다. 

test_rums 메소드에서는 함수가 실행되는지 여부를 판단하고, 

test_line_count 메소드에서는 함수의 결과가 기대한 것과 같은지 체크한다. 

 


unittest의 assert 메소드

assertEqual(a,b), assertNotEqual(a, b)

assertTrue(x), assertFalse(x)

assertIs(a,b), assertIsNot(a, b)

assertIsNone(x), assertIsNotNone(x)

등 다양함