Python 단위 테스트 설정
단위 테스트는 특정 코드 단위 또는 모듈이 개발자가 예상한 대로 작동하는지 확인합니다. 대부분의 경우 우리가 테스트하는 코드 단위는 함수입니다.
마찬가지로 모든 기능을 테스트할 수 있습니다. 모범 사례로서 적어도 개발 프로세스에서는 단위 테스트를 수행해야 합니다.
그래서 개발 초기 단계에서 버그를 감지하고 많은 시간을 들이지 않고도 수정할 수 있습니다. 이러한 테스트를 건너뛰면 프로젝트를 계속 진행할 때 오류를 수정하기 어렵습니다.
파이썬 unittest
설정
Python은 unittest
라는 단위 테스트를 위한 다른 프레임워크를 제공합니다. unittest
프레임워크는 몇 가지 기능을 제공합니다.
이 방법을 사용하여 수행하는 테스트는 서로 독립적입니다. 즉, 테스트의 성공 또는 실패는 다른 테스트 결과에 의존하지 않습니다.
또한 setup()
및 teardown()
기능과 테스트 자동화를 제공합니다. setup()
함수를 사용하면 각 테스트 메서드 전에 실행할 명령을 설정할 수 있습니다.
teardown()
함수는 각 테스트 방법 후에 실행되는 지침을 설명합니다.
unittest
는 테스트 픽스처, 테스트 케이스, 테스트 스위트 및 테스트 러너와 같은 단위 테스트에서 사용할 몇 가지 필수 개념을 제공합니다. 이 문서에서는 unittest
프레임워크를 사용하여 단위 테스트를 위한 setup()
함수를 빌드하는 방법에 대해 설명합니다.
테스트할 함수 만들기
먼저 테스트할 몇 가지 기능을 빌드해야 합니다. 두 수를 더하고, 빼고, 곱하고, 나누고, 나머지를 구하는 네 가지 함수를 만들어 봅시다.
def add(a, b):
return a + b
def subtract(a, b):
return a - b
def multiply(a, b):
return a * b
def divide(a, b):
return a / b
def remainder(a, b):
return a % b
print()
기능을 사용하여 위의 기능을 테스트할 수 있지만 수백 또는 수천 개의 코드에 대해서는 그다지 실용적이지 않습니다. 이제 함수를 테스트하기 위한 모듈을 만들어 봅시다.
테스트 모듈 생성
명명 규칙에 따라 테스트 모듈의 이름을 지정해야 합니다. 이름의 첫 번째 부분으로 test_
를 사용한 다음 모듈 이름을 사용합니다.
이 튜토리얼을 위한 테스트 모듈을 test_calc.py
로 생성해 봅시다.
명명 규칙:
test_ < name >
그런 다음 unittest
프레임워크와 numCal
모듈을 테스트 모듈로 가져와야 합니다. unittest
는 이를 표준 라이브러리에 포함하므로 직접 가져올 수 있습니다. numCal
은 테스트해야 하는 모듈입니다.
import unittest
import numCal
다음 단계로 unittest.TestCase
를 상속하는 클래스를 생성하여 해당 클래스 내에서 더 많은 테스트 기능에 액세스할 수 있습니다.
class TestNumCal(unittest.TestCase):
클래스 내에서 각 함수에 대한 메서드를 만듭니다. 메서드 이름을 지정할 때 명명 규칙에 따라 메서드 이름을 지정해야 합니다.
테스트 모듈을 실행하면 이름의 첫 번째 부분이 테스트이기 때문에 어떤 메서드가 테스트를 나타내는지 알게 됩니다. 그렇지 않으면 테스트 방법을 식별하지 않고 건너뜁니다.
먼저 add()
함수에 대한 테스트 메서드를 생성해 보겠습니다.
def test_add(self):
self.assertEqual(numCal.add(10, 5), 15)
모든 메서드에서와 마찬가지로 self
는 test_add()
메서드의 첫 번째 인수입니다. 두 번째 줄에서 assertEqual()
메서드를 사용했습니다.
TestNumCal
클래스는 unittest.TestCase
에서 상속되므로 사용 가능한 모든 assert 메서드에 액세스할 수 있습니다. assertEqual()
, assertNotEqual()
, assertTrue()
, assertFalse()
및 assertIn()
과 같은 메서드는 단위 테스트에 사용할 수 있으며 훨씬 더 많습니다.
assertEqual()
메서드는 함수에서 반환되는 값과 우리가 기대하는 값이 같은지 확인합니다.
그런 다음 편집기에서 직접 실행되도록 테스트 모듈을 설정해야 합니다. 그렇지 않으면 테스트 모듈을 실행하려고 할 때 실행되지 않습니다.
이를 위해 아래 코드를 사용할 수 있습니다.
if __name__ == "__main__":
unittest.main()
이제 코드는 다음과 같아야 합니다.
import unittest
import numCal
class TestNumCal(unittest.TestCase):
def test_add(self):
self.assertEqual(numCal.add(10, 5), 15)
if __name__ == "__main__":
unittest.main()
이제 test_calc.py
모듈을 실행하여 add()
기능을 테스트할 수 있습니다.
출력:
여기서 점은 테스트가 통과했음을 나타냅니다. 테스트에 실패하면 F
가 표시되고 오류가 있으면 오류 메시지가 나타납니다.
아래에서 점은 테스트된 장치 수를 나타냅니다.
이제 나머지 기능을 테스트하기 위해 4개의 테스트 메서드를 더 만들어 보겠습니다.
import unittest
import numCal
class TestNumCal(unittest.TestCase):
def test_add(self):
self.assertEqual(numCal.add(10, 5), 15)
def test_subtract(self):
self.assertEqual(numCal.subtract(10, 5), 5)
def test_multiply(self):
self.assertEqual(numCal.multiply(10, 5), 50)
def test_divide(self):
self.assertEqual(numCal.divide(10, 5), 2)
def test_remainder(self):
self.assertEqual(numCal.remainder(10, 5), 0)
if __name__ == "__main__":
unittest.main()
각 기능에 따라 테스트 메서드 이름을 변경해야 합니다.
출력:
여기서 어려운 부분은 각 테스트 방법에서 설정해야 하는 각 기능의 값입니다. 수백 가지 테스트 방법이 있으면 문제가 됩니다.
값을 변경해야 하는 경우 각 테스트 방법을 검토하고 변경해야 합니다.
이를 극복하기 위해 setup()
함수를 만들 수 있습니다. 이 방법을 통해 값을 한 번만 선언하면 됩니다. 그런 다음 각 메서드 전에 실행됩니다.
setUp()
함수 생성
def setUp(self):
print("\nsetUp")
self.num1 = 10
self.num2 = 5
setup()
함수를 설정한 후 함수의 인수도 변경해야 합니다. 먼저 test_add
메서드를 변경해 보겠습니다.
def test_add(self):
print("Add")
self.assertEqual(numCal.add(self.num1, self.num2), 15)
위에서 언급했듯이 나머지 메서드를 변경할 수 있으며 전체 코드는 아래와 같아야 합니다.
전체 코드:
import unittest
import numCal
class TestNumCal(unittest.TestCase):
def setUp(self):
print("\nsetUp")
self.num1 = 10
self.num2 = 5
def test_add(self):
print("Add")
self.assertEqual(numCal.add(self.num1, self.num2), 15)
def test_subtract(self):
print("Subtract")
self.assertEqual(numCal.subtract(self.num1, self.num2), 5)
def test_multiply(self):
print("Multiply")
self.assertEqual(numCal.multiply(self.num1, self.num2), 50)
def test_divide(self):
print("Divide")
self.assertEqual(numCal.divide(self.num1, self.num2), 2)
def test_remainder(self):
print("remainder")
self.assertEqual(numCal.remainder(self.num1, self.num2), 0)
if __name__ == "__main__":
unittest.main()
출력:
출력에서 5개의 점은 테스트가 통과되었음을 나타내고 실행된 테스트 수를 나타냅니다. 그 아래에는 각 테스트 전에 값이 설정되었습니다. 이를 식별하기 위해 print()
함수를 넣었습니다.
따라서 테스트 메서드가 시작되기 전에 setup()
함수는 정의된 명령을 실행하고 테스트는 이를 사용하여 발생합니다.
결론
이번 글에서는 유닛 테스팅과 unittest
프레임워크가 무엇인지, 그리고 테스트 모듈을 어떻게 빌드하는지 알아보았습니다. 가장 중요한 것은 setup()
함수를 사용하여 각 테스트 메서드 전에 실행할 일부 정의된 명령을 설정하는 방법을 배웠습니다.
setup()
함수는 실행할 테스트가 많고 인수 값을 변경해야 할 때 유용합니다.
Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.