@gaga, Вы просили о тестах, их есть у нас. Как выглядит тест на нормальном языке, пример:
use Test::More;
plan tests => 6;
require_ok 'User';
my $user = new User name => 'Вася';
ok $user => 'Пользователь инстанцирован';
ok !$user->id, 'У нового пользователя id отсутствует';
ok $user->save, 'Пользователь сохранён';
ok $user->id, 'Id назначен при сохранении';
is $user->foo, 'bla', 'Значение по умолчанию для foo';
Запускаем получаем красивый лог и машино- и человеко-читаемый. Система считает так же число тестов и верифицирует их количество с заданным (сложные тесты, например асинхронных систем могут в случае ошибки приводить к разным числам и это тоже будет тестироваться.
Теперь тест курильщика, переписываем то же самое.
import pytest
import importlib
# без переменных уровня модуля или подобных хаков данные
# из теста в тест не передать
User = None
vuser = None
def test_import():
User = importlib.import_module('User')
assert User, 'Модуль загружен'
def test_constructor():
vuser = User(name='Вася')
assert vuser, 'Пользователь инстанцирован'
def test_id_presave():
assert not vuser.id, 'У нового пользователя id отсутствует'
def test_save():
assert vuser.save(), 'Пользователь сохранён'
def test_id_postsave():
assert vuser.id, 'Id назначен при сохранении'
def test_default_foo():
assert vuser.foo == 'bla', 'Значение по умолчанию для foo'
Итого:
- тестовая система (самая распространенная - pytest) сделана так, чтобы пользователь писал максимально много букв не относящиеся к тестам
- передача данных из теста в тест затруднена
- лог тестирования страшенный не человеко- и не машино- читаемый
- вторая по популярности (или первая?) тестовая система еще более многосложна, предполагает не только объявления функций, но и классов
- со стороны тестовой системы отсутствует поддержка частых паттернов: например тестирование строк на регекспы (like/unlike, тестирование импортируемости, итп)
- тестирование количества тестов так же крайне неочевидно
- автоматический подсчет статистики числа пройденных тестов в большой системе - так же ППЦ, ввиду отсутствия машиночитаемости
- масса типовых слов, которые зарезервированы как ключевые (str, list, is, in, from, и так далее) заставляет изобретать сложные имена переменным
и тут еще мы не рассматриваем например ситуацию, что в начале теста система должна поднять некоторую инфраструктуру.
соответственно именно поэтому в питонячьих проектах тесты народ и не пишет обычно.
а еще эта хрень-кака молча глотает двойные
def foo():
bla
def foo():
ble
и вот где бы выбросить-то исключение? но нет же. Зачем? Надо же усложнить пользователю процесс поиска ошибки, а не упростить его!
пусть разбирается со страшенными стектрейсами, там где мог бы сразу получить точку с ошибкой, а так же пусть думает «почему код не выполняется?» там где мог бы получить ексепшен.
ППЦ
PPS: а еще есть уродские декораторы. какой шизик их придумал? причины почему их придумали понятны: за отсутствием нормальных лямбд хоть какой-то заменитель