Ответ
Да, можно, но это крайне неэффективно для реальных проектов. Я начинал с простых скриптов на 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 дает четкий отчет: какие тесты прошли, какие упали, с трассировкой ошибок. Фреймворк — это не просто «удобно», это обязательный инструмент для поддержания тестовой базы в рабочем и читаемом состоянии.