HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: python, автоматизированное тестирование, test runner, unittest, pytest, nose, nose2, диагностика и отладка тестов</p>
1 <p>Теги: python, автоматизированное тестирование, test runner, unittest, pytest, nose, nose2, диагностика и отладка тестов</p>
2 <p><strong>Test Runner</strong>- это приложение, используемое для запуска тестов, проверки выходных данных, а также предоставления инструментов, необходимых для<strong>диагностики и отладки тестов</strong>. В Python доступно много тест-раннеров. Вот тройка наиболее популярных: - unittest; - nose или nose2; - pytest.</p>
2 <p><strong>Test Runner</strong>- это приложение, используемое для запуска тестов, проверки выходных данных, а также предоставления инструментов, необходимых для<strong>диагностики и отладки тестов</strong>. В Python доступно много тест-раннеров. Вот тройка наиболее популярных: - unittest; - nose или nose2; - pytest.</p>
3 <h2>Unittest</h2>
3 <h2>Unittest</h2>
4 <p><strong>Unittest</strong>встроен в стандартную библиотеку Python. Он содержит и тестовую среду, и Test Runner. У unittest есть ряд требований для написания и выполнения тестов: - вы помещаете тесты в методы класса unittest.TestCase; - вы используете специальные методы<strong>утверждения</strong>класса unittest.TestCase, а не встроенный оператор assert.</p>
4 <p><strong>Unittest</strong>встроен в стандартную библиотеку Python. Он содержит и тестовую среду, и Test Runner. У unittest есть ряд требований для написания и выполнения тестов: - вы помещаете тесты в методы класса unittest.TestCase; - вы используете специальные методы<strong>утверждения</strong>класса unittest.TestCase, а не встроенный оператор assert.</p>
5 <p>Пример кода с unittest:</p>
5 <p>Пример кода с unittest:</p>
6 import unittest class TestSum(unittest.TestCase): def test_sum(self): self.assertEqual(sum([1, 2, 3]), 6, "Should be 6") def test_sum_tuple(self): self.assertEqual(sum((1, 2, 2)), 6, "Should be 6") if __name__ == '__main__': unittest.main()<p>Запустив файл в командной строке, мы увидим один успешный тест (обозначен точкой) и один сбой (обозначен буквой F):</p>
6 import unittest class TestSum(unittest.TestCase): def test_sum(self): self.assertEqual(sum([1, 2, 3]), 6, "Should be 6") def test_sum_tuple(self): self.assertEqual(sum((1, 2, 2)), 6, "Should be 6") if __name__ == '__main__': unittest.main()<p>Запустив файл в командной строке, мы увидим один успешный тест (обозначен точкой) и один сбой (обозначен буквой F):</p>
7 $ python test_sum_unittest.py .F ====================================================================== FAIL: test_sum_tuple (__main__.TestSum) ---------------------------------------------------------------------- Traceback (most recent call last): File "test_sum_unittest.py", line 9, in test_sum_tuple self.assertEqual(sum((1, 2, 2)), 6, "Should be 6") AssertionError: Should be 6 ---------------------------------------------------------------------- Ran 2 tests in 0.001s FAILED (failures=1)<p><em>Примечание</em>: будьте внимательны, если пишете тесты для выполнения и в Python 2, и в Python 3. Например, в Python 2.7 и ниже unittest обозначается<strong>unittest2</strong>.</p>
7 $ python test_sum_unittest.py .F ====================================================================== FAIL: test_sum_tuple (__main__.TestSum) ---------------------------------------------------------------------- Traceback (most recent call last): File "test_sum_unittest.py", line 9, in test_sum_tuple self.assertEqual(sum((1, 2, 2)), 6, "Should be 6") AssertionError: Should be 6 ---------------------------------------------------------------------- Ran 2 tests in 0.001s FAILED (failures=1)<p><em>Примечание</em>: будьте внимательны, если пишете тесты для выполнения и в Python 2, и в Python 3. Например, в Python 2.7 и ниже unittest обозначается<strong>unittest2</strong>.</p>
8 <p>Для получения дополнительной информации о unittest, смотрите официальную<a>документацию</a>.</p>
8 <p>Для получения дополнительной информации о unittest, смотрите официальную<a>документацию</a>.</p>
9 <h2>Nose</h2>
9 <h2>Nose</h2>
10 <p>Написав сотни или тысячи тестов для приложения, вам станет всё труднее использовать результаты<strong>unittest</strong>. И вот здесь на помощь приходит nose. Он совместим с любыми тестами, написанными для среды unittest, и может стать неплохой заменой. Правда, развитие nose в качестве приложения с открытым исходным кодом немного поотстало, поэтому появился форк nose2. Если начинаете только изучать автоматизированное тестирование, используйте nose2 вместо nose.</p>
10 <p>Написав сотни или тысячи тестов для приложения, вам станет всё труднее использовать результаты<strong>unittest</strong>. И вот здесь на помощь приходит nose. Он совместим с любыми тестами, написанными для среды unittest, и может стать неплохой заменой. Правда, развитие nose в качестве приложения с открытым исходным кодом немного поотстало, поэтому появился форк nose2. Если начинаете только изучать автоматизированное тестирование, используйте nose2 вместо nose.</p>
11 <p>Итак, для начала работы с nose2 выполните его установку из<strong>PyPI</strong>. Nose2 обнаружит все тестовые сценарии с именами test_*.py, которые унаследованы от<strong>unittest</strong>.</p>
11 <p>Итак, для начала работы с nose2 выполните его установку из<strong>PyPI</strong>. Nose2 обнаружит все тестовые сценарии с именами test_*.py, которые унаследованы от<strong>unittest</strong>.</p>
12 <p>Пример<strong>TestCase</strong>:</p>
12 <p>Пример<strong>TestCase</strong>:</p>
13 $ pip install nose2 $ python -m nose2 .F =============================================================== FAIL: test_sum_tuple (__main__.TestSum) ---------------------------------------------------------------------- Traceback (most recent call last): File "test_sum_unittest.py", line 9, in test_sum_tuple self.assertEqual(sum((1, 2, 2)), 6, "Should be 6") AssertionError: Should be 6 ---------------------------------------------------------------------- Ran 2 tests in 0.001s FAILED (failures=1)<p>Nose2 предоставляет много флагов командной строки для<strong>фильтрации выполняемых тестов</strong>. Документация<a>здесь</a>.</p>
13 $ pip install nose2 $ python -m nose2 .F =============================================================== FAIL: test_sum_tuple (__main__.TestSum) ---------------------------------------------------------------------- Traceback (most recent call last): File "test_sum_unittest.py", line 9, in test_sum_tuple self.assertEqual(sum((1, 2, 2)), 6, "Should be 6") AssertionError: Should be 6 ---------------------------------------------------------------------- Ran 2 tests in 0.001s FAILED (failures=1)<p>Nose2 предоставляет много флагов командной строки для<strong>фильтрации выполняемых тестов</strong>. Документация<a>здесь</a>.</p>
14 <h2>Pytest</h2>
14 <h2>Pytest</h2>
15 <p>Pytest тоже поддерживает тесты, созданные с unittest. Его плюс заключается в особенностях написания TestCase. TestCase в pytest - это серия функций в файле Python, которые начинаются с имени test_.</p>
15 <p>Pytest тоже поддерживает тесты, созданные с unittest. Его плюс заключается в особенностях написания TestCase. TestCase в pytest - это серия функций в файле Python, которые начинаются с имени test_.</p>
16 <p>Есть и другие возможности: - поддержка встроенного оператора assert (не нужно использовать специальные методы<strong>self.assert</strong>); - поддержка фильтрации; - возможность перезапуска, начиная с последнего неудачного теста; - экосистема из сотен плагинов, расширяющих функциональность.</p>
16 <p>Есть и другие возможности: - поддержка встроенного оператора assert (не нужно использовать специальные методы<strong>self.assert</strong>); - поддержка фильтрации; - возможность перезапуска, начиная с последнего неудачного теста; - экосистема из сотен плагинов, расширяющих функциональность.</p>
17 <p>Написание теста TestSum в pytest выглядит так:</p>
17 <p>Написание теста TestSum в pytest выглядит так:</p>
18 def test_sum(): assert sum([1, 2, 3]) == 6, "Should be 6" def test_sum_tuple(): assert sum((1, 2, 2)) == 6, "Should be 6"<p>Здесь удалены базовый класс TestCase и любое использование классов в принципе, а также точка входа с командной строки. Как обычно, дополнительная информация представлена на сайте<a>Pytest</a>.</p>
18 def test_sum(): assert sum([1, 2, 3]) == 6, "Should be 6" def test_sum_tuple(): assert sum((1, 2, 2)) == 6, "Should be 6"<p>Здесь удалены базовый класс TestCase и любое использование классов в принципе, а также точка входа с командной строки. Как обычно, дополнительная информация представлена на сайте<a>Pytest</a>.</p>
19 <p><em>Материал взят из статьи Anthony Shaw "<a>Getting Started With Testing in Python</a>".</em></p>
19 <p><em>Материал взят из статьи Anthony Shaw "<a>Getting Started With Testing in Python</a>".</em></p>
20  
20