Unit-тестирование (NUnit/xUnit)
Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy. Урок 67 из 70.
Задание
ЛегкоДавайте завершим проект Library System, добавив модульные тесты! Тестирование необходимо, чтобы убедиться, что ваш код работает правильно и продолжает работать при внесении изменений. Вы создадите отдельный файл тестов, который проверяет основные функции вашей библиотечной системы.
Вы продолжите работать с существующей структурой проекта и добавите новый файл тестов:
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;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// Считайте количество тестов, которые нужно запустить
int numTests = Convert.ToInt32(Console.ReadLine());
// TODO: Создайте объект LibraryTests и запустите первые numTests тестов
}
}
}
Все уроки раздела Объектно-ориентированное программирование
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Проект: Система библиотеки
Структура проектаМодели книг и пользователейЛогика системы выдачи книгLINQ для поискаКонсольный UI / Интерфейс администратораUnit-тестирование (NUnit/xUnit)Потренируйтесь самостоятельно: Онлайн-компилятор C#