UnitTest 프레임 워크-API

이 장에서는 unittest 모듈에 정의 된 클래스와 메서드에 대해 설명합니다. 이 모듈에는 5 개의 주요 클래스가 있습니다.

TestCase 클래스

이 클래스의 개체는 테스트 가능한 최소 단위를 나타냅니다. 테스트 루틴을 보관하고 각 루틴을 준비하고 그 이후에 정리할 수있는 후크를 제공합니다.

다음 메소드는 TestCase 클래스에 정의되어 있습니다-

Sr. 아니. 방법 및 설명
1

setUp()

테스트 픽스처를 준비하기 위해 호출 된 메서드입니다. 테스트 메서드를 호출하기 직전에 호출됩니다.

2

tearDown()

테스트 메서드가 호출되고 결과가 기록 된 직후에 메서드가 호출됩니다. 테스트 메서드에서 예외가 발생하더라도 호출됩니다.

setUpClass()

개별 클래스의 테스트가 실행되기 전에 호출되는 클래스 메서드입니다.

4

tearDownClass()

개별 클래스의 테스트가 실행 된 후에 호출되는 클래스 메서드입니다.

5

run(result = None)

로 전달 된 테스트 결과 객체로 결과를 수집, 테스트를 실행 결과 .

6

skipTest(reason)

테스트 메서드 또는 setUp () 중에 이것을 호출하면 현재 테스트를 건너 뜁니다.

7

debug()

결과를 수집하지 않고 테스트를 실행하십시오.

8

shortDescription()

테스트에 대한 한 줄 설명을 반환합니다.

비품

TestCase 클래스 내에 작성된 수많은 테스트가있을 수 있습니다. 이러한 테스트 방법을 초기화하려면 데이터베이스 연결, 임시 파일 또는 기타 리소스가 필요할 수 있습니다. 이를 조명기라고합니다. TestCase에는 테스트에 필요한 픽스처를 구성하고 정리하는 특수 후크가 포함되어 있습니다. 조명기를 구성하려면 setUp ()을 재정의하십시오. 정리하려면 tearDown ()을 재정의하십시오.

다음 예제에서는 TestCase 클래스 내에 두 개의 테스트가 작성됩니다. 두 값의 덧셈과 뺄셈 결과를 테스트합니다. setup () 메서드는 각 테스트의 shortDescription ()을 기반으로 인수를 초기화합니다. teardown () 메서드는 각 테스트가 끝날 때 실행됩니다.

import unittest

class simpleTest2(unittest.TestCase):
   def setUp(self):
      self.a = 10
      self.b = 20
      name = self.shortDescription()
      if name == "Add":
         self.a = 10
         self.b = 20
         print name, self.a, self.b
      if name == "sub":
         self.a = 50
         self.b = 60
         print name, self.a, self.b
   def tearDown(self):
      print '\nend of test',self.shortDescription()

   def testadd(self):
      """Add"""
      result = self.a+self.b
      self.assertTrue(result == 100)
   def testsub(self):
      """sub"""
      result = self.a-self.b
      self.assertTrue(result == -10)
      
if __name__ == '__main__':
   unittest.main()

명령 줄에서 위 코드를 실행합니다. 다음과 같은 출력을 제공합니다.

C:\Python27>python test2.py
Add 10 20
F
end of test Add
sub 50 60
end of test sub
.
================================================================
FAIL: testadd (__main__.simpleTest2)
Add
----------------------------------------------------------------------
Traceback (most recent call last):
   File "test2.py", line 21, in testadd
      self.assertTrue(result == 100)
AssertionError: False is not true
----------------------------------------------------------------------
Ran 2 tests in 0.015s

FAILED (failures = 1)

수업 일정

TestCase 클래스에는 TestCase 클래스 내에서 개별 테스트를 실행하기 전에 실행하도록 재정의 할 수있는 setUpClass () 메서드가 있습니다. 마찬가지로 tearDownClass () 메서드는 클래스의 모든 테스트 후에 실행됩니다. 두 메서드 모두 클래스 메서드입니다. 따라서 @classmethod 지시문으로 장식해야합니다.

다음 예제는 이러한 클래스 메서드의 사용을 보여줍니다-

import unittest

class TestFixtures(unittest.TestCase):

   @classmethod
   def setUpClass(cls):
      print 'called once before any tests in class'

   @classmethod
   def tearDownClass(cls):
      print '\ncalled once after all tests in class'

   def setUp(self):
      self.a = 10
      self.b = 20
      name = self.shortDescription()
      print '\n',name
   def tearDown(self):
      print '\nend of test',self.shortDescription()

   def test1(self):
      """One"""
      result = self.a+self.b
      self.assertTrue(True)
   def test2(self):
      """Two"""
      result = self.a-self.b
      self.assertTrue(False)
      
if __name__ == '__main__':
unittest.main()

TestSuite 클래스

Python의 테스트 프레임 워크는 테스트 사례 인스턴스가 테스트하는 기능에 따라 그룹화 될 수있는 유용한 메커니즘을 제공합니다. 이 메커니즘은 unittest 모듈의 TestSuite 클래스에서 사용할 수 있습니다.

다음 단계는 테스트 스위트 작성 및 실행과 관련됩니다.

Step 1 − TestSuite 클래스의 인스턴스를 생성합니다.

suite = unittest.TestSuite()

Step 2 − Suite의 TestCase 클래스 내부에 테스트를 추가합니다.

suite.addTest(testcase class)

Step 3 − 또한 makeSuite () 메서드를 사용하여 클래스에서 테스트를 추가 할 수 있습니다.

suite = unittest.makeSuite(test case class)

Step 4 − 스위트에 개별 테스트를 추가 할 수도 있습니다.

suite.addTest(testcaseclass(""testmethod")

Step 5 − TestTestRunner 클래스의 객체를 생성합니다.

runner = unittest.TextTestRunner()

Step 6 − run () 메서드를 호출하여 스위트의 모든 테스트를 실행합니다.

runner.run (suite)

다음 메소드는 TestSuite 클래스에 정의되어 있습니다-

Sr. 아니. 방법 및 설명
1

addTest()

테스트 스위트에 테스트 메소드를 추가합니다.

2

addTests()

여러 TestCase 클래스에서 테스트를 추가합니다.

run()

이 제품군과 관련된 테스트를 실행하여 테스트 결과 개체에 결과를 수집합니다.

4

debug()

결과를 수집하지 않고이 스위트와 연관된 테스트를 실행합니다.

5

countTestCases()

이 테스트 개체가 나타내는 테스트 수를 반환합니다.

다음 예제는 TestSuite 클래스를 사용하는 방법을 보여줍니다-

import unittest
class suiteTest(unittest.TestCase):
   def setUp(self):
      self.a = 10
      self.b = 20
      
   def testadd(self):
      """Add"""
      result = self.a+self.b
      self.assertTrue(result == 100)
   def testsub(self):
      """sub"""
      result = self.a-self.b
      self.assertTrue(result == -10)
      
def suite():
   suite = unittest.TestSuite()
##   suite.addTest (simpleTest3("testadd"))
##   suite.addTest (simpleTest3("testsub"))
   suite.addTest(unittest.makeSuite(simpleTest3))
   return suite
   
if __name__ == '__main__':
   runner = unittest.TextTestRunner()
   test_suite = suite()
   runner.run (test_suite)

makeSuite () 메서드가있는 줄과 주석 문을 주석 해제하여 addTest () 메서드를 실험 할 수 있습니다.

TestLoader 클래스

unittest 패키지에는 클래스와 모듈에서 테스트 스위트를 만드는 데 사용되는 TestLoader 클래스가 있습니다. 기본적으로 unittest.defaultTestLoader 인스턴스는 unittest.main (0 메서드가 호출 될 때 자동으로 생성됩니다. 그러나 명시 적 인스턴스는 특정 속성을 사용자 지정할 수 있습니다.

다음 코드에서 두 클래스의 테스트는 TestLoader 개체를 사용하여 List에 수집됩니다.

import unittest
testList = [Test1, Test2]
testLoad = unittest.TestLoader()

TestList = []
for testCase in testList:
   testSuite = testLoad.loadTestsFromTestCase(testCase)
   TestList.append(testSuite)
   
newSuite = unittest.TestSuite(TestList)
runner = unittest.TextTestRunner()
runner.run(newSuite)

다음 표는 TestLoader 클래스의 메소드 목록을 보여줍니다-

Sr. 아니요 방법 및 설명
1

loadTestsFromTestCase()

TestCase 클래스에 포함 된 모든 테스트 케이스 모음을 반환합니다.

2

loadTestsFromModule()

주어진 모듈에 포함 된 모든 테스트 케이스 모음을 반환합니다.

loadTestsFromName()

문자열 지정자가 주어진 모든 테스트 케이스를 반환합니다.

4

discover()

지정된 시작 디렉터리에서 하위 디렉터리로 재귀하여 모든 테스트 모듈을 찾고 TestSuite 개체를 반환합니다.

TestResult 클래스

이 클래스는 성공한 테스트와 실패한 테스트에 대한 정보를 컴파일하는 데 사용됩니다. TestResult 개체는 테스트 집합의 결과를 저장합니다. TestResult 인스턴스는 TestRunner.run () 메서드에 의해 반환됩니다.

TestResult 인스턴스에는 다음과 같은 속성이 있습니다.

Sr. 아니. 속성 및 설명
1

Errors

TestCase 인스턴스의 2- 튜플과 형식화 된 트레이스 백을 보유하는 문자열이 포함 된 목록입니다. 각 튜플은 예기치 않은 예외를 발생시킨 테스트를 나타냅니다.

2

Failures

TestCase 인스턴스의 2- 튜플과 형식화 된 트레이스 백을 보유하는 문자열이 포함 된 목록입니다. 각 튜플은 TestCase.assert * () 메서드를 사용하여 실패가 명시 적으로 신호를받은 테스트를 나타냅니다.

Skipped

TestCase 인스턴스의 2 개 튜플과 테스트를 건너 뛰는 이유가 포함 된 문자열이 포함 된 목록입니다.

4

wasSuccessful()

지금까지 실행 된 모든 테스트가 통과되면 True를 반환하고, 그렇지 않으면 False를 반환합니다.

5

stop()

이 메서드를 호출하여 실행중인 테스트 집합을 중단해야 함을 알릴 수 있습니다.

6

startTestRun()

테스트가 실행되기 전에 한 번 호출됩니다.

7

stopTestRun()

모든 테스트가 실행 된 후 한 번 호출됩니다.

8

testsRun

지금까지 실행 된 총 테스트 수입니다.

9

Buffer

true로 설정하면 sys.stdoutsys.stderr호출되는 startTest () 와 stopTest () 사이에 버퍼링됩니다 .

다음 코드는 테스트 스위트를 실행합니다-

if __name__ == '__main__':
   runner = unittest.TextTestRunner()
   test_suite = suite()
   result = runner.run (test_suite)
   
   print "---- START OF TEST RESULTS"
   print result

   print "result::errors"
   print result.errors

   print "result::failures"
   print result.failures

   print "result::skipped"
   print result.skipped

   print "result::successful"
   print result.wasSuccessful()
   
   print "result::test-run"
   print result.testsRun
   print "---- END OF TEST RESULTS"

실행시 코드는 다음 출력을 표시합니다.

---- START OF TEST RESULTS
<unittest.runner.TextTestResult run = 2 errors = 0 failures = 1>
result::errors
[]
result::failures
[(<__main__.suiteTest testMethod = testadd>, 'Traceback (most recent call last):\n
   File "test3.py", line 10, in testadd\n 
   self.assertTrue(result == 100)\nAssert
   ionError: False is not true\n')]
result::skipped
[]
result::successful
False
result::test-run
2
---- END OF TEST RESULTS