Тестирование


Две истории.

Garbage in

🔗

Как-то я писал библиотеку, которая должна была быть Самой Лучшей Библиотекой На Земле. Так как я сеньор помидор, то я просто сел и начал писать код. Граничные ситуации я обходил стороной и писал для них заглушки, в остальном же разработка шла довольно быстро. Я запускал, и программа не падала, цифры считались, данные выводились. Я двигался по графику разработки довольно резво.

Но вот в чём фишка - когда я наконец написал всё, что планировал, то обнаружил, что результаты были не очень. А главное - я не знал, почему. В программе было много подсистем, и понять, где именно происходит ошибка, я не мог.

Поэтому я собрал волю в кулак и начал писать тесты. Это больно: за пару дней я накатал прототип, а теперь я трачу неделю, чтобы написать тесты. Казалось бы, разработка встала. Но на самом деле - нет. Начиная тестировать самые простые и базовые функции, я обнаруживал, как они не работали в части случаев. То есть сама основа моей программы была с ошибками, а как говорится,

"garbage in - garbage out"

Поднимаясь всё выше и выше по иерархии, я обнаруживал всё новые и новые баги. В том виде, в каком оно было написано изначально, оно не могло работать в принципе.

Поэтому вот вам важное правило:

Без тестов вы не можете знать, работает ли ваша программа правильно или нет. Вам может казаться, что вы знаете. Только наличие тестов даёт вам гарантию, что хотя бы в некоторых случаях ваша программа делает то, что нужно.

Кто сломал прод?

🔗

В один из рабочих дней у нас в слаке наблюдалось оживление - что-то упало на проде. Над проектом работало много людей, но знаете, кто был спокойнее всех? Я - а всё потому что у меня было 120 тестов на тот функционал, что я написал, и перед каждым коммитом я запускал тесты. Да даже если там всё покрашилось, удалилось, и теперь джанго-приложение пытается уничтожить человечество - мне нет до этого дела, потому что я железобетонно уверен, что моя часть работает как надо - тесты гарантируют это.

Тесты - это ваше спокойствие и уверенность в том, что ваш код работает. Если что-то сломается - доставайте попкорн и развлекайтесь, ведь это будет не ваша ошибка.

Что посоветуешь?

🔗

Ничего не могу с собой поделать - мне нравится pytest. В основном из-за "fixtures", когда вы можете написать, что для теста вам, например, нужна активная подписка от пользователя. Тогда pytest "увидит", что перед тестом нужно создать пользователя с активной подпиской, а после завершения теста всё нужно удалить. То есть pytest автоматически разруливает все зависимости для ваших тестов, и тесты получаются лаконичными и понятными - вот примеры:

def test_subscription_iter_charge_dates_performance(db, subscription, django_assert_num_queries):
    with django_assert_num_queries(0):
        list(islice(subscription.iter_charge_dates(), 10))


def test_active_subscription_filter(db, subscription, now, days):
    subscription.start = now - days(2)
    subscription.end = now - days(1)
    subscription.save(update_fields=['start', 'end'])
    assert subscription not in Subscription.objects.active(at=now)

Но это ещё ничего не значит!

🔗

Да, наличие тестов само по себе не гарантирует на 100%, что вы "в домике". Даже 100% покрытие тестами не гарантирует, что все случаи рассмотрены. Но чем больше функционала вы покрываете тестами - тем более уверенными и спокойными вы становитесь. А это многого стоит.

Пишите тесты.



Новое