Unit-тестирование (NUnit/xUnit)
Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy — урок 67 из 70.
Задание
ЛегкоДавайте завершим ваш проект Системы Библиотеки, добавив модульные тесты! Тестирование необходимо для того, чтобы убедиться, что ваш код работает правильно и продолжает работать по мере внесения изменений. Вы создадите специальный тестовый файл, который проверяет основную функциональность вашей библиотечной системы.
Вы продолжите работу с существующей структурой проекта, добавив новый тестовый файл:
Book.cs: Сохраните ваш класс Book сId,Title,Author,IsAvailable, а также методамиBorrow()иReturn().User.cs: Сохраните ваш класс User с отслеживанием заимствований, константойMaxBooks, методомCanBorrow()и методами для управления заимствованными книгами.Library.cs: Сохраните ваш класс Library с логикой заимствования, методами поиска и методамиGetAllBooks()иGetAllUsers().LibraryTests.cs: Это ваш новый тестовый файл! Создайте тестовый класс, который проверяет правильность работы вашей библиотечной системы. Вы напишете тестовые методы, которые проверяют различные сценарии и сообщают, прошел ли каждый тест или провалился.Program.cs: Ваша точка входа, которая запускает тесты и отображает результаты.
Ваш тестовый класс должен включать методы, тестирующие следующие сценарии:
TestBookBorrow- Проверить, что заимствование доступной книги проходит успешно и изменяет её доступностьTestBookBorrowUnavailable- Проверить, что заимствование уже заимствованной книги завершается соответствующей ошибкойTestUserBorrowingLimit- Проверить, что пользователи не могут заимствовать более 3 книгTestBookReturn- Проверить, что возврат заимствованной книги работает правильноTestSearchByAuthor- Проверить, что поиск по автору возвращает правильные книги
Каждый тестовый метод должен возвращать логическое значение, указывающее, прошел ли тест. Создайте простой обработчик тестов, который выполняет все тесты и выводит результаты.
Вы получите следующие входные данные:
- Количество тестовых сценариев для запуска (1-5, соответствующих перечисленным выше тестам)
Для каждого запущенного теста выведите результат в формате:
{TestName}: {PASS|FAIL}После завершения всех тестов выведите сводку:
--- Test Summary ---
Passed: {count}
Failed: {count}
Total: {count}Например, если на входе:
3Выходные данные должны быть:
TestBookBorrow: PASS
TestBookBorrowUnavailable: PASS
TestUserBorrowingLimit: PASS
--- Test Summary ---
Passed: 3
Failed: 0
Total: 3Другой пример со всеми 5 тестами:
5Выходные данные должны быть:
TestBookBorrow: PASS
TestBookBorrowUnavailable: PASS
TestUserBorrowingLimit: PASS
TestBookReturn: PASS
TestSearchByAuthor: PASS
--- Test Summary ---
Passed: 5
Failed: 0
Total: 5Ваши тесты должны создавать новые экземпляры Book, User и Library для каждого теста, чтобы обеспечить изоляцию. Таким образом, состояние одного теста не влияет на другой. Думайте о каждом тесте как о самодостаточной проверке конкретного поведения вашей системы!
Попробуйте сами
using System;
using Library.Tests;
class Program
{
public static void Main(string[] args)
{
// TODO: Создать экземпляр BorrowingServiceTests
// TODO: Выполнить каждый метод теста, выводя имя теста перед каждым результатом
// Пример:
// Console.WriteLine("BorrowBook_WhenBookAvailable_ReturnsTrue");
// tests.BorrowBook_WhenBookAvailable_ReturnsTrue();
}
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыПространства имен и директивыВведение в классы и объектыКлючевое слово 'this'Методы и параметрыПоля и свойстваКонструкторыИнициализаторы объектовИтоги — Простой калькулятор4Наследование
Основы синтаксиса наследования (:)Ключевое слово 'base'Ключевые слова Virtual и OverrideЗапечатанные классыБазовый класс 'object'Итоги — Иерархия сотрудников7Продвинутые возможности
Перегрузка операторовИндексаторы (this[])Переопределение ToString()Методы расширенияПовторение — Пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПотокобезопасный SingletonПаттерн FactoryПаттерн Observer (События)Паттерн Strategy13Финальные испытания
Платформа для онлайн-обученияКомпонент игрового персонажаСервис аренды транспорта2Свойства и статические члены
Автоматически реализуемые свойстваСвойства только для чтения и записиСтатические поля и методыСтатические классыЧлены в виде выражений5Полиморфизм и интерфейсы
Полиморфизм: компиляция vs выполнениеИнтерфейс vs абстрактный классМножественные интерфейсыЯвные интерфейсыUpcasting и DowncastingИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция вместо наследованияGenerics (классы и методы)Делегаты и событияАтрибуты и рефлексияIDisposable и оператор usingОсновы Dependency Injection11Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн Компоновщик3Архитектура классов
Экземплярные и статические данныеКлючевые слова 'readonly' и 'const'Опорные поляПовторение — Менеджер банковских счетов6Инкапсуляция
Модификаторы доступаСвойства для инкапсуляцииРеализация скрытия данныхПаттерны неизменяемостиИтоги — Записи студентов9Переменное количество аргументов
Ключевое слово 'params'Необязательные параметрыИменованные аргументыПерегрузка методов12Проект: Система библиотеки
Структура проектаМодели книг и пользователей