Статьи

Утверждение испытаний: альтернативный взгляд на автоматизацию испытаний

Сертификационные тесты или просто одобрения — это фреймворк, созданный Ллевелином Фалько и Дэном Гилкерсоном , обеспечивающий поддержку .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