Область применения:Visual Studio
Visual Studio для Mac
Visual Studio Code
В этой статье приводится подробное описание процесса создания, запуска и настройки набора модульных тестов с помощью платформы модульных тестов Майкрософт для управляемого кода и обозревателя тестов Visual Studio. В руководстве производится создание проекта C#, находящегося в стадии разработки, создание тестов для проверки его кода, запуск тестов и изучение результатов. После этого производится изменение кода проекта и повторный запуск тестов. Если вы хотите получить концептуальный обзор этих задач перед выполнением этих шагов, см. Основы модульного тестирования.
Создайте проект для тестирования
- Запустите Visual Studio.
- На начальном экране выберите Создать проект.
- Найдите и выберите шаблон проекта Консольное приложение на C#для .NET Core и щелкните Далее.
Примечание Если шаблон Консольное приложение отсутствует, его можно установить из окна Создание проекта. В сообщении Не нашли то, что искали? выберите ссылку Установка других средств и компонентов. После этого в Visual Studio Installer выберите рабочую нагрузку Кроссплатформенная разработка .NET Core.
Мастер-класс. Создание тестов в программе MyTestXPro.
Примечание Если файл Program.cs не откроется в редакторе, дважды щелкните Program.cs в обозревателе решений, чтобы открыть его.
using System; namespace BankAccountNS < /// /// Bank account demo class. /// public class BankAccount < private readonly string m_customerName; private double m_balance; private BankAccount() < >public BankAccount(string customerName, double balance) < m_customerName = customerName; m_balance = balance; >public string CustomerName < get < return m_customerName; >> public double Balance < get < return m_balance; >> public void Debit(double amount) < if (amount >m_balance) < throw new ArgumentOutOfRangeException(«amount»); >if (amount < 0) < throw new ArgumentOutOfRangeException(«amount»); >m_balance += amount; // intentionally incorrect code > public void Credit(double amount) < if (amount < 0) < throw new ArgumentOutOfRangeException(«amount»); >m_balance += amount; > public static void Main() < BankAccount ba = new BankAccount(«Mr. Bryan Walton», 11.99); ba.Credit(5.77); ba.Debit(11.22); Console.WriteLine(«Current balance is $», ba.Balance); > > >
Теперь у вас есть проект с методами, которые можно протестировать. В этой статье тестирование проводится на примере метода Debit . Метод Debit вызывается, когда денежные средства снимаются со счета.
Создание проекта модульного теста
Совет В обозревателе решений щелкните решение правой кнопкой мыши и выберите пункты Добавить>Создать проект.
Создание тестов для проведения экзаменов
Примечание в Visual Studio 2019 версии 16.9 шаблон проекта MSTest имеет формат проекта модульного теста.
Создание тестового класса
Создание тестового класса, чтобы проверить класс BankAccount . Можно использовать UnitTest1.cs, созданный в шаблоне проекта, но лучше дать файлу и классу более описательные имена.
Переименуйте файл и класс
- Чтобы переименовать файл, в обозревателе решений выберите файл UnitTest1.cs в проекте BankTests. В контекстном меню выберите команду Переименовать (или нажмите клавишу F2), а затем переименуйте файл в BankAccountTests.cs.
- Чтобы переименовать класс, поместите курсор в UnitTest1 в редакторе кода, щелкните правой кнопкой мыши и выберите команду Переименовать (или нажмите клавиши F2). Введите название BankAccountTests и нажмите клавишу ВВОД.
Файл BankAccountTests.cs теперь содержит следующий код:
using Microsoft.VisualStudio.TestTools.UnitTesting; namespace BankTests < [TestClass] public class BankAccountTests < [TestMethod] public void TestMethod1() < >> >
Добавьте оператор using
Можно также добавить оператор using в класс, чтобы тестируемый проект можно было вызывать без использования полных имен. Вверху файла класса добавьте:
using BankAccountNS;
Требования к тестовому классу
Минимальные требования к тестовому классу следующие:
- Атрибут [TestClass] является обязательным в любом классе, содержащем методы модульных тестов, которые необходимо выполнить в обозревателе тестов.
- Каждый метод теста, предназначенный для запуска в обозревателе тестов, должен иметь атрибут [TestMethod] .
Можно иметь другие классы в проекте модульного теста, которые не содержат атрибута [TestClass] , а также иметь другие методы в тестовых классах, у которых атрибут — [TestMethod] . Можно вызывать эти другие классы и методы в методах теста.
Создание первого тестового метода
В этой процедуре мы напишем методы модульного теста для проверки поведения метода Debit класса BankAccount .
Существует по крайней мере три поведения, которые требуется проверить:
- Метод создает исключение ArgumentOutOfRangeException , если сумма по дебету превышает баланс.
- Метод создает исключение ArgumentOutOfRangeException, если сумма по дебету меньше нуля.
- Если значение дебета допустимо, то метод вычитает сумму дебета из баланса счета.
Метод по умолчанию TestMethod1 можно удалять, так как он не используется в этом руководстве.
Создание метода теста
Первый тест проверяет, снимается ли со счета нужная сумма при допустимом размере кредита (со значением меньшим, чем баланс счета, и большим, чем ноль). Добавьте следующий метод в этот класс BankAccountTests :
[TestMethod] public void Debit_WithValidAmount_UpdatesBalance() < // Arrange double beginningBalance = 11.99; double debitAmount = 4.55; double expected = 7.44; BankAccount account = new BankAccount(«Mr. Bryan Walton», beginningBalance); // Act account.Debit(debitAmount); // Assert double actual = account.Balance; Assert.AreEqual(expected, actual, 0.001, «Account not debited correctly»); >
Метод очень прост: он создает новый объект BankAccount с начальным балансом, а затем снимает допустимое значение.
Он использует метод Assert.AreEqual, чтобы проверить, что конечный баланс соответствует ожидаемому. Такие методы, как Assert.AreEqual , Assert.IsTrue и другие, зачастую используются в модульном тестировании. Дополнительную концептуальную информацию о написании модульного теста см. в разделе Написание тестов.
Требования к методу теста
Метод теста должен удовлетворять следующим требованиям:
- Он декорируется атрибутом [TestMethod] .
- Он возвращает void .
- Он не должен иметь параметров.
Сборка и запуск теста
- В меню Сборка нажмите Построить решение (или нажмите клавиши CTRL + SHIFT + B).
- Откройте Обозреватель тестов, выбрав Тест>Windows>Обозреватель тестов в верхней строке меню (или нажмите клавиши CTRL + E, T).
- Выберите Запустить все, чтобы выполнить тест (или нажмите клавиши CTRL + R, V). Во время выполнения теста в верхней части окна Обозреватель тестов отображается анимированная строка состояния. По завершении тестового запуска строка состояния становится зеленой, если все методы теста успешно пройдены, или красной, если какие-либо из тестов не пройдены. В данном случае тест пройден не будет.
- Выберите этот метод в обозревателе тестов для просмотра сведений в нижней части окна.
Исправление кода и повторный запуск тестов
Результат теста содержит сообщение, описывающее возникшую ошибку. Чтобы увидеть это сообщение, может потребоваться выполнить детализацию. Для метода AreEqual выводится сообщение о том, что ожидалось и что было фактически получено. Ожидалось, что баланс уменьшится, а вместо этого он увеличился на сумму списания.
Модульный тест обнаружил ошибку: сумма списания добавляется на баланс счета, вместо того чтобы вычитаться.
Исправление ошибки
Чтобы исправить эту ошибку, в файле BankAccount.cs замените строку:
m_balance += amount;
m_balance -= amount;
Повторный запуск теста
В обозревателе тестов выберите Запустить все, чтобы запустить тест повторно (или нажмите клавиши CTRL + R, V). Красно-зеленая строка становится зеленой, чтобы указать, что тест был пройден.
Использование модульных тестов для улучшения кода
В этом разделе рассматривается, как последовательный процесс анализа, разработки модульных тестов и рефакторинга может помочь сделать рабочий код более надежным и эффективным.
Анализ проблем
Как начать писать тесты за 10 шагов по 10 минут
Дайте-ка угадаю: вы согласны с тем, что писать тесты — это хорошо. Это повышает надежность системы, ускоряет разработку, проект с хорошим тестовым покрытием поддерживать легко и приятно, а TDD — это вообще почти идеал процесса разработки. Но не у вас в проекте. То есть, оно клёво, но, к сожалению, сейчас столько работы — просто завал.
Куча задач, одних только критических багов — два десятка, плюс надо срочно дописать этот модуль и еще написать письмо заказчику… Так что тесты, наверное, будем прикручивать уже в конце, если время останется. Или в следующем проекте. Нет, ну там точно полегче будет. Скорее всего.
Как, узнали ситуацию?
Так вот — чушь всё это. Сфера ИТ — бесконечна, как вселенная, куча работы будет всегда. Можно или начать писать тесты прямо сейчас, или не сделать этого никогда. Я тут набросал короткий план, как начать это делать за 10 шагов, по шагу в день, по 10 минут на шаг. И когда я говорю «10 минут» я имею в виду не «3 с половиной часа» и не «ну сколько-то времени, лучше побольше», а именно 600 секунд.
Если у вас нету в день 600 секунд свободного времени — срочно меняйте проект, работу, профессию, страну проживания (нужное подчеркнуть), потому что это не жизнь, а каторга какая-то. Поехали.
1. Выбираем фреймворк для тестов
Не вздумайте начинать писать собственный фреймворк с нуля — оно вам надо? Тратить неделю на выбор оптимального фреймворка (да, я видел такую оценку времени на это в планах) — тоже глупо. Вот вам рецепт: набирайте в Гугле best test framework for %language% site:stackoverflow.com. Открываете первые 5 ссылок. Закрываете те из них, где рейтинг вопроса или первого ответа около нуля.
Из оставшихся вкладок можно смело брать любой рекомендованный фреймворк из первой тройки с максимальным рейтингом. С вероятностью в 99.5% он вам подойдет. Поскольку на данный шаг вы пока потратили минуты 3, то оставшиеся 7 можно потратить на то, чтобы перейти на сайт фреймворка и посмотреть примеры его использования. Скорее всего, там всё будет просто и понятно (иначе он не был бы в топе рекомендаций). Но если вдруг нет — выберите другой по тому же алгоритму.
2. Пишем Hello world!
Написать Hello, world! нам раз плюнуть. Вот, например, на С++.
Hello world!
#include using namespace std; int main()
А теперь сделаем две вещи.
Во-первых, вынесем генерацию выводимого текста в отдельные функции. Да, в две. Это для того, чтобы потом их можно было тестировать.
Hello world! после рефакторинга
#include #include using namespace std; string GetHello() < return «Hello»; >string GetAdressat(string adressat) < return adressat; >int main()
Во-вторых, вынесем написанные функции куда-нибудь из данного файла. В зависимости от подхода и применяемого языка это могут быть просто отдельные файлы кода или библиотека. Это нужно для того, чтобы потом эти функции вызывать из тестов.
У нас будет так:
HelloFunctions.h
#include using namespace std; string GetHello(); string GetAdressat(string adressat);
HelloFunctions.cpp
#include «HelloFunctions.h» string GetHello() < return «Hello»; >string GetAdressat(string adressat)
HelloWorld.cpp
#include #include «HelloFunctions.h» using namespace std; int main()
3. Подключаем фреймворк к Hello world!
О подключении фреймворка к проекту наверняка очень хорошо написано на сайте фреймворка.
Или на stackoverflow. Или на Хабре. Вот я, к примеру, когда-то описывал подключение Google Test. Обычно всё сводится к созданию нового проекта консольного исполняемого приложения (в скриптовых языках — отдельного скрипта), подключению к нему фрейворка парой include (importusing), подключению к проекту тестируемого кода (включением самих файлов с кодом или подключением библиотеки) — ну и всё. Если вы не верите, что этот шаг можно сделать за 10 минут — откройте Youtube, напишите в поиск название своего фреймворка и пронаблюдайте 20 видеороликов примерно одинакового содержимого, которые это доказывают.
4. Разбираемся с возможностями фреймворка
- Как написать один юнит-тест
- Как запустить юнит-тесты
Вот, к примеру, пару тестов для нашего Hello world! на упомянутом выше Google Test:
#include «HelloFunctions.h» #include «gtest/gtest.h» class CHelloTest : public ::testing::Test < >; TEST_F(CHelloTest, CheckGetHello) < ASSERT_TRUE(GetHello() == «Hello»); >TEST_F(CHelloTest, GetAdressat) < ASSERT_TRUE(GetAdressat(«world») == «world»); ASSERT_FALSE(GetAdressat(«not world») == «world»); >int main(int argc, char **argv)
5. Подключаем фреймворк к настоящему проекту
EduNeo
актуальные методики преподавания, новые технологии и тренды в образовании, практический педагогический опыт.
Главная | Технологии для учителя и преподавателей | 7 лучших сервисов для создания тестов и опросов
7 лучших сервисов для создания тестов и опросов
Aвтор материала: Кристина Путина —
эксперт образовательного центра «Каменный город».
Проект автора: Каменный город
Тесты давно стали неотъемлемой частью рабочих будней любого педагога. Раньше приходилось печатать их на бумаге, собирать листочки или тетради у каждого ученика, вручную проверять и анализировать результаты, гадать с ответами из-за почерков…
Сейчас в нашем распоряжении онлайн-сервисы на любой вкус, которые серьезно экономят время и ресурсы. Мы получаем новые возможности: дистанционный сбор ответов, автоматическую оценку результатов, мгновенное редактирование материалов.