Как проверить, что в базе данных, доступной через django-доступ, ничего не изменилось?
Я рефакторую некоторый код и добавляю блок atomic.transaction
. У нас есть код, который выполняет автообновление по очереди, после атомарного блока. (Он не может быть в атомарном блоке, потому что он обращается к некоторым таблицам, связанным со многими данными, что требует запросов, поскольку ORM не хранит отличительные отношения).
Согласно моему прочтению кода, кажется невозможным, что какие-либо изменения могут произойти, но наличие теста для доказательства этого было бы неплохо на случай, если кто-то в будущем внесет неудачные правки в код.
Итак, как мне написать тест, который докажет, что ничего в базе данных не изменилось между началом теста и его окончанием?
Базой данных является postgres. В настоящее время она настроена на 2 базы данных (собственно база данных и "проверочная" база данных, которую я создал после того, как мы обнаружили, что код загрузки имеет побочные эффекты в режиме сухой работы. Сейчас я нахожусь в середине рефактора, который исправил проблему побочных эффектов, и я только что добавил блок атомарных транзакций. Поэтому я хотел бы написать тест следующего содержания:
def test_no_side_effects_in_dry_run_mode(self):
orig_db_state = self.get_db_state() # How do I write this?
call_command(
"load_animals_and_samples",
animal_and_sample_table_filename=("data.xlsx"),
dry_run=True,
)
post_db_state = self.get_db_state() # How do I write this?
self.assertNoDatabaseChange(orig_db_state, post_db_state, msg="Oops, database changed unexpectedly.") # How do I write this?
Ранее я уже писал тест, который сохраняет подсчеты всех записей в каждой таблице и сохраняет их в dict, а затем сравнивает dicts, но это не учитывает изменения полей в записи, и это то, что я хотел бы проверить. Кроме того, не хватает дополнительной вставки/удаления.
Так есть ли файл LMD, который я могу проверить, изменилось ли что-нибудь в базе данных?