Пакет Python's unittest
позволяет структурировать ваши юнит-тесты различными методами, например, вы замечаете. Это полезно в тех случаях, когда вы хотите проверить те вещи, которые очень тесно связаны и не требуют отдельных модульных тестов.
unittest
тесты начинаются с подкласса unittest.Test
, а затем добавляются методы для этого. Таким образом, вы можете добавить несколько уровней разделения между различными unittests, которые более менее связаны.
Пример из Python Docs демонстрирует то, что считается оптимальным для модульных тестов Python:
import unittest
class TestStringMethods(unittest.TestCase):
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
s = 'hello world'
self.assertEqual(s.split(), ['hello', 'world'])
# check that s.split fails when the separator is not a string
with self.assertRaises(TypeError):
s.split(2)
if __name__ == '__main__':
unittest.main()
Есть ряд вещей, которые вы можете наблюдать здесь:
- три метода
TestStringMethods
- это отдельные unittests.
test_isupper
и test_split
оба содержат два утверждения, так как они очень тесно связаны. Добавление отдельных тестов для двух утверждений, присутствующих в test_isupper
, добавило бы много раздувания в код, и это может привести к очень странным проблемам.
Например, если str.isupper()
сломается странным образом, единственный unittest, покрывающий эту единственную функцию, сломается. Однако, если два теста для "FOO"
и "Foo"
были отдельными, один тест мог пройти, а другой - неудачный. Таким образом, тестирование функциональности одной функции лучше сохраняется в одном unittest с несколькими утверждениями.
То же самое относится к методу test_split
; проверяя, что str.split()
работает и проверяет, что он поднимает TypeError
, тесно связан, и поэтому его лучше всего держать вместе в коде.
Итак, вернемся к вашему вопросу: может (и иногда должно) быть более одного утверждения в отношении метода, поскольку оно приводит к более простому и понятному коду и меньше путаницы. Процитировать «Zen of Python» (найденный путем запуска import this
в оболочке python): «Простой лучше, чем сложный». Таким образом, сохраните ваши unittests простые и структурированные путем группировки подобных утверждений одним способом.
«как с JUnit Java, он будет подсчитывать количество утверждений assert, а не» - что? С каких пор? – user2357112
В прошлом опыте, если у меня есть @Test выше методов, которые я хочу проверить, все утверждения утверждения в соответствующем методе будут отображаться на панели JUnit Testing Eclipse. Например, метод с 4 утверждениями, написанными на Java, - все четыре утверждения будут отображаться в Eclipse. Эти же утверждения, написанные на Python, с пинитом, говорят «Ran 1 test in 0.001s, OK». –
'pyunit' - это сторонний модуль тестирования, отличный от модуля' unittest', который поставляется с CPython в стандартной библиотеке. Если вы используете 'unittest', тогда вы должны отредактировать текст, чтобы удалить« pyunit »и« pyunit ». Если вы разместили файл MCVE https://stackoverflow.com/help/mcve, не было бы вопроса о том, какой модуль вы используете. –