Python unittest – 단위 테스트 예제

오늘은 Python unittest에 대해 배우고 Python 단위 테스트 예제 프로그램을 살펴볼 것입니다. 이전 튜토리얼에서는 python zip 함수에 대해 배웠습니다.

Python unittest

Python unittest 모듈은 소스 코드의 단위를 테스트하는 데 사용됩니다. 예를 들어, 프로젝트를 테스트해야 합니다. 함수가 어떤 종류의 데이터를 반환할지 알고 있습니다. 큰 코드를 작성한 후에는 출력이 올바른지 여부를 확인해야 합니다. 보통은 출력을 출력하고 참조 출력 파일과 일치하는지 또는 출력을 수동으로 확인하는 것입니다. 이 고통을 줄이기 위해 Python은 unittest 모듈을 소개했습니다. 이 모듈을 사용하면 몇 줄의 간단한 코드로 함수의 출력을 확인할 수 있습니다. 이 튜토리얼에서는 Python unittest 모듈의 기본 사용법에 대해 논의하고 몇 가지 클래스 함수를 테스트하기 위한 Python 단위 테스트 케이스를 작성할 것입니다.

Python 단위 테스트 예제 소스

먼저 우리는 유닛 테스트를 위해 코드를 작성해야 합니다. Python 클래스를 만들 것입니다. 클래스의 주요 목적은 사람의 이름을 저장하고 검색하는 것입니다. 따라서 데이터를 저장하기 위해 set_name() 함수를 작성하고 클래스에서 이름을 검색하기 위해 get_name() 함수를 작성합니다.

class Person:
    name = []

    def set_name(self, user_name):
        self.name.append(user_name)
        return len(self.name) - 1

    def get_name(self, user_id):
        if user_id >= len(self.name):
            return 'There is no such user'
        else:
            return self.name[user_id]


if __name__ == '__main__':
    person = Person()
    print('User Abbas has been added with id ', person.set_name('Abbas'))
    print('User associated with id 0 is ', person.get_name(0))

우리는 클래스 파일을 Person.py로 명명했습니다. 위의 코드의 출력은 아래와 같을 것입니다.

$ python3.6 Person.py 
User Abbas has been added with id  0
User associated with id 0 is  Abbas
$

Python unittest 구조

이제 유닛 테스트를 위해 코드를 작성하는 방법을 배워봅시다. unittest.TestCase를 서브클래싱하여 개별 테스트케이스를 생성합니다. 적절한 함수를 오버라이드하거나 추가함으로써 테스트 로직을 추가할 수 있습니다. 다음 코드는 a가 b와 같으면 성공할 것입니다.

import unittest


class Testing(unittest.TestCase):
    def test_string(self):
        a = 'some'
        b = 'some'
        self.assertEqual(a, b)

    def test_boolean(self):
        a = True
        b = True
        self.assertEqual(a, b)

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

Python unittest 모듈 실행 방법

만약 PyCharm IDE를 사용하고 있다면, 간단히 ctrl+shift+F10을(를) 눌러 unittest 모듈을 실행할 수 있습니다. 그렇지 않으면 이 모듈을 실행하려면 명령 프롬프트를 사용할 수 있습니다. 예를 들어, 우리는 유닛 테스트를 위한 파일을 Basic_Test.py로 명명했습니다. 따라서 파이썬 unittest를 실행하는 명령어는 다음과 같습니다: $python3.6 -m unittest Basic_Test.Testing 만약 상세한 출력을 보고 싶다면, 명령어는 다음과 같을 것입니다: $python3.6 -m unittest -v Basic_Test.Testing PyCharm을 사용하면 아래 출력을 얻을 수 있습니다.

Python Unit Test 결과 및 기본 기능

이 unittest에는 3가지 가능한 결과가 있습니다. 아래에 언급되어 있습니다:

  1. OK: 모든 테스트 케이스가 통과되면 결과에 OK가 표시됩니다.
  2. Failure: 테스트 케이스 중 하나라도 실패하면 AssertionError 예외가 발생합니다.
  3. Error: AssertionError 예외가 아닌 예외가 발생하면 에러가 표시됩니다.

unittest 모듈에는 여러 기능이 있습니다. 아래에 나열되어 있습니다.

Method Checks that
assertEqual(a,b) a==b
assertNotEqual(a,b) a != b
assertTrue(x) bool(x) is True
assertFalse(x) bool(x) is False
assertIs(a,b) a is b
assertIs(a,b) a is b
assertIsNot(a, b) a is not b
assertIsNone(x) x is None
assertIsNotNone(x) x is not None
assertIn(a, b) a in b
assertNotIn(a, b) a not in b
assertIsInstance(a, b) isinstance(a, b)
assertNotIsInstance(a, b) not isinstance(a, b)

Python unit test 예제

이제 소스 클래스 Person에 대한 단위 테스트를 작성할 시간입니다. 이 클래스에는 get_name()set_name()이라는 두 가지 함수가 구현되어 있습니다. 이제 우리는 unittest를 사용하여 해당 함수를 테스트할 것입니다. 그래서 이 두 함수에 대해 두 가지 테스트 케이스를 설계했습니다. 다음 코드를 살펴보면 쉽게 이해하실 것입니다.

import unittest

# 이것은 테스트하려는 클래스입니다. 따라서 이를 가져와야 합니다.
import Person as PersonClass


class Test(unittest.TestCase):
    """
    The basic class that inherits unittest.TestCase
    """
    person = PersonClass.Person()  # instantiate the Person Class
    user_id = []  # variable that stores obtained user_id
    user_name = []  # variable that stores person name

    # Person.set_name 함수를 확인하기 위한 테스트 케이스 함수
    def test_0_set_name(self):
        print("Start set_name test\n")
        """
        Any method which starts with ``test_`` will considered as a test case.
        """
        for i in range(4):
            # 이름을 초기화합니다.
            name = 'name' + str(i)
            # 이름을 목록 변수에 저장합니다.
            self.user_name.append(name)
            # 함수에서 얻은 사용자 ID를 가져옵니다.
            user_id = self.person.set_name(name)
            # 가져온 사용자 ID가 널인지 확인합니다.
            self.assertIsNotNone(user_id)  # null user id will fail the test
            # 사용자 ID를 목록에 저장합니다.
            self.user_id.append(user_id)
        print("user_id length = ", len(self.user_id))
        print(self.user_id)
        print("user_name length = ", len(self.user_name))
        print(self.user_name)
        print("\nFinish set_name test\n")

    # Person.get_name 함수를 확인하기 위한 테스트 케이스 함수
    def test_1_get_name(self):
        print("\nStart get_name test\n")
        """
        Any method that starts with ``test_`` will be considered as a test case.
        """
        length = len(self.user_id)  # total number of stored user information
        print("user_id length = ", length)
        print("user_name length = ", len(self.user_name))
        for i in range(6):
            # 총 길이를 초과하지 않는 경우 반환된 이름을 확인합니다.
            if i < length:
                # 두 이름이 일치하지 않으면 테스트 케이스가 실패합니다.
                self.assertEqual(self.user_name[i], self.person.get_name(self.user_id[i]))
            else:
                print("Testing for get_name no user test")
                # 길이가 초과되면 '해당 사용자가 없음' 유형의 메시지를 확인합니다.
                self.assertEqual('There is no such user', self.person.get_name(i))
        print("\nFinish get_name test\n")


if __name__ == '__main__':
    # unittest.main()을 시작합니다.
    unittest.main()

unittest 모듈은 테스트 함수를 이름 순서대로 실행하며, 정의된 순서대로 실행되지 않습니다. 그리고 set_name 테스트가 먼저 실행되길 원하기 때문에 테스트 케이스 함수를 test_0_set_nametest_1_get_name으로 이름 지었습니다.

파이썬 단위 테스트 예제 출력

아래 이미지는 단위 테스트 프로그램에서 생성된 출력을 보여줍니다 – 일반 모드와 상세 모드로.

$ python3.6 -m unittest -v PersonTest.Test
test_0_set_name (PersonTest.Test) ... Start set_name test

user_id length =  4
[0, 1, 2, 3]
user_name length =  4
['name0', 'name1', 'name2', 'name3']

Finish set_name test

ok
test_1_get_name (PersonTest.Test) ... 
Start get_name test

user_id length =  4
user_name length =  4
Testing for get_name no user test
Testing for get_name no user test

Finish get_name test

ok

----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
$

파이썬 단위 테스트 튜토리얼은 여기까지입니다. 더 알아보려면 공식 문서를 읽어보세요. 추가 질문이 있으시면 댓글 상자를 사용해주세요. 🙂

Source:
https://www.digitalocean.com/community/tutorials/python-unittest-unit-test-example