Python Unittest 튜토리얼 - ohipark/btstack GitHub Wiki

참고문서


개요

단위 테스트는 소프트웨어의 가장 작은 테스트 가능한 부분을 테스트하는 소프트웨어 테스트의 첫 번째 수준입니다. 이는 각 소프트웨어 단위가 설계대로 수행되는지 확인하는 데 사용됩니다. 단위 테스트 테스트 프레임워크는 Python xUnit 스타일 프레임워크입니다. 이 글에서는 예제를 통해 단위 테스트 프레임워크에 대해 알아보겠습니다.


목차



Python Unittest란 무엇인가요 ?

Python Unittest는 코드의 기능을 보다 체계적이고 조직적으로 테스트하기 위한 도구 세트를 제공하는 내장 테스트 프레임워크입니다. Unittest 프레임워크를 사용하면 테스트 케이스, 픽스처, 스위트를 만들어 코드가 예상대로 작동하는지 확인할 수 있습니다. 이를 통해 입력, 출력, 에지 케이스와 같이 코드의 다양한 측면을 확인하는 클래스 내에서 테스트 메서드를 작성할 수 있습니다. 또한 테스트 검색을 지원하여 프로젝트 전체에서 테스트 실행을 자동화하기 쉽습니다.

처음으로


왜 Python에서 Unittest를 선택해야 하나요 ?

개발자는 종종 Python의 unittest 프레임워크를 기본 제공 특성, 널리 알려진 친숙성, 포괄적인 기능, 다른 도구와의 원활한 통합, 입증된 안정성 때문에 선택합니다. Python의 표준 라이브러리의 일부인 unittest는 추가 설치가 필요 없어 쉽게 접근할 수 있습니다. 단위 테스트는 테스트 관행의 일관성을 촉진하여 협업과 유지 관리를 돕습니다. Pytest 및 nose와 같은 다른 프레임워크가 대안을 제공하지만 unittest는 안정성과 다양성으로 여전히 인기 있는 선택입니다.

처음으로


Python Unittest 프레임워크의 Assert 메서드

unittest에는 변수의 값, 유형 및 존재를 단언하는 많은 메서드가 있습니다. 단언을 작성하는 데 일반적으로 사용되는 메서드 중 일부는 다음과 같습니다.

방법 설명
.a, b와 같음을 주장합니다. a 와 같은지 확인합니다 . b표현식과 유사합니다 .a == b
.참(x)를 주장합니다. 의 부울 값이 x True이고 bool(x) is True.과 동일하다고 주장합니다.
.a, b인스턴스임을 주장합니다. 표현식과 유사하게 a 클래스의 인스턴스임을 주장합니다 .bisinstance(a, b)
.assertIsNone(x) None이 되도록 보장합니다. 이는 x 표현식과 유사합니다 x is None.
.거짓을 주장하다(x) 와 유사하게 부울 값이 x False임을 주장합니다 bool(x) is False.
.assertIs(a, b) a 와 동일한 지 확인합니다 . 이는 b표현식과 유사합니다 .a is b
.a, b에서 주장 a 의 멤버인지 확인합니다 . b이는 표현식과 유사합니다 .a in b

처음으로


Unittest 프레임워크에서 지원하는 OOP 개념

화이트 박스 테스트 방법은 단위 테스트에 사용됩니다. 다음은 Unitttest 프레임워크에서 지원하는 oops 개념 중 일부입니다.

  • 테스트 픽스처: 테스트 픽스처는 테스트를 실행하기 위한 기준으로 사용되어 테스트가 실행되는 고정된 환경이 있는지 확인하고 결과를 반복할 수 있도록 합니다. 예:
    • 임시 데이터베이스를 만듭니다.
    • 서버 프로세스를 시작합니다.
  • 테스트 케이스: 테스트 케이스는 테스트 중인 시스템이 올바르게 작동하는지 확인하는 데 사용되는 조건의 집합입니다.
  • 테스트 모음: 테스트 모음은 소프트웨어 프로그램을 테스트하여 특정 동작 집합을 가지고 있는지 확인하기 위해 통합된 테스트를 함께 실행하는 테스트 사례 모음입니다.
  • 테스트 러너: 테스트 러너는 테스트 실행을 설정하고 사용자에게 결과를 제공하는 구성요소입니다.

처음으로


Python Unittest를 사용한 단위 테스트 예제

이제 Python Unittest 프레임워크를 사용하여 단위 테스트 예제를 구현해보겠습니다.

예제 1

[./src/unitTestExam_1.py, ./test/test_UnitTestExam_1.py]

  • 테스트 대상 함수 : add() 함수(여기서는 두 개의 숫자를 받아서 합을 반환하는 간단한 함수를 작성합니다.
  • TestAddFunction : 상속하는 테스트 케이스 클래스가 포함됩니다.
  • unittest.TestCase : 이 클래스 내에서 세 가지 테스트 메서드가 정의되어 함수의 다양한 시나리오를 검증합니다.
unitTestExam_1.py
def add(a, b):
    return a + b
test_UnitTestExam_1.py
import sys,os
os.chdir(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(os.path.abspath('../src'))
from unitTestExam_1 import add
import unittest

class TestAddFunction(unittest.TestCase):
    def test_add_positive_numbers(self):
        self.assertEqual(add(1, 2), 3)

    def test_add_negative_numbers(self):
        self.assertEqual(add(-1, -2), -3)

    def test_add_mixed_numbers(self):
        self.assertEqual(add(1, -2), -1)
        self.assertEqual(add(-1, 2), 1)

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

이것은 단일 테스트를 갖는 unittest 프레임워크를 사용하는 기본 테스트 코드입니다.
이 test() 메서드는 결과가 TRUE면 성공이고, FALSE이면 실패합니다.

이제 Python에서 Unittest 파일을 실행하는 방법을 살펴보겠습니다.
단위 테스트를 실행하려면 터미널에서 test폴더로 이동하여 다음 명령을 실행하세요.

python test_UnitTestExam_1.py

다음은 실행 결과 입니다.

...
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK

3개 테스트 실행 성공입니다.

그러나 예를 들어, test_add_positive_numbers 에서 예상 값을 3에서 2로 변경하면 테스트는 실패하고 다음과 같은 출력이 나옵니다.

  • 실패 예제를 위해 수정된 코드
...
    def test_add_positive_numbers(self):
        self.assertEqual(add(1, 2), 2)
...
  • 실패에 대한 출력 값
..F
======================================================================
FAIL: test_add_positive_numbers (__main__.TestAddFunction)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "c:/00/devProj/python/unitTestExample/unitTestExam_1/test/test_UnitTestExam_1.py", line 9, in test_add_positive_numbers
    self.assertEqual(add(1, 2), 2)
AssertionError: 3 != 2

----------------------------------------------------------------------
Ran 3 tests in 0.001s

FAILED (failures=1)

여기서 출력의 첫 번째 줄에 있는 "."는 테스트가 통과되었음을 의미합니다.
테스트를 실행하는 동안 명령줄에 "-v" 옵션을 추가하여 더 자세한 테스트 결과를 얻을 수 있습니다.

  • 상세한 정보요청 실행 예제
> python test_UnitTestExam_1.py -v
  • 상세한 정보요청 실행 결과
test_add_mixed_numbers (__main__.TestAddFunction) ... ok
test_add_negative_numbers (__main__.TestAddFunction) ... ok
test_add_positive_numbers (__main__.TestAddFunction) ... FAIL

======================================================================
FAIL: test_add_positive_numbers (__main__.TestAddFunction)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_UnitTestExam_1.py", line 9, in test_add_positive_numbers
    self.assertEqual(add(1, 2), 2)
AssertionError: 3 != 2

----------------------------------------------------------------------
Ran 3 tests in 0.001s

FAILED (failures=1)

단위 테스트에서 가능한 결과는 가능한 테스트 결과에는 세 가지 유형이 있습니다.

  • 상세한 테스트 실행 확인
    • 확인 – 이는 모든 테스트에 통과했다는 것을 의미합니다.
    • FAIL – 이는 테스트가 통과되지 않았고 AssertionError 예외가 발생했음을 의미합니다.
    • ERROR – 이는 테스트가 AssertionError 이외의 예외를 발생시킨다는 것을 의미합니다.

단위 테스트 프레임워크 구현을 이해하기 위해 또 다른 예제를 살펴보겠습니다.

예제 2

[./test/test_UnitTestExam_2.py]

import unittest

class TestStringMethods(unittest.TestCase):

    def setUp(self):
        pass

    # Returns True if the string contains 4 a.
    def test_strings_a(self):
        self.assertEqual('a'*4, 'aaaa')

    # Returns True if the string is in upper case.
    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_strip(self):
        s = 'geeksforgeeks'
        self.assertEqual(s.strip('geek'), 'sforgeeks')

    # Returns true if the string splits and matches
    # the given output.
    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        with self.assertRaises(TypeError):
            s.split(2)

if __name__ == '__main__':
    unittest.main()
  • unittest.TestCase 는 서브클래싱하여 테스트 케이스를 만드는 데 사용됩니다. 맨 아래에 있는 코드의 마지막 블록을 사용하면 파일을 실행하기만 해도 모든 테스트를 실행할 수 있습니다.

    • assertEqual() – 이 명령문은 얻은 결과가 예상 결과와 같은지 확인하는 데 사용됩니다.
    • assertTrue() / assertFalse() – 이 문장은 주어진 문장이 참인지 거짓인지 확인하는 데 사용됩니다.
    • assertRaises() – 이 명령문은 특정 예외를 발생시키는 데 사용됩니다.
  • 테스트 설명

    • test_strings_a (): 이 테스트는 문자 'a'를 숫자 'x'로 곱한 문자열의 속성을 테스트하는 데 사용됩니다. 출력은 x 곱하기 'a'입니다. 이 경우 assertEqual() 문은 결과가 주어진 출력과 일치하면 true를 반환합니다.
    • test_upper (): 이 테스트는 주어진 문자열이 대문자로 변환되었는지 확인하는 데 사용됩니다.
      assertEqual() 문은 반환된 문자열이 대문자이면 true를 반환합니다.
    • test_isupper (): 이 테스트는 문자열의 속성을 테스트하는 데 사용되며 문자열이 대문자이면 TRUE를 반환하고 그렇지 않으면 False를 반환합니다.
      이 검증에는 assertTrue() / assertFalse() 문이 사용됩니다.
    • test_strip (): 이 테스트는 함수에서 전달된 모든 문자가 문자열에서 제거되었는지 확인하는 데 사용됩니다.
      assertEqual() 문은 문자열이 제거되고 주어진 출력과 일치하면 true를 반환합니다.
    • test_split( ): 이 테스트는 문자열의 split 함수를 확인하는 데 사용됩니다.
      이 함수는 함수에서 전달된 인수를 통해 문자열을 분할하고 결과를 목록으로 반환합니다.
      이 경우 assertEqual() 문은 결과가 주어진 출력과 일치하면 true를 반환합니다.
    • unittest.main()은 테스트 스크립트에 대한 명령줄 인터페이스를 제공합니다. 명령줄에서 위의 스크립트를 실행하면 다음 출력이 생성됩니다.
.....
----------------------------------------------------------------------
Ran 5 tests in 0.000s

OK

처음으로


자주 묻는 질문

  • Unitest와 Pytest의 차이점은 무엇인가요?
    Unittest는 xUnit 스타일을 따르는 Python의 기본 제공 테스트 프레임워크입니다. 검증을 위한 테스트와 어설션을 구성하기 위해 클래스와 메서드에 의존하는 반면 Pytest는 보다 간결한 구문, 강력한 픽스처, 매개변수화된 테스트 및 플러그인 지원과 같은 고급 기능을 제공하는 타사 테스트 프레임워크입니다. Pytest는 종종 단순성과 유연성으로 선호되어 테스트를 작성하고 유지 관리하기가 더 쉽습니다.

  • Python 단위 테스트 파일을 어디에 넣어야 하나요?
    Python에서 단위 테스트 파일은 일반적으로 테스트하는 모듈이나 패키지 옆에 배치됩니다. 종종 또는 test_module.pytest_package/와 같이 이름이 test_로 시작합니다 . 이 설정은 테스트를 쉽게 찾을 수 있게 하고 unittest나 Pytest와 같은 테스트 프레임워크와 원활하게 통합하여 자동으로 찾아서 실행할 수 있습니다.

처음으로


⚠️ **GitHub.com Fallback** ⚠️