Лабораторная работа 8, страница 2
Описание файла
Документ из архива "Лабораторная работа 8", который расположен в категории "". Всё это находится в предмете "технология проектирования" из 10 семестр (2 семестр магистратуры), которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "технология проектирования" в общих файлах.
Онлайн просмотр документа "Лабораторная работа 8"
Текст 2 страницы из документа "Лабораторная работа 8"
}
catch (Exception ex)
{
richTextBox1.Text += "Перехвачено исключение: " +
ex.ToString() + "\nТест не пройден.\n";
}
try
{
richTextBox1.Text += "Test Case 2\n";
richTextBox1.Text += "Входные данные: a= -2850800078, b =
3000000000\n";
richTextBox1.Text += "Ожидаемый результат: res = 0 && error =
\"Error 06\"\n";
int res = CalcClass.Add(-2850800078, 3000000000);
string error = CalcClass.lastError;
richTextBox1.Text += "Код ошибки: " + error + "\n";
richTextBox1.Text += "Получившийся результат: " + "res = " +
res.ToString() + " error = " + error.ToString() + "\n";
if (res == 0 && error == "Error 06")
{
richTextBox1.Text += "Тест пройден\n\n";
}
else
{
richTextBox1.Text += "Тест не пройден\n\n";
}
}
catch (Exception ex)
{
richTextBox1.Text += "Перехвачено исключение: " +
ex.ToString() + "\nТест не пройден.\n";
}
try
{
richTextBox1.Text += "Test Case 3\n";
richTextBox1.Text += "Входные данные: a= 3000000000, b = -
2850800078\n";
richTextBox1.Text += "Ожидаемый результат: res = 0 && error =
\"Error 06\"\n";
int res = CalcClass.Add(3000000000, -2850800078);
string error = CalcClass.lastError;
richTextBox1.Text += "Код ошибки: " + error+"\n";
richTextBox1.Text += "Получившийся результат: " + "res = " +
res.ToString() + " error = " + error.ToString() + "\n";
if (res == 0 && error == "Error 06")
{
richTextBox1.Text += "Тест пройден\n\n";
}
else
{
richTextBox1.Text += "Тест не пройден\n\n";
}
}
catch (Exception ex)
{
richTextBox1.Text += "Перехвачено исключение: " +
ex.ToString() + "\nТест не пройден.\n";
}
try
{
richTextBox1.Text += "Test Case 4\n";
richTextBox1.Text += "Входные данные: a= 2000000000, b =
2000000000\n";
richTextBox1.Text += "Ожидаемый результат: res = 0 && error =
\"Error 06\"\n";
int res = CalcClass.Add(2000000000, 2000000000);
string error = CalcClass.lastError;
richTextBox1.Text += "Код ошибки: " + error +"\n";
richTextBox1.Text += "Получившийся результат: " + "res = " +
res.ToString() + " error = " + error.ToString() + "\n";
if (res == 0 && error == "Error 06")
{
richTextBox1.Text += "Тест пройден\n\n";
}
else
{
richTextBox1.Text += "Тест не пройден\n\n";
}
}
catch (Exception ex)
{
richTextBox1.Text += "Перехвачено исключение: " +
ex.ToString() + "\nТест не пройден.\n";
}
}
Листинг 7.1. Текст программы
Каждый тестовый пример находится внутри блока try-catch для того, чтобы перехватить любое сгенерированное исключение внутри методов Add().
При этом файл CalcClass.dll, в котором и реализованы все математические методы, необходимо добавить в References проекта.
Проведем тестирование и получим следующий результат:
Test Case 1
Входные данные: a= 78508, b = -304
Ожидаемый результат: res = 78204 && error = ""
Код ошибки:
Получившийся результат: res = 78204 error =
Тест пройден
Test Case 2
Входные данные: a= -2850800078, b = 3000000000
Ожидаемый результат: res = 0 && error = "Error 06"
Код ошибки: Error 06
Получившийся результат: res = 0 error = Error 06
Тест пройден
Test Case 3
Входные данные: a= 3000000000, b = -2850800078
Ожидаемый результат: res = 0 && error = "Error 06"
Код ошибки: Error 06
Получившийся результат: res = 0 error = Error 06
Тест пройден
Test Case 4
Входные данные: a= 2000000000, b = 2000000000
Ожидаемый результат: res = 0 && error = "Error 06"
Код ошибки: Error 06
Получившийся результат: res = 0 error = Error 06
Тест пройден
Точно такой же результат мы бы получили и при ручном тестировании, если бы выявленные ошибки были исправлены. Заметим, что при таком подходе к тестированию нам удается локализовать ошибки. Если что-то работает не так, как надо, то можно с уверенностью утверждать, что ошибка содержится именно в функции деления, в то время, как на прошлом семинаре мы не могли сказать, где именно она произошла.
Замечание. Мы считаем, что тестовый драйвер сам не содержит ошибок. Тестирование тестового драйвера выходит за пределы изучаемой темы.
Автоматическое модульное тестирование
Для создания теста нажимаем правой кнопкой мыши на методе Add() и выбирая пункт меню Create Unit Tests... (рис. 12.1). Появится диалоговое окно, позволяющее создать тесты в другом проекте (рис. 12.2). По умолчанию, создаваемый проект — новый проект на Visual Basic, но также доступны тестовые проекты на C# и C ++. Выбираем Visual C# и нажимаем кнопку OK, перед тем введя имя проекта BaseCalculator.Test.
Рис. 12.1. Пункт контекстного меню " Create Unit Tests ..." в методе Add()
Рис. 12.2. Диалоговое окно "Create Unit tests"
Созданный тестовый проект содержит четыре файла, связанных с тестированием.
Имя файла | Примечание |
AuthoringTest.txt | Примечания о создании тестов, включающие инструкции по добавлению дополнительных тестов к проекту |
CalcClassTest.cs | Включает в себя сгенерированный тест для тестирования метода Add () наряду с методами для тестовой инициализации и очистки |
ManualTest1.mht | Шаблон, который заполняется инструкциями при ручном тестировании |
UnitTest1.cs | Пустая структура unit test класса, куда помещаются дополнительные тесты |
Так как ручное тестирование мы уже провели, и файл для тестов у нас уже есть, то мы удалим ManualTest1.mht и UnitTest1.cs.
В раздел References при генерации тестового проекта добавляется ссылки на Microsoft.VisualStudio.QualityTools.UnitTestFramework и проект BaseCalculator, который и будет тестироваться. Первое – сборка, которую использует "движок" модульного тестирования при выполнении тестов. Второе — это ссылка на ту сборку, которую мы тестируем.
По умолчанию, сгенерированный тест-метод – это шаблон со следующей реализацией:
/// <summary>
///A test for Add (long, long)
///</summary>
[DeploymentItem("BaseCalculator.exe")]
[TestMethod()]
public void AddTest()
{
long a = 0; // TODO: Initialize to an appropriate value
long b = 0; // TODO: Initialize to an appropriate value
int expected = 0;
int actual;
actual = BaseCalculator.Test.
BaseCalculator_CalcClassAccessor.Add(a, b);
Assert.AreEqual(expected, actual,
"BaseCalculator.CalcClass.Add did not return
the expected value.");
Assert.Inconclusive("Verify the correctness of this test method.");
}
Замечание. Сгенерированный код теста будет сильно зависеть от типа и сигнатуры того метода, который планируется тестировать. Например, мастер сгенерирует код, основанный на технологии reflection ("отражение"), для тестирования private функций. В нашем конкретном случае это не потребовалось, так как метод Add() объявлен как public().
Прежде всего, отметим, что сгенерированный код помечен атрибутом TestMethod типа TestMethodAttribute, а сам класс помечен атрибутом TestClassAttribute, которые объявлены в Microsoft.VisualStudio.QualityTools.UnitTesting.Framework. При помощи технологии Reflection движок модульного тестирования находит все тестовые классы в проекте, помеченные соответствующим атрибутом, а внутри все необходимые для тестирования методы.
В начале теста объявляется значение всех необходимых переменных, а также ожидаемое выходное значение. Затем происходит вызов нужного метода, которому передаются необходимые параметры. В нашем случае это
actual = BaseCalculator.Test.BaseCalculator_CalcClassAccessor.Add(a, b);
Затем идет вызов двух методов класса Assert. Прежде всего рассмотрим второй метод.
Assert.Inconclusive("Verify the correctness of this test method.");
Наличие этого метода в тесте говорит о том, что реализация теста еще не закончена. Сделаем реализацию нашего метода:
/// <summary>
///A test for Add (long, long)
///</summary>
[DeploymentItem("BaseCalculator.exe")]
[TestMethod()]
public void AddTest()
{
long a = 150;
long b = 350;
int expected = 500;
int actual;
actual = BaseCalculator.
Test.BaseCalculator_CalcClassAccessor.Add(a, b);
Assert.AreEqual(expected, actual,
"BaseCalculator.CalcClass.
Add did not return the expected value.");
}
Создание тестов
Чтобы запустить все тесты в рамках проекта, необходимо просто запустить тестовый проект. Один из возможных способов сделать это — кликнуть правой кнопкой мыши на проекте BaseCalculator.Test в Solution explorer и выбрать Set as StartUp Project. Затем используем пункты меню Debug->Start (F5) или Debug->Start Without Debugging (Ctrl+F5), чтобы начать запуск тестов.
В окне Test Results будет показан список со всеми тестами проекта. В момент начала выполнения теста в нашем проекте содержалось два теста: один полностью реализованный тест AddTest, второй – неоконченный AddTest1. В момент запуска оба теста будут в состоянии "неоконченный" (Pending), но как только тесты будет выполнены, появятся результаты выполнения Passed и Inconcluiseve, которые мы и ожидали (Рис. 12.3).
Рис. 12.3. Окно Test Results после выполнения всех тестов
Замечание. Рис. 12.3 показывает окно Test Results. На этом скриншоте в дополнение к колонкам по умолчанию изображена колонка Error Message. Колонки могут быть добавлены или удалены правым щелчком мыши по меню на заголовках колонки и выборе пункта меню Add/Remove Columns... .
Чтобы посмотреть дополнительные детали о тесте, мы можем дважды щелкнуть на нем в окне Test Results и открыть окно AddTest[Result] (рис. 12.4). В нем можно узнать информацию о скорости выполнения теста, его результате, возникшей ошибке и прочее.
Рис. 12.4. Окно детального описания теста AddTest [Results]
Кроме того, мы можем кликнуть правой кнопкой мыши на отдельных тестах и выбирать пункт меню Open Test, чтобы переместиться на код теста.
Обработка исключений
Допустим, что метод RunEstimate() класса AnalaizerClass не достаточно хорошо проверяет объекты, с которыми он работает. Если инициализировать список opz значением {2,2,+,+}, то выполнение метода RunEstimate() приводит к генерации исключения. Действительно, реализуем тест:
/// <summary>
///A test for RunEstimate ()
///</summary>
[DeploymentItem("BaseCalculator.exe")]
[TestMethod()]
public void RunEstimateTest()
{
string expected = null;
string actual;