Введение В Написание Тестов И Знакомство С Xunit

Идея статьи возникла после нескольких лекций о том, как писать тесты и как их использовать.

xUnit .

Обо всем можно подробно прочитать отдельно.

Здесь я собрал общую информацию о том, насколько успешно все это применяется на практике и предоставил ссылки для дальнейшего ознакомления.

Обзор делался по версии 2.0.



Соглашения по коду

Общепринятой практикой является размещение всех тестовых проектов в отдельной папке.

Это касается как структуры папок на диске, так и папок в решении.

Такая практика получила широкое распространение именно из-за удобства.

Кроме того, имя проекта и пространство имен полностью идентичны тестируемому модулю, с добавленным в конце словом Tests (обычно отделяемым точкой).

Чтобы облегчить поиск тестов, все тесты, принадлежащие определенному классу, помещаются в его класс с тестами.

Что.

Получается пара из исходного класса и класса с тестами.

Разделение на единицу, интеграцию и нагрузку происходит либо по категориям, либо по логике основной системы.

Это значит, что если интеграционные тесты нельзя отнести к одному классу (обычно так и есть), то они выносятся в отдельную сборку, посвящённую тестируемому функционалу.

Или, например, нагрузочные тесты могут проверить работу определенного метода одного класса.

В этом случае тест помещается в парный класс.

Структура самих тестов любого типа соответствует стилю ААА.

Систематизируем вышесказанное:

  • Расположение проекта: в папке Tests.
  • Имя тестового проекта: [ProjectName].

    Tests

  • Пространство имен: [Пространство имен].

    Тесты

  • Название класса с тестами: [Class]Tests
  • Пара 1-1 из тестируемого класса и класса с тестами
  • Название модульных тестов: BDD ( руководство )
  • Стиль теста: AAA (Упорядочить-Действовать-Утвердить)


Сравнение xUnit с другими фреймворками

xUnit — один из популярных сегодня фреймворков.

Я не буду останавливаться на его описании, а приведу сухое резюме.

Если есть вопросы, пишите в комментариях, отвечу.

Немного устаревшая информация, однако, достаточно полная, дана в сравнении xUnit с другими фреймворками (MSTest, NUnit) .

Хотелось бы отметить лишь важные отличия:

  • Проверка исключений выполняется с помощью утверждений, а не атрибутов, что более соответствует стилю AAA (Assert.Throws, Record.Exception).

    Внутри исключения перехватываются с помощью блока try-catch.

  • Замена специальных атрибутов возможностями естественного языка (конструктор, IDisposable, IClassFixture, ICollectionFixture)
В остальном возможности схожи.

xUnit приписывают очень высокую гибкость настройки, возможность расширять/изменять поведение, запускать тесты и т. д. Но на практике мне не приходилось делать ничего подобного.



Факт, теория и другие концепции
Fact — это автономный модульный тест, не принимающий параметров.

Теория — это тест, который принимает параметры и может иметь несколько сценариев.

Fixture — это класс для настройки и очистки некоторого контекста.

Контекст прикрепляется к классу с помощью тестов либо с помощью интерфейса IClassFixture, либо с помощью коллекции и интерфейса ICollectionFixture. Коллекция может включать в себя несколько классов с тестами.

Пример факта и двух вариантов теории:

  
   

public class TestSuite { [Fact] public void Should_do_somthing(){.

} [Theory] [InlineData(20, 180, 80, ”good”)] [InlineData(20, 180, 50, ”bad”)] public void Should_measure_weight(int age, int height, decimal weight, string expected){.

} [Theory] [MemberData(“AgeHeightWeightData”)] public void Should_measure_weight(int age, int height, decimal weight, string expected){.

} public static IEnumerable<object[]> AgeHeightWeightData() { yield return new object[] {20, 180, 80, "good"}; yield return new object[] {20, 180, 50, "bad"}; } }

Немного подробнее здесь И здесь .



Контексты и выполнение тестов
По умолчанию тесты в одном классе и коллекции выполняются синхронно.

Например, если при запуске тестов вы используете общий ресурс и из-за этого возникают проблемы (например, тесты проваливаются, потому что ресурс заблокирован), то вы можете поместить такие тесты в одну коллекцию и проблема уйдет, потому что параллелизм исчезнет. В целом стек вызовов и то, что происходит, выглядит примерно так:

CollectionFixture: ctor

Теги: #tdd #bdd #тестирование приложений #xunit #.

NET #программирование

Вместе с данным постом часто просматривают: