Чому тестується MVC Views?


23

Наразі я встановлюю основу для програми ASP.Net MVC, і я розглядаю, які саме тестові одиниці я повинен бути готовий написати. Я бачив, що люди в багатьох місцях говорять: "Не турбуйтеся перевіряти свої погляди, немає логіки, і це банально, і тест на інтеграцію буде охоплений".

Я не розумію, як це стало прийнятою мудрістю. Інтеграційні тести служать зовсім іншому призначенню, ніж одиничні тести. Якщо я щось зламаю, я не хочу знати через півгодини, коли мої інтеграційні тести зламаються, я хочу знати це негайно.

Зразок сценарію: Скажімо, ми маємо справу зі стандартним додатком CRUD з юридичною особою Замовника. Замовник має ім'я та адресу. На кожному рівні тестування я хочу переконатися, що логіка пошуку Клієнта правильно отримує і ім’я, і адресу.

Для тестування одиниці сховища я записую тест на інтеграцію для потрапляння в базу даних. Для тестування бізнес-правил я знущаюся з сховища, подаю відповідні дані правилам бізнесу та перевіряю, чи повертаються очікувані результати.

Що я хотів би зробити: Щоб перевірити модуль інтерфейсу користувача, я знущаюся з бізнес-правил, налаштовую очікуваний екземпляр клієнта, переглядаю і переконуюсь, що представлення містить відповідні значення для вказаного нами екземпляра.

Що я застряг: Для тестування репозиторію я пишу тест на інтеграцію, встановлюю відповідний логін, створюю необхідні дані в базі даних, відкриваю браузер, переходжу до клієнта та перевіряю, чи отримана сторінка містить відповідну значення для вказаного я екземпляра.

Я розумію, що між двома розглянутими вище сценаріями існує перекриття, але ключова різниця - це час і зусилля, необхідні для налаштування та виконання тестів.

Якщо я (або інший розробник) видаляє адресне поле з подання, я не хочу чекати тесту інтеграції, щоб виявити це. Я хочу, щоб це було виявлено та позначено в тестовому блоці, який отримує кілька разів на день.

У мене виникає відчуття, що я просто не сприймаю якусь ключову концепцію. Чи може хтось пояснити, чому бажати негайних відгуків про тест на обґрунтованість перегляду MVC - це погано? (або якщо це не погано, то не очікуваний спосіб отримати відповідь)


1
"To unit-test the repository, I write an integration test"Чекати, що? Це не одиничне тестування сховища. Ви автоматизуєте тест для нього, але тестовий код все ще включає DAL та базу даних. Для перевірки наявного у вас сховища ви виділите його так, як у вас є, для правил вашого бізнесу.
StuperUser

Тестування одиниць поданого вигляду, як очікувалося, - це лише тестування блоку, яке працює у вашому шаблоні. Це як тестування одиниці вашого компільованого C містить певні фрагменти машинного коду, ваш пристрій тестує компілятор, а не ваш код.
Райнос

2
@Raynos З повагою мені доведеться не погодитися. Якщо я (або інший розробник) помилково підключив інтерфейс користувача, щоб передати один атрибут даних у полі інтерфейсу для іншого (наприклад, "Ім'я" у "Поле прізвища", це не має нічого спільного з двигуном шаблону, це проблема DAL чи BR. Це, очевидно, проблема, яка була б викрита лише на погляд.
Пітер Берньє,

1
@PeterBernier у вас є хороший момент, але мені важко визначити межу між "тестуванням, чи працює компілятор" та "тестуванням, чи працює мій код". Не кажучи вже про те, що тести на користувальницький інтерфейс тісно пов'язані з інтерфейсом. Будь-які зміни в інтерфейсі викликають збій тестів. Насправді ви не можете виконати будь-який вид рефакторингу інтерфейсу користувача, не викликаючи тест.
Райнос

Відповіді:


9

Просте тестування користувальницького інтерфейсу досить просто в ASP.NET MVC. По суті, все, що вам потрібно зробити, це стверджувати, що повернений HTML містить необхідні вам елементи. Хоча це гарантує, що HTML-сторінка структурована так, як ви очікуєте, вона не повністю перевіряє інтерфейс користувача.

Для правильного тестування веб-інтерфейсу потрібен такий інструмент, як Selenium, який буде використовувати браузери на вашій машині та забезпечувати належну роботу JavaScript та HTML у всіх браузерах. У Selenium є модель клієнт / сервер, щоб ви могли мати набір віртуальних машин з клієнтами Unix, Mac та Windows, а також набір браузерів, загальних для цих середовищ.

Тепер добре розроблений додаток MVC (шаблон, а не рамка) вкладає важливу логіку в моделі та контролери. Коротше кажучи, функціональність програми тестується при тестуванні цих двох аспектів. Погляди, як правило, мають лише логіку відображення і легко перевіряються візуальним оглядом. Через тонку обробку зображення і більшу частину програми, яка добре перевірена, багато людей не думають, що біль тестування шару перегляду перевищує користь, отриману ним.

При цьому, MVC має деякі приємні можливості перевірити DOM, повернений запитом. Це значно зменшує біль при тестуванні оглядового шару.


1
"По суті, все, що вам потрібно зробити, - це стверджувати, що повернутий HTML містить необхідні вам елементи." Це саме те, що я намагаюся зробити, і це виявляється нетривіально. Чи можете ви вказати на посилання, де це буде працювати з певною дією контролера, на відміну від простого надання керування? (Я працював через декілька підписок, але RenderPartial не виконує те, що я хочу зробити без значних накладних витрат.)
Пітер Берньє,

Ви хочете перевірити mvccontrib.codeplex.com (MVC Contrib). Це забезпечує допомогу, яка не була вбудована в основну мову, і була рекомендована в книзі "Test-Drive ASP.NET MVC" (прагматичні програмісти). Я все ще думаю, що Selenium є кращим співвідношенням для тестування View.
Берін Лорич

TestHelper (MVC Contrib): mvccontrib.codeplex.com/…
Berin Loritsch

Селен (в моєму випадку Selenium RC) - це те, що я буду використовувати для своїх інтеграційних тестів. Я хочу, щоб це не відбулося до цього моменту.
Пітер Берньє

2
@Peter: Ваш коментар до того, що ваші зусилля "нетривіальні" - це саме та причина, по якій переслідуються погляди одиничного тестування. Отже, типова стратегія полягає в тому, щоб зробити представлення якомога тонкішим (тобто не містить ділової логіки), щоб більшість одиничних тестувань могли проходити десь в іншому місці (як правило, у ViewModel). Самі погляди можна перевірити візуальним оглядом або за допомогою інструменту тестування інтерфейсу користувача, як Selenium.
Роберт Харві

7

Я б не сказав, що це нахмурилося. Швидше за все, ці настрої є результатом того, що тестування модулів MVC-переглядів (принаймні, з різновидів aspx) є досить важким, тому що перегляди aspx мають занадто велику залежність від WebForms, які самі по собі є досить нестабільними. Тож аргумент іде, що не варто докладати зусиль, оскільки погляди, як правило, не такі складні.

Звичайно, перегляд може бути досить складним, тому це ваш вибір.


3
Наскільки я знаю, погляди ASP.NET MVC не пов'язані з веб-формами. Хіба для ASP.NET MVC не є одним із важливих моментів, що це не веб-форми?
Адам Лір

Моя точка зору полягає в тому, що для написання інтеграційних тестів для покриття інтерфейсу потрібно більше зусиль людини, ніж для написання реальних "тестових одиниць", щоб охопити погляди. Ось чому я намагаюся зрозуміти деякий опір, який, здається, існує у напрямку написання одиничних тестів для поглядів.
Пітер Берньє

@Anna Aspx перегляди побудовані на версії WebForms. Вони походять від System.Web.UI.WebControls.Pageкласу, використовують <asp:ContentPlaceholder>елементи управління тощо. Те, як MVC виконує їх, дозволяє уникнути великої кількості конвеєрів виконання сторінки, зазвичай пов'язаних з WebForms, але він все ще використовує багато матеріалів WebForms під обкладинками.
marcind

Якщо ви використовуєте інший механізм перегляду (наприклад, бритви), ви повинні мати можливість віддалятися від двигуна веб-форм.
The Muffin Man

6

Я не впевнений, що це нахмурилося. Перевірка - одна з ключових переваг використання ASP.NET MVC. Перегляньте блог Стіва Сандерсона, щоб отримати додаткову інформацію про це.

Він також написав рукописну кращу книгу ASP.MVC (IMO) там. Він не тільки навчає MVC, але і перевершує його, і викладає найкращі практики, включаючи тестування.

Я думаю, мені потрібно трохи уточнити огляд тестування одиниць - ви можете побудувати тести одиниць навколо результату, поверненого з контролера (ActionResult тощо). Вам потрібно буде провести інші тестування на фактичну взаємодію з інтерфейсом та інтерфейсом користувача.


"Вам потрібно буде ще провести тестування на фактичну взаємодію з інтерфейсом та інтерфейсом користувача." Точно моя суть питання ... чому тести інтерфейсу раптово стають частиною "іншого тестування" (тобто інтеграційного тестування). Я бачив багато змісту Стіва Сандерсона, і це щось із того, що змусило мене почати цей шлях, в основному намагаючись повторити те, що він робить зі своїм проектом "MvcFakes", і натрапив на проблеми з тим, що його код написаний для старих MVC-релізів. .
Пітер Берньє

1

Ви можете дізнатися, як перевірити перегляд, повернутий дією контролера, як перевірити дані перегляду, повернені дією контролера, і як перевірити, чи перенаправляє вас одна дія контролера на другу дію контролера, переглянувши наступну URL-адресу, опишіть у цій короткій статті про тестування даних перегляду в MVC .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.