Учебники

UnitTest Framework — API

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

TestCase Class

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

Следующие методы определены в классе TestCase —

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

настроить()

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

2

срывать()

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

3

setUpClass ()

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

4

tearDownClass ()

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

5

запустить (результат = нет)

Запустите тест, собирая результат в объект результата теста, переданный как результат .

6

skipTest (причина)

Вызов этого во время тестового метода или setUp () пропускает текущий тест.

7

отладки ()

Запустите тест, не собирая результат.

8

Краткое описание()

Возвращает однострочное описание теста.

настроить()

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

срывать()

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

setUpClass ()

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

tearDownClass ()

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

запустить (результат = нет)

Запустите тест, собирая результат в объект результата теста, переданный как результат .

skipTest (причина)

Вызов этого во время тестового метода или setUp () пропускает текущий тест.

отладки ()

Запустите тест, не собирая результат.

Краткое описание()

Возвращает однострочное описание теста.

арматура

В классе TestCase могут быть написаны многочисленные тесты. Эти методы тестирования могут потребовать подключения к базе данных, временных файлов или других ресурсов для инициализации. Это так называемые светильники. TestCase включает специальный хук для настройки и очистки любых приборов, необходимых для ваших тестов. Чтобы настроить приборы, переопределите setUp (). Чтобы очистить, переопределите tearDown ().

В следующем примере два теста написаны внутри класса TestCase. Они проверяют результат сложения и вычитания двух значений. Метод setup () инициализирует аргументы на основе shortDescription () каждого теста. Метод teardown () будет выполняться в конце каждого теста.

Live Demo

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 имеет метод 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 Class

Среда тестирования Python предоставляет полезный механизм, с помощью которого экземпляры тестовых примеров можно группировать в соответствии с функциями, которые они тестируют. Этот механизм доступен классу TestSuite в модуле unittest.

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

Шаг 1 — Создайте экземпляр класса TestSuite.

suite = unittest.TestSuite()

Шаг 2 — Добавьте тесты внутри класса TestCase в комплекте.

suite.addTest(testcase class)

Шаг 3 — Вы также можете использовать метод makeSuite () для добавления тестов из класса

suite = unittest.makeSuite(test case class)

Шаг 4 — Индивидуальные тесты также могут быть добавлены в комплект.

suite.addTest(testcaseclass(""testmethod")

Шаг 5 — Создайте объект класса TestTestRunner.

runner = unittest.TextTestRunner()

Шаг 6 — Вызовите метод run (), чтобы запустить все тесты в комплекте

runner.run (suite)

Следующие методы определены в классе TestSuite —

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

addTest ()

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

2

addTests ()

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

3

бежать()

Запускает тесты, связанные с этим пакетом, собирая результат в объект результата теста

4

отладки ()

Запускает тесты, связанные с этим набором, без сбора результатов.

5

countTestCases ()

Возвращает количество тестов, представленных этим тестовым объектом

addTest ()

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

addTests ()

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

бежать()

Запускает тесты, связанные с этим пакетом, собирая результат в объект результата теста

отладки ()

Запускает тесты, связанные с этим набором, без сбора результатов.

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 Class

Пакет 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 —

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

loadTestsFromTestCase ()

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

2

loadTestsFromModule ()

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

3

loadTestsFromName ()

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

4

обнаружить()

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

loadTestsFromTestCase ()

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

loadTestsFromModule ()

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

loadTestsFromName ()

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

обнаружить()

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

TestResult Class

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

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

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

ошибки

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

2

Отказы

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

3

Пропущенные

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

4

Был успешен()

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

5

стоп()

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

6

startTestRun ()

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

7

stopTestRun ()

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

8

testsRun

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

9

буфер

Если установлено значение true, sys.stdout и sys.stderr будут помещаться в буфер между вызываемыми startTest () и stopTest () .

ошибки

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

Отказы

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

Пропущенные

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

Был успешен()

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

стоп()

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

startTestRun ()

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

stopTestRun ()

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

testsRun

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

буфер

Если установлено значение 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"

Код при выполнении отображает следующий вывод —