Лабораторная работа №3 ТПП
.docxМинистерство цифрового развития, связи и массовых коммуникаций Российской Федерации
Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования
«Московский технический университет связи и информатики»
(МТУСИ)
Кафедра: «Математическая кибернетика и информационные технологии»
Индивидуальная работа
Дисциплина: «Тестирование программных продуктов»
по теме:
«Модульное и интеграционное тестирование»
Выполнили: студенты
_________________________
Проверил:
Говоров Павел Михайлович
_________________________
Москва, 2026
Цель
Создать калькулятор на языке Java и написание модульных тестов. Создать консольное приложения С++ и написание интеграционное тестов.
Ход выполнения работы
Модульное тестирование
Для создания проекта необходимо зайти в среду разработки. В своей работе мы используем IntelliJ IDEA Community Edition 2024.1.
IntelliJ IDEA — интегрированная среда разработки программного обеспечения для многих языков программирования, в частности Java, JavaScript, Python, разработанная компанией JetBrains.
Создание проект (См. Рисунок 1) имя проекта Calculator, выберем Build system - Maven.
Рисунок 1 – Создание проекта
Код программы представлен в Листинге 1. Название класса Calculator метод main в зависимости от ввода пользователя совершает математические операции с введенными числами.
Листинг 1 – Код программы
package org.example;
import java.util.Scanner; public class Calculator { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Введите первое число: "); double num1 = scanner.nextDouble(); System.out.print("Введите второе число: "); double num2 = scanner.nextDouble(); System.out.print("Выберите операция (+, -, *, /): "); char operator = scanner.next().charAt(0); double result; switch (operator) { case '+': result = num1 + num2; break; case '-': result = num1 - num2; break; case '*': result = num1 * num2; break; case '/': result = num1 / num2; if (num2 == 0){ System.out.println("Ошибка деления на ноль!"); break; } break; default: System.out.println("Неверная операция!"); return; } System.out.println("Результат: " + result); } }
Пример выполнения проекта представлен на рисунке 2. Введём числа 3 и 4, выбрав операцию сложения +. Результат выполнения программы должно быть число 7, которые мы и видим на рисунке.
Рисунок 2 – Пример выполнения программы
Нажмем на public class Calculator правой кнопкой мыши и выберем пункт Show Context Actions. Выберем пункт меню Сreate test.
На рисунке 3 представлен создание модульных тестов Junit5.
Рисунок 3 – Создание теста JUnit
В листинге 2 представлены коды тестов для проверки правильности работы программного кода.
Листинг 2 – код тестов
package org.example; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class CalculatorTest { @Test void test1() { float num1 = 2.0f; float num2 = 3.0f; float result = num1 + num2; assertEquals(5.0f, result); } @Test void test2() { float num1 = 5.0f; float num2 = 2.0f; float result = num1 - num2; assertEquals(2.0f, result); } @Test void test3() { float num1 = 5.0f; float num2 = 7.0f; float result = num1 * num2; assertEquals(35.0f, result); } }
На рисунке 4 представлено выполнение тестов (второй тест выдает ошибку)
Рисунок 4 – Выполнение тестов (второй тест выдает ошибку)
Рассмотрим работу каждого теста отдельно.
Рисунок 5 – Код первого теста
Сумма двух переменных num1 и num2 присвается переменной result. Функция assertEquals() сравнивает ожидаемый и полученный результат. Так как мы ожидаем получить результат 5.0f и переменной result присваивается то же самое значение, выполнение данного теста проходит без ошибок.
Рисунок 6 – Код второго теста
В данной тесте находится разность значений переменных num1 и num2, которая присваивается переменой result. Так как мы ожидаем увидеть значение 2.0f, а получим 3.0f, тест будет выполнен с ошибкой.
Рисунок 7 – Код третьего теста
Данный тест аналогичен первому и проходит без ошибок, мы ожидаем получить значение 35.0f, что является верным при умножении переменных num1 и num2
Интеграционное тестирование
Microsoft Unit Test Framework включает в себя инструменты для управления тестами и их результатами, а также поддерживает множество форматов вывода результатов, что делает его удобным для интеграции в различные системы сборки и управления проектами.
Для создания тестов с помощью этого фреймворка необходимо выполнить следующие шаги:
Создать новый проект в Visual Studio с помощью шаблона “Unit Test Project”. Этот шаблон автоматически создаст проект с настройками и файлами, необходимыми для написания и запуска тестов на Microsoft Unit Test Framework.
Создать тестовый класс, содержащий тестовый метод.
Собрать проект и запустить тесты, выбрав в меню Visual Studio пункт “Test -> Run -> All Tests”. При этом будут запущены все тесты из всех тестовых классов в проекте.
Посмотреть результаты тестов в окне “Test Explorer”. Если все тесты пройдены успешно, то в этом окне будут зеленые значки. В случае неудачных тестов, значки окрасятся в красный цвет, а в окне будут отображены сведения о причинах и месте возникновения ошибок.
Листинг 3 – Код математической функции
#pragma once
#include <iostream>
#include <cmath>
using namespace std;
int myFunction(double x)
{
double result = 0;
for (int i = 0; i <= 10000; i++)
{
result += pow(-1, i + 1) * sin(i * x) / i;
}
return result;
}
int main()
{
setlocale(LC_ALL, "Russian");
double x;
cout << "Введите число: ";
cin >> x;
double result = myFunction(x);
cout << "Result: " << result << endl;
system("pause");
return 0;
}
Функция вычисляет значения суммы ряда (-1)^(i+1) / i * sin(ix) для i от 1 до 10000. Пример выполнения программы показаны на рисунке 8.
Рисунок 8 – Пример выполнения программы
Листинг 4 – Код функции для интеграционного тестирования
#pragma once
#include "main.h"
double integ(double x)
{
double a = myFunction(x);
double b = myFunction(x + 1);
return a + b;
}
Код объявляет функции integ, которая использует функцию myFunction для вычисления значений a и b и возвращает их сумму. В дальнейшем эта функция будет использоваться в интеграционном тесте.
Листинг 5 – Код тестирования
#include "CppUnitTest.h"
#include <cmath>`
#include "..\Unit Test Project\main.h"
#include "..\Unit Test Project\integ.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest1
{
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(TestMethod1)
{
// Arrange
double x = 1.0;
double expected = 0.500041;
// Act
double result = myFunction(x);
// Assert
Assert::AreEqual(result, expected, 0.000001);
}
TEST_METHOD(TestMethod2)
{
// Arrange
double x = 0.5;
double expected = 0.250047;
// Act
double result = myFunction(x);
// Assert
Assert::AreEqual(expected, result, 1e-6);
}
TEST_METHOD(TestZero)
{
// Arrange
double x = 0.0;
double expected = 0.0;
// Act
double result = myFunction(x);
// Assert
Assert::AreEqual(expected, result, 1e-6);
}
TEST_METHOD(TestMonotonic)
{
// Arrange
double x1 = 0.5;
double x2 = 1.5;
// Act
double result1 = myFunction(x1);
double result2 = myFunction(x2);
// Assert
Assert::IsTrue(result2 > result1);
}
TEST_METHOD(TestError)
{
// Arrange
double x1 = 0.5;
double x2 = 1.5;
// Act
double result1 = myFunction(x1);
double result2 = myFunction(x2);
// Assert
Assert::IsTrue(result2 > result1);
}
TEST_METHOD(TestSubtraction)
{
// Arrange
double input = 3;
double expectedOutput = 1.50046;
// Act
double actualOutput = myFunction(input);
// Assert
Assert::AreEqual(0, actualOutput - expectedOutput, 1e-6);
}
TEST_METHOD(TestIntegr)
{
// Arrange
double x = 1.0;
double expected = myFunction(x) + myFunction(x + 1);
// Act
double result = integ(x);
// Assert
Assert::AreEqual(expected, result, 0.000001);
}
};
}
Запустим тесты и подтвердим правильность выполнения на рисунке 9.
Рисунок 9 – Подтверждение выполненых тестов
Test1, Test2, TestZero проверяют корректность работы функции myFunction() на входных данных x.
TestMonotonic проверяет, что функция myFunction(x) монотонно возрастает в интервале от x1 и x2.
TestError проверяет поведения функции myFunction в случае, когда входных параметров x1 и x2 не удовлетворяет монотонности функции (т.е. они находятся в неправильном порядке)
TestSubstraction проверяет, что функции myFunction(x) правильно вычисляет значение. Для этого мы задаем ожидаемый результат, который был получен при вычислении синуса, и затем сравниваем результат функции myFunction со значением синуса, используя операцию вычитания.
Для интеграционных тестов нам нужно проверить, что функция myFucntion работает правильно с другими модулями или компонентами программы. У нас есть ещё функция integ, которая использует myFunction внутри себя.
В TestInteg используем myFunction внутри integ и сравниваем результат выполнения integ с ожидаемым результат, который мы получили бы, вызвав myFunction напрямую с теми же параметрами.
Таким образом мы проверяем правильность работы не только myFunction, но и её использование внутри другой функции.
Вывод
В ходе лабораторной работы был проанализирован данный код на языке JAVA, выполнен при помощи IDE (IntelliJ IDEA Community Edition 2024.1.). Были созданы модульное тесты для проверки правильности выполнение программного кода JUnit5. В тестах были проверены действия программы сложения, вычитание и умножения. Был написан ошибочный тест, чтобы показать поведение теста при возникновения неправленого ответа. Были проведено интеграционное тестирование на языке C++ при помощи IDE (Visual Studio 2022 Community Edition), тесты проверяют не только правильность выполнения функции, но и правильность выполнение выбранной функции при вызове её в другом методе.
А также было написано описание каждого теста и обоснование полученного результата.