Мені дуже важко писати ефективні одиничні тести для великого проекту Django. Я досить добре охоплюю тести, але я зрозумів, що тести, про які я писав, - це безумовно інтеграційні / приймальні тести, а не одиничні тести, і у мене є критичні частини моєї програми, які не перевіряються ефективно. Я хочу виправити це якнайшвидше.
Ось моя проблема. Моя схема є глибоко реляційною та сильно орієнтованою на час, що надає моєму об'єкту високої внутрішньої зв'язку та багато стану. Багато моїх модельних методів запитуються на основі часових інтервалів, і я багато працюю auto_now_add
в полях, розмічених часом. Тому візьмемо, наприклад, метод, який виглядає приблизно так:
def summary(self, startTime=None, endTime=None):
# ... logic to assign a proper start and end time
# if none was provided, probably using datetime.now()
objects = self.related_model_set.manager_method.filter(...)
return sum(object.key_method(startTime, endTime) for object in objects)
Як один підхід тестувати щось подібне?
Ось де я поки що. Мені здається, що одиниці тестування підрозділу слід надати деякі глузливі поведінки by key_method
щодо її аргументів, summary
правильно фільтрувати / агрегувати, щоб отримати правильний результат?
Знущання над timetime.now () є досить простим, але як я можу висміяти решту поведінки?
- Я міг би використовувати світильники, але я чув про плюси і мінуси використання світильників для створення моїх даних (погана ремонтопридатність - це хитрощі, яка для мене вражає будинок).
- Я також міг налаштувати свої дані через ORM, але це може бути обмежувати, тому що тоді я також повинен створювати пов'язані об'єкти. І ОРМ не дозволяє вам возитися з
auto_now_add
полями вручну. - Знущання над ORM - це ще один варіант, але не лише хитромудріти глубоко вкладені методи ORM, але логіка коду ORM висміюється з тесту, і глузування, здається, робить тест справді залежним від внутрішніх та залежних умов функція під тестом.
Найсильнішими гайками, які мають зламати, є такі функції, які сидять на декількох шарах моделей і функцій нижнього рівня і дуже залежать від часу, хоча ці функції можуть бути не надто складними. Моя загальна проблема полягає в тому, що як би я не виглядав нарізати, мої тести виглядають набагато складніше, ніж те, що вони тестують.