Платформа UnitTest - Утверждение

Среда тестирования Python использует встроенную функцию Python assert (), которая проверяет определенное условие. Если утверждение не выполняется, возникает ошибка AssertionError. Затем структура тестирования идентифицирует тест как Failure. Другие исключения обрабатываются как ошибка.

Следующие три набора функций утверждения определены в модуле unittest -

  • Базовые логические утверждения
  • Сравнительные утверждения
  • Утверждения для коллекций

Базовые функции утверждения оценивают, является ли результат операции истинным или ложным. Все методы assert принимаютmsg аргумент, который, если он указан, используется в качестве сообщения об ошибке при сбое.

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

assertEqual(arg1, arg2, msg = None)

Убедитесь, что arg1 и arg2 равны. Если значения не совпадают, тест не пройден.

2

assertNotEqual(arg1, arg2, msg = None)

Проверьте, что arg1 и arg2 не равны. Если значения действительно совпадают, тест не пройден.

3

assertTrue(expr, msg = None)

Проверьте, что expr истинно. Если false, тест не пройден

4

assertFalse(expr, msg = None)

Проверьте, что выражение ложно. Если это правда, тест не пройден

5

assertIs(arg1, arg2, msg = None)

Проверьте, что arg1 и arg2 оценивают один и тот же объект.

6

assertIsNot(arg1, arg2, msg = None)

Проверьте, что arg1 и arg2 не оценивают один и тот же объект.

7

assertIsNone(expr, msg = None)

Проверьте, что expr - None. Если нет, тест не пройден.

8

assertIsNotNone(expr, msg = None)

Проверьте, что expr не равно None. Если нет, тест не пройден

9

assertIn(arg1, arg2, msg = None)

Проверьте, что arg1 находится в arg2 .

10

assertNotIn(arg1, arg2, msg = None)

Убедитесь, что arg1 не входит в arg2 .

11

assertIsInstance(obj, cls, msg = None)

Проверьте, что obj является экземпляром cls

12

assertNotIsInstance(obj, cls, msg = None)

Убедитесь, что obj не является экземпляром cls

Некоторые из вышеуказанных функций утверждения реализованы в следующем коде -

import unittest

class SimpleTest(unittest.TestCase):
   def test1(self):
      self.assertEqual(4 + 5,9)
   def test2(self):
      self.assertNotEqual(5 * 2,10)
   def test3(self):
      self.assertTrue(4 + 5 == 9,"The result is False")
   def test4(self):
      self.assertTrue(4 + 5 == 10,"assertion fails")
   def test5(self):
      self.assertIn(3,[1,2,3])
   def test6(self):
      self.assertNotIn(3, range(5))

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

Когда приведенный выше сценарий запущен, test2, test4 и test6 покажут сбой, а остальные будут выполнены успешно.

FAIL: test2 (__main__.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
   File "C:\Python27\SimpleTest.py", line 9, in test2
      self.assertNotEqual(5*2,10)
AssertionError: 10 == 10

FAIL: test4 (__main__.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
   File "C:\Python27\SimpleTest.py", line 13, in test4
      self.assertTrue(4+5==10,"assertion fails")
AssertionError: assertion fails

FAIL: test6 (__main__.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
   File "C:\Python27\SimpleTest.py", line 17, in test6
      self.assertNotIn(3, range(5))
AssertionError: 3 unexpectedly found in [0, 1, 2, 3, 4]

----------------------------------------------------------------------            
Ran 6 tests in 0.001s                                                             
                                                                                  
FAILED (failures = 3)

Второй набор функций утверждения: comparative asserts −

  • assertAlmostEqual (первое, второе, места = 7, сообщение = Нет, дельта = Нет)

    Проверьте, что первое и второе приблизительно (или не приблизительно) равны, вычислив разницу, округлив до заданного количества десятичных знаков (по умолчанию 7),

  • assertNotAlmostEqual (первое, второе, места, сообщение, дельта)

    Проверьте, что первое и второе не примерно равны, вычислив разницу, округлив до заданного количества десятичных знаков (по умолчанию 7) и сравнив с нулем.

    В обеих приведенных выше функциях, если вместо разрядов указывается дельта, то разница между первой и второй должна быть меньше или равна (или больше) дельты.

    Предоставление и дельты, и мест вызывает ошибку TypeError.

  • assertGreater (первый, второй, сообщение = Нет)

    Проверьте, что первое больше второго в зависимости от имени метода. В противном случае тест не состоится.

  • assertGreaterEqual (первый, второй, сообщение = Нет)

    Проверьте, что первое больше или равно второму в зависимости от имени метода. Если нет, тест не пройдёт

  • assertLess (первый, второй, сообщение = Нет)

    Проверьте, что первое меньше второго в зависимости от имени метода. Если нет, тест не пройдёт

  • assertLessEqual (первый, второй, сообщение = Нет)

    Проверьте, что первое меньше или равно второму в зависимости от имени метода. В противном случае тест не состоится.

  • assertRegexpMatches (текст, регулярное выражение, сообщение = Нет)

    Убедитесь, что поиск по регулярному выражению соответствует тексту. В случае сбоя в сообщении об ошибке будет шаблон и текст. regexp может быть объектом регулярного выражения или строкой, содержащей регулярное выражение, подходящее для использованияre.search().

  • assertNotRegexpMatches (текст, регулярное выражение, сообщение = Нет)

    Проверяет, что поиск по регулярному выражению не соответствует тексту . Сбой с сообщением об ошибке, включая шаблон и соответствующую часть текста . regexp может быть объектом регулярного выражения или строкой, содержащей регулярное выражение, подходящее для использования re.search () .

Функции утверждения реализованы в следующем примере -

import unittest
import math
import re

class SimpleTest(unittest.TestCase):
   def test1(self):
      self.assertAlmostEqual(22.0/7,3.14)
   def test2(self):
      self.assertNotAlmostEqual(10.0/3,3)
   def test3(self):
      self.assertGreater(math.pi,3)
   def test4(self):
      self.assertNotRegexpMatches("Tutorials Point (I) Private Limited","Point")

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

Приведенный выше сценарий сообщает test1 и test4 как Failure. В test1 деление 22/7 находится вне 7 десятичных знаков 3,14. Точно так же, поскольку второй аргумент совпадает с текстом в первом аргументе, test4 приводит к AssertionError.

=====================================================FAIL: test1 (__main__.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
   File "asserttest.py", line 7, in test1
      self.assertAlmostEqual(22.0/7,3.14)
AssertionError: 3.142857142857143 != 3.14 within 7 places
================================================================
FAIL: test4 (__main__.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
   File "asserttest.py", line 13, in test4
      self.assertNotRegexpMatches("Tutorials Point (I) Private Limited","Point")
AssertionError: Regexp matched: 'Point' matches 'Point' in 'Tutorials Point (I)
Private Limited'
----------------------------------------------------------------------

Ran 4 tests in 0.001s                                                             
                                                                                  
FAILED (failures = 2)

Утверждение для коллекций

Этот набор функций assert предназначен для использования с типами данных коллекции в Python, такими как List, Tuple, Dictionary и Set.

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

assertListEqual (list1, list2, msg = None)

Проверяет, что два списка равны. Если нет, создается сообщение об ошибке, в котором показаны только различия между ними.

2

assertTupleEqual (tuple1, tuple2, msg = None)

Проверяет, что два кортежа равны. Если нет, создается сообщение об ошибке, в котором показаны только различия между ними.

3

assertSetEqual (set1, set2, msg = None)

Проверяет, что два набора равны. В противном случае создается сообщение об ошибке, в котором перечислены различия между наборами.

4

assertDictEqual (expected, actual, msg = None)

Проверьте, что два словаря равны. В противном случае создается сообщение об ошибке, показывающее различия в словарях.

В следующем примере реализуются вышеуказанные методы -

import unittest

class SimpleTest(unittest.TestCase):
   def test1(self):
      self.assertListEqual([2,3,4], [1,2,3,4,5])
   def test2(self):
      self.assertTupleEqual((1*2,2*2,3*2), (2,4,6))
   def test3(self):
      self.assertDictEqual({1:11,2:22},{3:33,2:22,1:11})

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

В приведенном выше примере test1 и test3 показывают AssertionError. Сообщение об ошибке отображает различия в объектах List и Dictionary.

FAIL: test1 (__main__.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
   File "asserttest.py", line 5, in test1
      self.assertListEqual([2,3,4], [1,2,3,4,5])
AssertionError: Lists differ: [2, 3, 4] != [1, 2, 3, 4, 5]

First differing element 0:
2
1

Second list contains 2 additional elements.
First extra element 3:
4

- [2, 3, 4]
+ [1, 2, 3, 4, 5]
? +++       +++

FAIL: test3 (__main__.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
   File "asserttest.py", line 9, in test3
      self.assertDictEqual({1:11,2:22},{3:33,2:22,1:11})
AssertionError: {1: 11, 2: 22} != {1: 11, 2: 22, 3: 33}
- {1: 11, 2: 22}
+ {1: 11, 2: 22, 3: 33}
?              +++++++
                                                                                  
----------------------------------------------------------------------            
Ran 3 tests in 0.001s                                                             
                                                                                  
FAILED (failures = 2)