Сертификационные тесты или просто одобрения — это фреймворк, созданный Ллевелином Фалько и Дэном Гилкерсоном , обеспечивающий поддержку .NET, Java, PHP и Ruby. Это не еще одна инфраструктура модульного тестирования, такая как NUnit, MbUnit и т. Д .; вместо этого эти рамки используются для проведения испытаний на утверждение.
Вообще говоря, программное обеспечение — это не более чем виртуальная коробка, в которую мы вводим некоторые данные и ожидаем некоторые результаты. Выходные данные могут быть получены миллионами способов. Эти способы отличаются реализацией. Модульные тесты слишком сосредоточены на реализации. Вот почему модульные тесты могут не сработать, даже если у вас есть рабочий код. Одобрения, напротив, ориентированы на результат.
Как это работает?
Давайте посмотрим на очень простой случай. Скажем, у меня есть класс ShoppingCart. Я могу добавить некоторые продукты в корзину и подтвердить свою покупку. Я ожидаю, что общая стоимость рассчитывается для меня.
[TestFixture] [UseReporter(typeof(DiffReporter))] public class ShoppingCartTests { [Test] public void should_calculate_the_total_price_for_shopping_cart() { // do var shoppingCart = new ShoppingCart(); shoppingCart.Add(new Product { Id = "iPad", Price = 500 }); shoppingCart.Add(new Product { Id = "Mouse", Price = 20 }); shoppingCart.Confirm(); // verify Approvals.Approve(shoppingCart); } }
Что произойдет, если я проведу этот тест? Если я запускаю его в первый раз, он не работает. Неважно, работает это или нет. Фреймворк просто еще этого не знает. Чтобы понять, насколько корректен этот код, используйте свою человеческую силу распознавания.
В этом случае вы увидите, что оно откроет приложение TortoiseDiff и покажет фактические и ожидаемые результаты.
Здесь я могу сказать: «Хорошо, у меня в корзине 2 товара: один iPod и одна мышь, iPod стоит 500 штук, а мышь — 20, а общая стоимость — 520 — выглядит хорошо! Я одобряю этот результат! ».
Технически, утверждение просто копирует фактический результат в ожидаемый. Как только тест пройден, фактический выходной файл удаляется, а утвержденный файл находится рядом с файлом тестового кода, поэтому вы просто проверяете его в системе контроля версий.
Но допустим, что корзина покупок изменена и что-то идет не так Там будет сбой. В случае модульных тестов это будет несколько сбоев в разных случаях, и может быть не так просто понять, что именно не так. С другой стороны, для испытания на одобрение это будет всего лишь один сбой. И дело в том, что можно точно увидеть, где находится отклонение.
Где это работает?
Это не только простые объекты, которые вы можете одобрить. Вы даже можете утверждать различные источники: объекты, перечисляемые, файлы, HTML, XML и т. Д. На более высоком уровне: WpfForm, WinForm, ASP.NET Page.
Например, код для ASP.NET:
[Test] public void should_have_approved_layout() { ApprovalTests.Asp.Approvals.ApproveUrl("http://localhost:62642/customer/"); }
Или для формы WPF:
[Test] public void should_have_approved_layout() { ApprovalTests.Wpf.Approvals.Approve(new Form()); }
С формами WPF и Win он может сериализовать их в изображения, поэтому фактические и ожидаемые результаты на самом деле являются изображениями, поэтому легко отслеживать различия (TortoiseDiff может это сделать).
Когда вы должны его использовать?
Это работает лучше всего, когда вы имеете дело с 2 вещами: пользовательским интерфейсом и устаревшим кодом.
Тестирование пользовательского интерфейса всегда сложно. Но обычно вам нужно: убедиться, что пользовательский интерфейс не изменился, а если он изменился, знать, где именно произошло это изменение. Одобрение тестирования решает это приятно. Например, для тестирования страницы ASP.NET требуется всего одна строка кода.
Наследие — это другая история: у вас там вообще нет тестов, но вы должны изменить код для реализации новой функции или рефакторинга. Интересная вещь о старых коде — это работает! Он работает годами, независимо от того, как он написан (помните, виртуальная коробка). И это очень большое преимущество этого кода. С одобрениями, только с одним тестом вы можете получить все возможные выходные данные (HTML, XLM, JSON, SQL или любой другой вывод) и подтвердить, потому что вы знаете — это работает! После того, как вы завершили такой тест и одобрили результат, вам стало намного безопаснее с рефакторингом, так как теперь вы «заблокировали» все существующее поведение.
Одобрения — это не то, что вам нужно запускать постоянно, например, юниты или интеграционные тесты. Одобрение тестирования больше похоже на удобный инструмент. Вы создаете проверочные тесты, выполняете свою работу, и в конце дня это может произойти — инструмент больше не нужен, поэтому вы можете просто выбросить его.
Хотите узнать больше?
Просто зайдите и прослушайте этот эпизод подкаста Herding Code, или посетите веб-сайт проекта, или присоединяйтесь ко мне 17 декабря на конференции XP Days Ukraine в Киеве, где я собираюсь выступить с речью, посвященной утверждениям.
Источник: http://www.beletsky.net/2011/12/approval-tests-alternative-view-on-test.html