@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 используйте для тестов, которые, как известно, не работают, но должны быть исправлены в будущем.