All streams
Search
Write a publication
Pull to refresh
4
0
naspeh @naspeh

User

Send message
в функциональных тестах с большим покрытием кода? в каждом куске кода, который такой тест покрывает потенциально может быть ошибка, если код знаешь с нуля, то да все найдется быстро, если в проект пришел через код его существования, то все тонкости не будешь знать…

с юнит тестами да все просто — но на то они и юнит…
fsync=off это почти тоже что рам. Я пробовал и чисто рам, но что-то прироста от него было мало, пробовал правда давненько.
Согласен. Поэтому статья и называется — внедряем TDD :).
> Про быстрый SQLite в памяти можно забыть, в проекте есть привязки к особенностям postgres, да и идентичность тестового окружения все-таки важна, поэтому тесты тоже работают на postgres.

:) критичен
сразу что в глаза бросается, это если у нескольких людей одинаковый TEST_DB_PREFIX

TEST_DB_PREFIX = settings.DATABASES['default']['NAME'] + '__'

то так нельзя запустить тесты нескольким пользователям с базой на одном серваке… т.к. все базы у первого попытаются грохнуть Runner второго…

Ну и зря убрали REUSE_DB, я про это в статье писал, запуск одного отдельного теста должен быть 1-2 секунды, а не даже 10-20сек, а создание базы может занять и больше времени…
тут 3 пункт habrahabr.ru/company/ostrovok/blog/146552/#comment_4936729, вроде ответил :)

у нас много внешних зависимостей: шлюзы оплаты, провайдеры, просто какие-то внешние сервисы с апи… это все нужно мокать — мы мокаем… И для этого обвертка mock_http, чтоб разработчики понимали, что тест стучится во внешний мир…
да, в setup_databeses я сохраняю несколько шаблонов баз, по этому атрибуту получаю какую базу нужно клонировать для конкретного теста.
У нас был момент, когда мы использовали только уникальную базу, а когда подключали транзакции, то часть тестов не работали в транзакции и почему было не очевидно :)… Поэтому те которые не работали оставили с уникальной базой. В общем пока точно не знаю, предстоит разобраться… :)
Ремарка: для ручного тестирования :)

там данные, которые похожи на прод и их там много, на них проверяем миграции…

Нет не под каждый бранч :), одна на все бренчи — но это отдельная история :)
если без django_nose и nose так понимаю, то наследник DjangoTestSuiteRunner + свой TestCase со всей логикой из плагинов
у нас есть отдельно данные для теста, там дамп мама не горюй :)

— при кажой миграции схемы, нужно переливать дамп
— одновременное редактирование схемы — что тогда, делать мердж будет напряжно?

у нас большая достаточно команда, гит и куча бранчей, тестовая база — дамп на 5 гиг :)… Все не так-то просто :)
1. setup_databases пишем под себя, написал об этом в шапке раннера

2. да про редис забыл :), для зачистки обвертка…

3. mock_http — тесты не должны сутчатся на внешний http, т.к. он может отвалиться или сети вообще не быть, а тесты должны ходить в не зависимости, отвечает сайт или нет. Поэтому мы мокаем http запросы. mock_http нужен, чтоб видеть что тест делает http и свалиться, в трейсбеке можно увидеть, где возник этот запрос — потом идем мокаем :)… так же можно запустить с ключем --without-mock-http :)

ок, согласен gist заточен под проект :)
sql — дамп нужно также поддерживать, как и статические фикстуры, что тут другого?

В setup_databases(это из gist) можно все что угодно сделать с базой, в том числе и подтянуть sql дамп с диска, или прям строкой записать в базу тригер — это не важно.

Потом между тестами мы ее будем создавать с WITH TEMPLATE (мы ведь про postgres) и там у нас будут уже все тригиры и данные, которые мы туда запихнем на шаге создания бд… Эта операция (создание бд с WITH TEMPLATE) быстрее чем flush на большой базе, но медленее транзакций. Про это в статье говориться.
в приципе там особо привязок нет, я немного обновил gist, добавил requirements.txt и пару коментов. У нас это пакет, поэтому нужно его создать… Но для публикации идеи мне казалось gist-a достаточно…
Спасибо за инфрмацию.

Про pytest вкурсе, даже про распределенность его читал, но как-то все больше именно nose становиться в качестве основного пускальщика.

Нужно еще посмотреть повнимательнее.
у меня опыт интенсивного TDD в python уже пару лет точно — это осознанный выбор, с учетом опыта…

Да покрытие кода не говорит про качество тестов, но я описал плюс покрытия кода для питона.

Нужно писать хорошие тесты, как и нужно писать хороший код :).

Если поверх WSGI трудно тестировать какую-то логику, нужно спускаться ниже, и ниже уже проверять тонкую логику (например: на джанго форме или моделе) — это уже ближе к юнит тестам…

Тест поверх WSGI все равно нужен — он проверит код в реальном воркфлоу :), пусть даже не со всей логикой.
при каждом запуске ./manage.py test — база создается :)

между тестами да обычно транзакции, но может быть и flush — в статье это опоминалось…
поправили ссылки, спасибо. Я знаю хорошие отзывы про django-dynamic-fixture :)
кстати www.heroku.com/ тоже поддерживает python. Один вебпроцес, шаред posgresql, 200 писем в день через sendgrid.com(интегрирован как аддон) бесплатно, деплой через git push :)
Писал статью по этому поводу: pusto.org/naspeh/python-code-management/

сравнивается 3 подхода: make, fabric, pure python

еще есть python-doit.sourceforge.net/ paver.github.com/paver/ из той же темы.
1

Information

Rating
Does not participate
Location
Украина
Registered
Activity