Основные принципы автоматического тестирования
- Тесты, использующие БД, должны исполняться на тестовой БД
- Каждый тест (с доступом к реальной БД) должен очищать за собой те сущности, которые он сгенерировал (такие тесты должны наследоваться от TestBase и реализовывать метод TestCleanup())
- Так исключается ситуация, когда тесты могут очистить за собой и удалить реальные данные из DB
- В реальной DB не будут видеть тестовые данные (в случае, если какой то тест не очистил данные после себя)
- Тесты должны запускаться на любой машине, т.е. не должны зависеть от контекста конкретного ПК (БД, записи в БД, файла и др.)
- Тесты должны автоматически прогоняться на специальной отдельной машине (GitLab, настроенный на тесты, выполняющий их после каждого коммита в каждой ветке)
- Ветка в системе контроля версий считается законченной, если все тесты в ней выполняются без ошибок (проверять перед слиянием с develop)
- Тесты должны быть оформлены с использованием паттерна AAA(Arrange, Act, Assert). Например:12345678
// Arrange
var employeeRequest = CreateEmployeeRequest();
// Act
var result = await _module.Create(employeeRequest);
// Assert
Assert.Equal(result.Code, ResultCode.Ok);
- На тесте необходимо навешивать атрибут с типом теста. В дальнейшем, можно фильтровать по категориям и запускать определённые тесты (например, Unit тесты, не требующие БД) (* продумать)
- [Trait(«Category»,»Unit»)]
- [Trait(«Category»,»Integration»)]
- [Trait(«Category»,»Functional»)]
- [Trait(«Category»,»WebAPI»)]
- [Trait(«Category»,»UI»)]
- Каждый тест должен быть атомарным, т.е. должен проверять только одну вещь (в идеале, должен быть один Assert)
- Тест должен cоблюдать единую конвенцию именования [тестируемая единица]_[сценарий]_[прогнозируемое поведение]ПримерыGetByPhone_ValidRequest_ReturnSuccess
- GetSame_ByDefault_ReturnsTrueSum_ByDefault_ReturnsZero
Add_WhenCalled_ChangesSum
Sum_Always_CallsLogger
IsValidFileName_BadExtension_ReturnsFalse
IsValidFileName_ValidExtension_ReturnsTrue
IsValidFileName_EmptyFileName_Throws
IsValidFileName_WhenCalled_ChangesWasLastFileName
IsValidFileName_ExtManagerThrowsException_ReturnsFalse - Тесты должны обладать достаточно хорошей читабельностью. Для того чтобы тесты читались как книга, они должны быть декларативными, с минимальным количеством лишних деталей
- Для генерации сложных тестовых объектов использовать Fixture, что бы спрятать детали создания классов.
- Тесты, исполняемые только на локальной машине (если в таких есть необходимость) помечать атрибутом [Fact(Skip=»reason»)]
- Категории тестов следует разделять по директориям
MyLibrary.UnitTests
MyLibrary.IntegrationTests
Тестирование профилей автомаппера
Небольшая ремарка по поводу профилей автомаппера и их тестировании:
Профили размещаются в папке MappingProfiles в проектах подсистем.
Например, Telecom\Reports\MappingProfiles
При добавлении нового профиля, его необходимо добавить в тест.
Профили тестируются в соответствующей подсистеме в классе AutoMapperConfigurationTest
Например, Tests\Telecom.Reports.UnitTests\AutoMapperConfigurationTest.cs
Mapper.Initialize(cfg =>
{
cfg.AddProfile<ReportMappingProfile>();
});
Далее в приложении будет включена проверка на валидацию всех профилей при запуске приложения.
Если какой-то из профилей не валидный, то приложение не будет стартовать.