четверг, 16 августа 2012 г.

Verify вместо Assert



В функциональных тестах правило юнит-тестов «один тест – одна проверка» делеко не всегда применимо. Бывают случаи, когда хочется проверить сразу несколько незавимых друг от друга вещей в тесте и получить результат, даже в случае непрохождения одной из проверок.


Например, рассмотрим самый простой случай. Возьмем программу "Контакты" Windows.


 Мы хотим проверить отображение информации о пользователе. Будем проверять 2 поля – «Имя» и «Эл.почта». При использовании Assert проверки этих полей можно записать в следующем виде (язык C#, тестовый фреймворк - NUnit):


Assert.AreEqual("Иван Иванович Иванов",
    contactSummaryWindowObject.FullNameTextBox.Text,
    "ФИО контакта неожидаемы"); 
Assert.AreEqual("ivanov.i.i@gmail.com",
    contactSummaryWindowObject.EmailHyperlink.Name,
    "Эл.почта контакта неожидаема");

Но предположим, что первый Assert упадет. Тогда мы так и не узнаем, что у нас там с электронной почтой. Если таких проверок не 2, а больше, 5 например, то мы не узнаем результат остальных 4 в случае падения первого Assert, хотя эти проверки друг от друга не зависят, при падении одной из них можно проверять остальные. 

Почему бы нам не создать такой класс, который будет накапливать результаты проверок, и в случае fail какого-либо Assert тест продолжит выполняться, а потом мы получим все результаты за один раз.


public static class Verify
    private readonly static StringBuilder verificationErrors = new StringBuilder(); 
    
    public static void CleanUp()
   {
        verificationErrors.Clear();
    }
            
    public static void LogIfError(Action action)
    {
        try
        { 
            action(); 
        }
         catch (AssertFailedException e)
        {
             verificationErrors.AppendLine(e.Message); 
        }
    }

    public static void AssertResults()

   {
        Assert.IsTrue(verificationErrors.Length == 0 , 

             "После прохождения теста есть ошибки верификации:\r\n {0}",
              verificationErrors); 
   } 
}


Главный метод LogIfError отвечает за сохранение результатов проверок, AssertResults отвечает за вывод результатов всех проверок, CleanUp – за очистку сохраненных результатов проверок.

В итоге запись проверок примет следующий вид


Verify.LogIfError(() => Assert.AreEqual("Иван Иванович Иванов", 
    contactSummaryWindowObject.FullNameTextBox.Text,
    "ФИО контакта неожидаемы"));
Verify.LogIfError(() => Assert.AreEqual("ivanov.i.i@gmail.com",

    contactSummaryWindowObject.EmailHyperlink.Name, 
    "Эл.почта контакта неожидаема"));
Verify.AssertResults();

И все довольны и счастливы :)

1 комментарий: