3 варианта пропуска теста в Python
Модуль unittest в Python позволяет пропустить тестовый метод или тестовый класс. Чтобы пропустить тест, у вас есть три доступных варианта:
- Используйте декоратор @unittest.skip().
- Вызовите метод SkipTest() класса TestCase.
- Вызовите исключение SkipTest.
Пример пропуска методов тестирования
В следующем примере используется декоратор @unittest.skip() для безусловного пропуска метода test_case_2():
import unittest class TestDemo(unittest.TestCase): def test_case_1(self): self.assertEqual(1+1, 2) @unittest.skip('Work in progress') def test_case_2(self): pass
Запустите тест:
python -m unittest -v
Выход:
test_case_1(test_skipping.TestDemo) ... ok test_case_2(test_skipping.TestDemo) ... skipped 'Work in progress' ---------------------------------------------------------------------- Ran 2 tests in 0.001s OK(skipped=1)
Вывод показывает, что два теста были выполнены, а один пропущен. Для пропущенного теста выходные данные показывают сообщение, которое мы передали декоратору @unittest.skip().
Аналогичным образом вы можете вызвать SkipTest() в методе тестирования, чтобы пропустить его:
import unittest class TestDemo(unittest.TestCase): def test_case_1(self): self.assertEqual(1+1, 2) def test_case_2(self): self.skipTest('Work in progress')
Запустите тест:
python -m unittest -v
Выход:
test_case_1(test_skipping.TestDemo) ... ok test_case_2(test_skipping.TestDemo) ... skipped 'Work in progress' ---------------------------------------------------------------------- Ran 2 tests in 0.001s OK(skipped=1)
Кроме того, вы можете вызвать исключение SkipTest в методе тестирования, чтобы пропустить его.
import unittest class TestDemo(unittest.TestCase): def test_case_1(self): self.assertEqual(1+1, 2) def test_case_2(self): raise unittest.SkipTest('Work in progress')
Запустите тест:
python -m unittest -v
Выход:
test_case_1(test_skipping.TestDemo) ... ok test_case_2(test_skipping.TestDemo) ... skipped 'Work in progress' ---------------------------------------------------------------------- Ran 2 tests in 0.001s OK(skipped=1)
Пример пропуска тестового класса
Чтобы пропустить тестовый класс, вы используете декоратор @unittest.skip() на уровне класса.
В следующем примере используется декоратор @unittest.skip() на уровне класса. Следовательно, все тесты класса TestDemo пропускаются:
import unittest @unittest.skip('Work in progress') class TestDemo(unittest.TestCase): def test_case_1(self): self.assertEqual(1+1, 2) def test_case_2(self): self.assertIsNotNone([])
Запустите тест:
python -m unittest -v
Выход:
test_case_1(test_skipping.TestDemo) ... skipped 'Work in progress' test_case_2(test_skipping.TestDemo) ... skipped 'Work in progress' ---------------------------------------------------------------------- Ran 2 tests in 0.000s OK(skipped=2)
Пропуск теста с условием
Иногда хочется условно пропустить тест. Например, вы можете пропустить тест, если текущая платформа, на которой выполняется тест, — Windows.
Для этого вы используете декоратор @unittest.skipIf():
@unittest.skipIf(condition, reason)
Это позволит пропустить тест, если условие истинно. Кроме того, в результатах теста будет указана причина пропуска теста.
Например:
import unittest from sys import platform class TestDemo(unittest.TestCase): def test_case_1(self): self.assertEqual(1+1, 2) @unittest.skipIf(platform.startswith("win"), "Do not run on Windows") def test_case_2(self): self.assertIsNotNone([])
В этом примере мы пропускаем метод test_case_2(), если текущей платформой является Windows. Чтобы получить текущую платформу, на которой выполняется тест, мы используем свойство sys.platform.
Запустите тест:
python -m unittest -v
Выход:
test_case_1(test_skipping.TestDemo) ... ok test_case_2(test_skipping.TestDemo) ... skipped 'Do not run on Windows' ---------------------------------------------------------------------- Ran 2 tests in 0.001s OK(skipped=1)
В отличие от декоратора @unittest.skipIf, @unittest.skipUnless пропускает проверку, если условие истинно:
@unittest.skipUnless(condition, reason)