Можно ли писать тесты без фреймворков?

«Можно ли писать тесты без фреймворков?» — вопрос из категории Основы тестирования, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, можно, но это крайне неэффективно для реальных проектов. Я начинал с простых скриптов на Python, используя только assert, но быстро столкнулся с ограничениями.

Как это выглядит без фреймворка:

# test_calculator.py

def add(a, b):
    return a + b

# "Тест" без фреймворка
result = add(2, 2)
if result != 4:
    print(f"FAIL: add(2,2) returned {result}, expected 4")
else:
    print("PASS")

# Еще один тест
result = add(-1, 1)
if result != 0:
    print(f"FAIL: add(-1,1) returned {result}, expected 0")

Проблемы такого подхода, с которыми я столкнулся:

  • Нет структуры отчетов: Трудно отличить вывод тестов от логов приложения.
  • Сложность управления: При падении одного теста последующие могут не запуститься.
  • Нет фикстур и setup/teardown: Приходится вручную создавать и чистить тестовые данные перед каждым тестом.
  • Отсутствие параметризации: Дублирование кода для похожих тестовых случаев.
  • Сложная интеграция с CI/CD: Нет стандартного формата вывода (как JUnit XML), который понимают системы сборки.

Почему фреймворки (pytest, JUnit, TestNG) необходимы: Они решают все эти проблемы. Например, в pytest тот же тест выглядит так:

import pytest

def test_add():
    assert add(2, 2) == 4
    assert add(-1, 1) == 0

@pytest.mark.parametrize("a,b,expected", [(2,2,4), (-1,1,0), (0,0,0)])
def test_add_parametrized(a, b, expected):
    assert add(a, b) == expected

Запуск pytest -v дает четкий отчет: какие тесты прошли, какие упали, с трассировкой ошибок. Фреймворк — это не просто «удобно», это обязательный инструмент для поддержания тестовой базы в рабочем и читаемом состоянии.