Добавил:
Developer Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа №3 ТПП

.docx
Скачиваний:
1
Добавлен:
29.04.2024
Размер:
267.46 Кб
Скачать

Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации

Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования

«Московский технический университет связи и информатики»

(МТУСИ)

Кафедра: «Математическая кибернетика и информационные технологии»

Индивидуальная работа

Дисциплина: «Тестирование программных продуктов»

по теме:

«Модульное и интеграционное тестирование»

Выполнили: студенты

_________________________

Проверил:

Говоров Павел Михайлович

_________________________

Москва, 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 включает в себя инструменты для управления тестами и их результатами, а также поддерживает множество форматов вывода результатов, что делает его удобным для интеграции в различные системы сборки и управления проектами.

Для создания тестов с помощью этого фреймворка необходимо выполнить следующие шаги:

  1. Создать новый проект в Visual Studio с помощью шаблона “Unit Test Project”. Этот шаблон автоматически создаст проект с настройками и файлами, необходимыми для написания и запуска тестов на Microsoft Unit Test Framework.

  2. Создать тестовый класс, содержащий тестовый метод.

  3. Собрать проект и запустить тесты, выбрав в меню Visual Studio пункт “Test -> Run -> All Tests”. При этом будут запущены все тесты из всех тестовых классов в проекте.

  4. Посмотреть результаты тестов в окне “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), тесты проверяют не только правильность выполнения функции, но и правильность выполнение выбранной функции при вызове её в другом методе.

А также было написано описание каждого теста и обоснование полученного результата.