Size: a a a

testing_in_python

2020 August 03

BK

Boris Krutskih in testing_in_python
Evgenii B
зачем им выполняться на одном и том же абстрактном item? почему тест не может выполняться на разных?
Окей, такой вариант есть у нас есть 5 itemo'v это максимум который может быть закреплен над одним super item'om.
тест на нём выполниться 5 раз, после чего item'ы нужно вернуть в исходное состояние, чтобы прогнать снова. либо создавать еще один super item
источник

BK

Boris Krutskih in testing_in_python
и вот зачем мне тратить время и создавать новое, или перебирать свободные item'ы, если можно заранее подготовить сразу чистые, т.е сбросить в исходное состояние
источник

BK

Boris Krutskih in testing_in_python
Система там довольно сложная конечно) может не совсем ясно описал
источник

BK

Boris Krutskih in testing_in_python
чтобы создать super item, появляется еще куча факторов которые влияет на его создание
источник

EB

Evgenii B in testing_in_python
как тебе такое:
тест 1:
- найти в базе super item с 5 айтемами
- добавить в него 6ой
- проверить ошибку "можно только 5"

тест 2:
- найти в базе super item с 4 айтемами
- добавить в него 5ый
- проверить, что теперь 5 айтемов

вопрос: где находить эти айтемы?
ответ: брать слепок из продакшен базы данных / накатывать миграцию которая через мутацию данных нагенерит 100500 разных сочетаний /
источник

BK

Boris Krutskih in testing_in_python
ну как вариант да
источник

EB

Evgenii B in testing_in_python
тебе ни создание, ни удаление в принципе перед стартом/после окончания теста не нужны. в теории накатка данных может осуществляться на тестовый контурн в любое удобное для этого время, в зависимости от тяжелости накатки тестовых данных по обьему.

В самих тестах если база не распухает до очередного maintenance окна (когда будет взят обновленный "худой" снэпшот базы) то данные можно не удалять
источник

EB

Evgenii B in testing_in_python
но тебе нужно всего лишь предоставить для тестовой базы наличие любых условий super item

то есть если в тестах у тебя будет что-то типа:
super_item_with_reached_limit = DB().table('super_item').has('sub_item').count('5').limit(1)
в одном тесте и аналогично с count(4) в другом
источник

BK

Boris Krutskih in testing_in_python
Ну вроде бы все более менее понятно))
источник

BK

Boris Krutskih in testing_in_python
Спасибо, буду пробовать
источник

EB

Evgenii B in testing_in_python
код запроса к ORM считай псевдокодом, я хз как там без оберток корректно в sqlachemy сделать left join запрос
источник

BK

Boris Krutskih in testing_in_python
Хотя наверное чуток позже попробую задачу всё-таки детальнее описать))) а то что-то с этими абстрактными item's почти то что я хотел, но всетаки есть ещё пару моментов)
источник

EB

Evgenii B in testing_in_python
ну пряма оптимизация в лоб: вместо 10 транзакций делать 1. Не после каждого теста, а после всей сессии.
источник

BK

Boris Krutskih in testing_in_python
Ну вообще, то что взаимодействовать с бд при чистке норм практика, уже хорошо)))
источник

T

Tishka17 in testing_in_python
Evgenii B
если тебе нужно перед каждым тестом чистить базу, то это значит что твои тесты не изолированы друг от друга, используют хардкод, и в принципе не могут запускаться параллельно в теории
Наоборот. Чистка базы - один из способов изоляции.

Ты просто не можешь по другому изолировать тест работы системы без пользователей и тест системы с пользователями
источник

EB

Evgenii B in testing_in_python
Дальше: удалять можно через транзакции, но если тебе плевать на данные - ты можешь транкейтить таблички
источник

EB

Evgenii B in testing_in_python
Tishka17
Наоборот. Чистка базы - один из способов изоляции.

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

EB

Evgenii B in testing_in_python
не надо так делать =)
источник

BK

Boris Krutskih in testing_in_python
Ну как с хардкодом)))
то что тесты каждый запуск не ищут новую свободную запись, это разве хардкод?
источник

BK

Boris Krutskih in testing_in_python
😀😀
источник