UnitTest Framework - API

В этой главе обсуждаются классы и методы, определенные в модуле unittest. В этом модуле пять основных классов.

TestCase Класс

Объект этого класса представляет собой наименьшую тестируемую единицу. Он содержит процедуры тестирования и предоставляет крючки для подготовки каждой процедуры и для последующей очистки.

В классе TestCase определены следующие методы:

Sr.No. Метод и описание
1

setUp()

Метод, вызываемый для подготовки тестового прибора. Это вызывается непосредственно перед вызовом тестового метода.

2

tearDown()

Метод вызывается сразу после вызова метода тестирования и записи результата. Это вызывается, даже если тестовый метод вызвал исключение,

3

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)

Класс Fixture

Класс TestCase имеет метод setUpClass (), который можно переопределить для выполнения перед выполнением отдельных тестов внутри класса TestCase. Точно так же метод 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 предоставляет полезный механизм, с помощью которого экземпляры тестовых примеров могут быть сгруппированы вместе в соответствии с тестируемыми функциями. Этот механизм предоставляется классом TestSuite в модуле unittest.

Следующие шаги связаны с созданием и запуском набора тестов.

Step 1 - Создайте экземпляр класса TestSuite.

suite = unittest.TestSuite()

Step 2 - Добавить тесты внутри класса 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.No. Метод и описание
1

addTest()

Добавляет метод тестирования в набор тестов.

2

addTests()

Добавляет тесты из нескольких классов TestCase.

3

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)

Вы можете поэкспериментировать с методом addTest (), раскомментировав строки и оператор комментария с методом makeSuite ().

TestLoader Класс

В пакете unittest есть класс TestLoader, который используется для создания наборов тестов из классов и модулей. По умолчанию экземпляр unittest.defaultTestLoader создается автоматически при вызове метода unittest.main (0. Явный экземпляр, однако, позволяет настраивать определенные свойства.

В следующем коде тесты из двух классов собираются в список с помощью объекта TestLoader.

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 -

Старший Нет Метод и описание
1

loadTestsFromTestCase()

Вернуть набор всех тестов, содержащихся в классе TestCase

2

loadTestsFromModule()

Вернуть набор всех тестов, содержащихся в данном модуле.

3

loadTestsFromName()

Вернуть набор всех тестовых случаев с указанием строкового спецификатора.

4

discover()

Найдите все тестовые модули, рекурсивно переходя в подкаталоги из указанного начального каталога, и верните объект TestSuite.

TestResult Класс

Этот класс используется для сбора информации об успешных и неудачных тестах. Объект TestResult хранит результаты набора тестов. Экземпляр TestResult возвращается методом TestRunner.run ().

Экземпляры TestResult имеют следующие атрибуты -

Sr.No. Атрибут и описание
1

Errors

Список, содержащий 2 кортежа экземпляров TestCase и строк, содержащих отформатированные трассировки. Каждый кортеж представляет собой тест, вызвавший непредвиденное исключение.

2

Failures

Список, содержащий 2 кортежа экземпляров TestCase и строк, содержащих отформатированные трассировки. Каждый кортеж представляет собой тест, в котором с помощью методов TestCase.assert * () явным образом сообщается об ошибке.

3

Skipped

Список, содержащий двухкортежные экземпляры TestCase и строки, содержащие причину пропуска теста.

4

wasSuccessful()

Верните True, если все запущенные тесты прошли успешно, в противном случае возвращает False.

5

stop()

Этот метод может быть вызван, чтобы сигнализировать, что набор выполняемых тестов должен быть прерван.

6

startTestRun()

Вызывается один раз перед выполнением любых тестов.

7

stopTestRun()

Вызывается один раз после выполнения всех тестов.

8

testsRun

Общее количество выполненных тестов.

9

Buffer

Если установлено значение true, sys.stdout и sys.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