Практическая работа № 13.
Автоматизация модульного тестирования
Цель работы: изучить возможность создания автоматических тестов, для модульного тестирования.
Сегодня тестирование – это обязательная часть процесса разработки программного обеспечения (далее – ПО). Это связано с жесткими правилами конкуренции для компаний, производящих программные продукты (ПП).
Раньше таких компаний на рынке было мало и пользователи программных продуктов были продвинутыми и заменяли тестеров. Если в программе обнаруживались баги, то пользователь звонил или отправлял письмо в компанию, где ошибку исправляли и по почте отправляли дискетку со свежим релизом. Но начиная с 1990 года согласно статистики продажи персональных компьютеров с каждым годом удваивались. И появилась армия пользователей, которая не готова была что-то тестировать. Если что-то не устроило было проще обменять на другой софт, т.к. число компаний производящих ПО тоже увеличивалось с каждых готом. И у пользователей появился выбор что покупать и чем пользоваться.
Таким образом, тестирование ушло внутрь компаний, и появилась профессия тестировщика.
Рассмотрим определение, которое записано в SWEBOK.
Тестирование ПО – это проверка соответствия между реальным поведением программы и ее ожидаемым поведением на конечном наборе тестов, выбранном определенным образом. [IEEE Guide to Software Engineering Body of Knowledge, SWEBOK, 2004].
Все виды тестирования можно условно разделить на две большие группы:
Статическое тестирование (static testing).
Динамическое тестирование (dynamic testing).
Статическое тестирование – это процесс анализа самой разработки программного обеспечения, т. е. тестирование без запуска программы.
К данной группе можно отнести анализ кода. Данный вид тестирования осуществляется в основном программистами. Проводят тестирование артефактов разработки программного обеспечения, таких как требования, дизайн или программный код, проводимое без исполнения этих артефактов. Например, с помощью рецензирования или статического анализа.
Статический анализ кода (static code analysis) – это анализ исходного кода, производимый без его исполнения.
Динамическое тестирование – это тестовая деятельность, предусматривающая эксплуатацию (запуск) программного продукта.
Динамическое тестирование предполагает запуск программы, выполнение всех еe функциональных модулей и сравнение фактического ее поведения с ожидаемым.
Статическое тестирование позволяет обнаружить дефекты, которые являются результатом ошибки и привести к сбоям в программном обеспечении. Динамическое тестирование позволяет продемонстрировать непосредственно сбои в программном обеспечении.
Существует несколько признаков, по которым принято производить классификацию видов тестирования.
По знанию системы выделяют:
-
тестирование «черного ящика» (black box testing);
-
тестирование «белого ящика» (white box testing);
-
тестирование «серого ящика» (grey box testing).
Модульное тестирование, или юнит-тестирование (англ. unit testing) — процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы.
Идея состоит в том, чтобы писать тесты для каждой нетривиальной функции или метода. Это позволяет достаточно быстро проверить, не привело ли очередное изменение кода к регрессии, то есть к появлению ошибок в уже оттестированных местах программы, а также облегчает обнаружение и устранение таких ошибок.
Цель модульного тестирования — изолировать отдельные части программы и показать, что по отдельности эти части работоспособны.
ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ И
ФОРМА ОТЧЕТНОСТИ:
Задание 1. Создание проекта программы, модули которого будут тестироваться.
Разработаем проект содержащий класс, который вычисляет площадь прямоугольника по длине двух его сторон.
Создадим в Visual Studio новый проект Visual C# - Библиотека классов. Назовём его MathTaskClassLibrary.
Class1 переименуем в Geometry.
В классе реализуем метод, вычисляющий площадь прямоугольника. Для демонстрации остановимся на работе с целыми числами. Код программы приведён ниже.
Создание проекта для модульного тестирования в Visual Studio.
Чтобы выполнить unit-тестирование, необходимо в рамках того же самого решения создать ещё один проект соответствующего типа.
Правой кнопкой щёлкните по решению, выберите “Добавить” и затем “Создать проект…”.
В открывшемся окне в группе Visual C# щёлкните “Тест”, а затем выберите “Проект модульного теста”. Введите имя проекта MathTaskClassLibraryTests и нажмите “ОК”. Таким образом проект будет создан.
Перед Вами появится следующий код:
Директива [TestMethod] обозначает, что далее идёт метод, содержащий модульный (unit) тест. А [TestClass] в свою очередь говорит о том, что далее идёт класс, содержащий методы, в которых присутствуют unit-тесты.
В соответствии с принятыми соглашениями переименуем класс UnitTest1 в GeometryTests.
Затем в References проекта необходимо добавить ссылку на проект, код которого будем тестировать. Правой кнопкой щёлкаем на References, а затем выбираем “Добавить ссылку…”.
В появившемся окне раскрываем группу “Решение”, выбираем “Проекты” и ставим галочку напротив проекта MathTaskClassLibrary. Затем жмём “ОК”.
Также в коде необходимо подключить с помощью директивы using следующее пространство имён:
using MathTaskClassLibrary;
Займёмся написание теста. Проверим правильно ли вычисляет программа площадь прямоугольника со сторонами 3 и 5. Ожидаемый результат (правильное решение) в данном случае это число 15.
Переименуем метод TestMethod1() в RectangleArea_3and5_15returned(). Новое название метода поясняет, что будет проверяться (RectangleArea – площадь прямоугольника) для каких значений (3 и 5) и что ожидается в качестве правильного результата (15 returned).
Тестирующий метод обычно содержит три необходимых компонента:
-
исходные данные: входные значения и ожидаемый результат;
-
код, вычисляющий значение с помощью тестируемого метода;
-
код, сравнивающий ожидаемый результат с полученным.
Соответственно тестирующий код будет таким:
Для сравнения ожидаемого результата с полученным используется метод AreEqual класса Assert. Данный класс всегда используется при написании unit тестов в Visual Studio.
Теперь, чтобы просмотреть все тесты, доступные для выполнения, необходимо открыть окно “Обозреватель тестов”. Для этого в меню Visual Studio щёлкните на кнопку “ТЕСТ”, выберите “Окна”, а затем нажмите на пункт “Обозреватель тестов”.
В студии появится следующее окно:
В данный момент список тестов пуст, поскольку решение ещё ни разу не было собрано. Выполним сборку нажатием клавиш Ctrl + Shift + B. После её завершения в “Обозревателе тестов” появится наш тест.
Синяя табличка с восклицательным знаком означает, что указанный тест никогда не выполнялся. Выполним его.
Для этого нажмём правой кнопкой мыши на его имени и выберем “Выполнить выбранные тесты”.
Зелёный кружок с галочкой означает, что модульный тест успешно пройден: ожидаемый и полученный результаты равны.
Изменим код метода RectangleArea, вычисляющего площадь прямоугольника, чтобы сымитировать провал теста и посмотреть, как поведёт себя Visual Studio. Прибавим к возвращаемому значению 10.
Запустим unit-тест.
Как Вы видите, красный круг с крестиком показывает провал модульного теста, а ниже указано, что при проверке ожидалось значение 15, а по факту оно равно 25.
Задание 2. Разработать программу по вариантам и создать модульный тест.
-
Кэрролл в своем дневнике писал, что он тщетно трудился, пытаясь найти хотя бы три прямоугольных треугольника равной площади, у которых длины сторон были бы выражены натуральными числами. Составьте программу для решения этой задачи, если известно, что такие треугольники существуют. Напишите программу, которая находит все прямоугольные треугольники (длины стороны выражаются натуральными числами), площадь которых не превышает данного числа S.
-
Напишите программу, которая определяет, сколько можно купить быков, коров и телят, платя за быка 10 рублей, за корову - 5 рублей, а за теленка - 50 копеек, если на 100 рублей надо купить 100 голов скота?
-
Коту снится, что его окружили тринадцать мышей. Двенадцать из них серые, а одна белая. С какой мыши ему начать счет, если он съедает каждую тринадцатую, а белую мышь должен съесть последней? Обобщить задачу на случай n мышей, и счет ведется до m мыши.
-
Найдите наибольший общий делитель двух натуральных чисел. Реализуйте два варианта: рекурсивный и без рекурсии. Обобщите задачу для n натуральных чисел.
-
Определите, являются ли данные два натуральных числа взаимно простыми. Составьте функцию, которая проверяла бы, являются ли три числа взаимно простыми.
-
Найдите наименьшее общее кратное данных двух натуральных чисел. Исходные данные — последовательность натуральных чисел. В конце последовательности — нуль. Составьте программу для нахождения наименьшего общего кратного всех членов ряда. Кратным ряда считается наименьшее натуральное число, которое делится без остатка на все члены ряда.
-
Напишите программу, позволяющую выполнять арифметические операции (сложение, разность, умножение, целочисленное деление, нахождение остатка) и операции сравнения (больше, меньше, равно, не больше, не равно и т.д.) над большими целыми числами.
-
Напишите программу для сокращение дроби, сложения, вычитания, умножения и деления двух дробей. Избежать переполнения в процессе вычисления в тех случаях, когда числитель и знаменатель результата находятся в допустимых пределах.
-
Преобразовать простую дробь в десятичную. Если дробь окажется периодической, то период указать в скобках. Период искать в первых 100 цифрах после запятой.
-
Пусть сберегательные банки по бессрочным вкладам выплачивают p % годовых от суммы вклада, присоединяемых к вкладу. Если вкладчик не снимает деньги с вклада, то проценты ежегодно начисляются со все большей суммы. Найдите величину вклада через m лет.
-
Бизнесмен 31 декабря взял в банке 9 930 000 рублей в кредит под 10% годовых. Схема выплаты кредита следующая: 31 декабря каждого следующего года банк начисляет проценты на оставшуюся сумму долга (то есть увеличивает долг на 10%), затем бизнесмен переводит в банк определённую сумму ежегодного платежа. Какова должна быть сумма ежегодного платежа, чтобы долг был выплачен тремя равными ежегодными платежами?
-
Напишите программу определяющую, является ли данный год високосным, количество дней в данном месяца данного года, правильность даты вида день:месяц:год.
-
Факториалом числа натурального числа n называется произведение чисел от 1 до n включительно. Факториалом нуля называют единицу. Написать программу нахождения факториала данного числа. Реализовать через рекурсию и без рекурсии. Вывести на экран факториалы от десяти первых чисел.
-
Последовательность 1,1,2,3,5,8,... состоит из чисел Фибоначчи. Каждый элемент, начиная с третьего, равен сумме двух предыдущих. Найдите n-е число Фибоначчи. Реализовать вариант с рекурсией и вариант без рекурсии. Вывести на экран n строк из символов "*". Количество символов в строке с номером k равно k-ому числу Фибоначчи. Вывести на экран все числа Фибоначчи, меньшие данного числа.
-
Найти квадрат данного натурального числа, если квадрат любого натурального числа n равен сумме n первых нечетных чисел. Составить таблицу квадратов натуральных чисел от 1 до 10000. Куб любого натурального числа n равен сумме n нечетных чисел, следующих по порядку за числами, сумма которых составила куб числа n−1. С помощью этого факта составьте таблицу кубов натуральных чисел от 1 до 100.
-
Написать программу нахождения целой части и остатка кубического корня из натурального числа (целочисленное извлечение кубического корня). Обобщить на корень произвольной натуральной степени, большей двух.
-
Зашифровать данный текст с помощью шифра Цезаря.