- Roy Osherove. The Art of Unit Testing (with examples in C#)
- Рой Ошероув. Искусство автономного тестирования
Автономные тесты. Интеграционные тесты. TDD (Test-Driven Development) - Разработка через тестирование
- Написать метод
- Написать автономные тесты
- Прогнать автономные тесты
- Исправить ошибки
- Написать тест
- Прогнать все тесты
- Написать код, чтобы прошёл тест
- Прогнать все тесты Если тесты не проходят, то исправить ошибки.
- Рефакторинг не нужен.
- Вернуться к пункту 1.
- Подвергнуть продуктовый код рефакторингу.
- Вернуться к пункту 4. Рефакторинг - изменение части кода, без изменения его функционала.
- Переименование методов, свойств.
- Разбиение метода на короткие.
Плюсы каркаса NUnit, по сравнению с MSTest:
- Имеет атрибуты.
- Встроенный исполнитель тестов умеет прогонять тесты сторонних каркасов. Через адаптер NuGet. Как каркас автономного тестирования помогает:
- Простота и упорядоченность.
- Выполнение всех тестов.
- Анализ результатов прогона тестов. Список каркасов: http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks
Основные правила размещения и именования тестов:
- Проект. [ProjectUnderTest].UnitTests
- Класс. [ClassName]Tests
- Метод. [UnitOfWorkName][ScenarioUnderTest][ExpectedBehavior] / Подготовка_Действие_Утверждение
Создание тестового метода:
- Arrange - подготовка объектов.
- Act - действие на объект.
- Assert - утверждение о значении / об ожидаемом результате. проверка на bool - Assert.True(getResult); проверка на значение - Assert.AreEqual(expectedObject, actualObject, message); проверка на ссылки - Assert.AreSame(expectedObject, actualObject, message); проверка на исключение - Assert.Catch(delegate); проверка на вхождение - StringAssert.Contains(@"Exception message", result.Message); проверка на вхождение - Assert.That(result.Message, Does.Contain(@"Exception message"));
Атрибуты: [TestFixture] - класс содержит автономные тесты [TestFixtureSetUp] - однократно инициализировать состояние для всего класса [TestFixtureTearDown] - однократно очистить состояние для всего класса [SetUp] - подготовка. метод вызывается перед запуском любого теста [TearDown] - очистка состояния. метод вызывается после выполнения любого теста - настройка состояния по умолчанию для шаблона проектирования Singleton [Test] - тестовый метод / public void [TestCase] - параметризованный тестовый метод. [TestCase(param1,param2,...)] [ExpectedException] - проверка исключений [Ignore("Пропустить")] - пропустить тест [Category("Быстрые")] - категория тестов
If you substituted for a class rather than an interface, check that the call to your substitute was on a virtual/abstract member. Return values cannot be configured for non-virtual/non-abstract members. Correct use: mySub.SomeMethod().Returns(returnValue); Potentially problematic use: mySub.SomeMethod().Returns(ConfigOtherSub()); Instead try: var returnValue = ConfigOtherSub(); mySub.SomeMethod().Returns(returnValue);
Is.StringStarting -> Does.StartWith Is.StringEnding -> Does.EndWith Is.StringContaining -> Does.Contain Is.StringMatching -> Does.Match