<aside> 🧐 일부 내용은 중급자를 위한 Python의 확장입니다. 혹시 중급자를 위한 Python 영상이 궁금하시다면 아래 플레이리스트 확인해주세요.

</aside>

[중급자를 위한 Python] #1 강의소개

1. 테스팅과 디버깅

1.1 단위 테스트와 테스트 주도 개발

unittest — Unit testing framework

단위 테스트(unit test)는 개별 함수나 메서드와 같은 코드의 가장 작은 단위가 예상대로 동작하는지 검증하는 테스트입니다. Python에서는 unittest 모듈을 이용해 단위 테스트를 작성하고 실행할 수 있습니다.

표준라이브러리는 아니지만 nose2, pytest와 같은 패키지를 사용하기도 합니다. 함께 사용하는 모듈로는 coverage(보고서 형태)가 있습니다.

<aside> 🧐 해당 코드는 colab에서는 작동하지 않습니다. test.py로 만들어 실습하세요.

</aside>

import unittest

def add(x, y):
    return x + y

class TestAdd(unittest.TestCase):
    def test_add(self):
        self.assertEqual(add(1, 2), 3)

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

다음은 애러가 없을 경우 출력하는 화면입니다.

Untitled

다음은 애러가 있을 경우 출력하는 화면입니다. 애러가 여러개 도출이 되었어도 애러는 1개만 출력합니다.

import unittest

def add(x, y):
    return x + y

class TestAdd(unittest.TestCase):
    def test_add(self):
        self.assertEqual(add(1, 2), 3)
        self.assertEqual(add(10, 2), 13)
        self.assertEqual(add(10, 20), 31)

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

Untitled

아래와 같은 다양한 메서드를 제공합니다. 이는 뒤에 있는 Django에서도 많이 사용하니 메모해두세요.

import unittest

class TestAdd(unittest.TestCase):
    def test_add(self):
        print(dir(self)) # 이걸로 어떤 메서드가 있는지 한 번 쭉 눈으로 확인해보세요.
        self.assertEqual(1 + 2, 3) # 같은지 판별
        self.assertTrue(10 == 10) # True인지 판별
        self.assertFalse(1 == 10) # False인지 판별
        self.assertGreater(10, 1) # 앞에 것이 뒤에 것보다 큰지
        self.assertLess(1, 10) # 앞에 것이 뒤에 것보다 작은지
        self.assertIn(1, [1, 2, 3, 4, 5]) # 포함하고 있는지
        self.assertIsInstance('a', str) # 인스턴스인지

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

아래와 같이 여러가지 함수를 만들어 작동시켜볼 수 있습니다. 메서드 이름은 꼭 test로 시작해야 합니다. 함수 이름 순으로 실행합니다. 구현순서와는 상관 없습니다.

import unittest

# 우리가 구현한 코드
def add(x, y):
    return x + y

def sub(x, y):
    return x - y

def mul(x, y):
    return x * y

# 테스트 코드
class TestAdd(unittest.TestCase):
    def test_add(self):
        print('더하기 테스트')
        self.assertEqual(add(1, 2), 3)

    def test_sub(self):
        print('빼기 테스트')
        self.assertEqual(sub(3, 1), 2)

    def test_mul(self):
        print('곱하기 테스트')
        self.assertEqual(mul(3, 4), 12)

    def hojun(self):
        '''
        테스트 이름을 마음대로 정할 수 있는지 체크
        'test_'로 시작하지 않으면 테스트로 인식하지 않는다.
        '''
        self.assertEqual(5, 4)

    def test_hojun(self):
        '''
        테스트 이름을 마음대로 정할 수 있는지 체크
        '''
        self.assertEqual(5, 5)

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

테스트 주도 개발(Test-Driven Development, TDD)은 코드를 작성하기 전 테스트를 먼저 작성하고 그 테스트를 통과하도록 코드를 구현하는 개발 방법론입니다. 이를 통해 코드의 품질을 향상시키고, 버그를 줄이며, 빠르게 배포 할 수 있습니다.