@unittest.skip(reason)
: безусловный пропуск.@unittest.skipIf(condition, reason)
: пропуск при выполнении условия.@unittest.skipUnless(condition, reason)
: пропуск, если условие не выполнено.self.skipTest(reason)
внутри теста.
@pytest.mark.skip(reason)
: безусловный пропуск.@pytest.mark.skipif(condition, reason)
: пропуск при выполнении условия.pytest.skip(reason)
внутри теста.
В Python, как в unittest
, так и в pytest
, предусмотрены механизмы для пропуска тестов на основе определенных условий. Это полезно, когда тест не актуален в текущей среде, конфигурации или просто временно не должен выполняться.
В unittest
:
unittest
предоставляет несколько способов пропуска тестов:
unittest.skip(reason)
: Безусловный пропуск теста. reason
– строка с описанием причины пропуска.
import unittest
class MyTest(unittest.TestCase):
@unittest.skip("Причина пропуска: Временная недоступность ресурса")
def test_skipped(self):
self.fail("Этот тест должен быть пропущен")
unittest.skipIf(condition, reason)
: Пропуск теста, если condition
истинно.
import unittest
import sys
class MyTest(unittest.TestCase):
@unittest.skipIf(sys.platform.startswith("win"), "Не запускать на Windows")
def test_only_linux(self):
print("Этот тест должен работать только на Linux")
self.assertTrue(True) # Пример утверждения
unittest.skipUnless(condition, reason)
: Пропуск теста, если condition
ложно.
import unittest
import os
class MyTest(unittest.TestCase):
@unittest.skipUnless("MY_ENV_VAR" in os.environ, "Требуется переменная окружения MY_ENV_VAR")
def test_needs_env_var(self):
print("Этот тест требует переменную окружения MY_ENV_VAR")
self.assertTrue(True)
unittest.expectedFailure()
: Помечает тест, как ожидаемо проваленный. Тест все еще выполняется, но провал не считается ошибкой.
import unittest
class MyTest(unittest.TestCase):
@unittest.expectedFailure
def test_expected_failure(self):
self.assertEqual(1, 2, "Этот тест должен провалиться")
Эти декораторы можно применять как к отдельным тестовым методам, так и ко всему классу тестов.
В pytest
:
pytest
предоставляет более гибкие способы для пропуска тестов:
pytest.mark.skip(reason)
: Безусловный пропуск теста.
import pytest
@pytest.mark.skip(reason="Временная недоступность API")
def test_api_unavailable():
assert True # Пример утверждения
pytest.mark.skipif(condition, reason)
: Пропуск теста, если condition
истинно.
import pytest
import sys
@pytest.mark.skipif(sys.version_info < (3, 7), reason="Требуется Python 3.7 или выше")
def test_python_version():
assert True
pytest.skip(reason)
: Внутри тестовой функции можно вызвать pytest.skip(reason)
для пропуска теста во время выполнения.
import pytest
def test_conditional_skip():
if not check_something(): #какая то функция, возвращающая bool
pytest.skip("Условие не выполнено, пропускаем тест")
assert True
pytest.xfail(reason)
: Помечает тест как ожидаемо проваленный. Аналогично unittest.expectedFailure()
.
import pytest
@pytest.mark.xfail(reason="Известная ошибка")
def test_known_failure():
assert 1 == 2
pytest.ini
или pyproject.toml
: Можно настроить пропуск тестов на основе маркеров или путей к файлам.
Пример в pytest.ini
:
[pytest]
markers =
slow: mark test as slow to run
database: mark test as requiring database
Далее, можно использовать -m "not database"
при запуске pytest
, чтобы пропустить все тесты, помеченные как database
.
Различия и рекомендации:
pytest
предоставляет более декларативный и гибкий синтаксис (маркеры).unittest
в основном использует декораторы.skipIf
/skipUnless
или skipif
для условного пропуска тестов в зависимости от окружения, версии Python, наличия внешних зависимостей и т.д.reason
), чтобы было ясно, почему тест не выполняется.xfail
используйте для тестов, которые, как известно, не работают, но должны быть исправлены в будущем.