Після ще декількох років кодування та роботи над проектами я дам відповідь на власне запитання.
Так, слід написати одиничні тести. Кінцеві тести складніше написати і крихкі, особливо якщо вони покладаються на компоненти інтерфейсу.
Якщо ви використовуєте таку структуру, як Django або Rails (або власні спеціальні класи), у вас повинен бути клас форми, який буде обробляти валідацію форми. Ви також матимете класи перегляду, які відображають відображені шаблони та форму та обробляють запити GET та POST.
В кінцевому підсумку ви:
- отримати URL-адресу
- заповнити форму дійсними даними
- опублікувати форму в URL
- переконайтесь, що базу даних оновлено чи виконано якусь дію внаслідок дійсної форми
Ви випробовуєте багато коду, і покриття буде досить гарним, але ви протестуєте щасливий шлях лише тоді, коли все піде правильно. Як ви гарантуєте, що форма має в ній правильну перевірку? Що робити, якщо ця форма використовується на кількох сторінках? Ви пишете ще один тест для закінчення?
Спробуємо це ще раз з одиничними тестами:
- перевірити метод GET перегляду
- перевірити метод POST перегляду на формі підробленої / макетної
- перевірити форму з дійсними даними
- перевірити форму з недійсними даними
- перевірити побічні ефекти форми
Використовуючи одиничні тести, ви випробовуєте менші фрагменти коду, а тести є специфічними та простішими для запису. Поєднавши це з TDD (Test Driven Development), ви отримаєте код вищої якості.
Легкість написання одиничних тестів не слід відкидати, оскільки, коли ви працюєте над проектом, який не має автоматизованого тестування, вам потрібно десь почати. Почати з одиничних тестів простіше і швидше, і дозволяє негайно розпочати тестування на помилки, а не тільки на щасливий шлях.
was told by a co-worker that the reason for this is that we can rip out and change the underlying implementation at any point as long as the end-to-end tests pass.
- Це теж стосується одиничних тестів. Мені це здається, що тести, що використовуються в кінці, використовуються як привід для того, щоб не писати одиничні тести.