Файл: Практическая работа 6 по курсу Технологии разработки серверной части вебприложений модуль Unitтестирование.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 06.11.2023

Просмотров: 25

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Министерство науки и высшего образования Российской Федерации

Федеральное государственное автономное образовательное
учреждение высшего образования
«ЮЖНЫЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ» (ФГАОУ ВО «ЮФУ»)

Институт компьютерных технологий и информационной безопасности

Практическая работа №6

по курсу «Технологии разработки серверной части веб-приложений» модуль «Unit-тестирование»



Выполнили

студенты группы КТбо3-4 _______________ Н. И. Селевцова

_______________ Г. Ю. Полынников

Принял

ассистент кафедры МОП ЭВМ А. А. Жиглатый

СОДЕРЖАНИЕ


ЦЕЛЬ РАБОТЫ 3

ЗАКЛЮЧЕНИЕ 12

ЛИСТИНГ ПРОГРАММЫ 13




ЦЕЛЬ РАБОТЫ


Цель работы: научиться применять стратегии при проектировании тестовых наборов для проведения модульного тестирования. Освоить существующие средства автоматизации проведения юнит-тестирования.

Задание

1. Выполнить подбор задачи, решение которой может быть оформлено в виде одной отдельной основной функции, не включающей в себя чтение входных данных и вывод результата. Входные данные не должны исчерпываться одним входным параметром. Выбранную задачу обсудить с преподавателем.

2. Выполнить корректную постановку выбранной задачи, которая должна включать: формулировку условия; описание входных данных с указанием их состава, формата представления и области допустимых значений для каждого элемента входных данных; описание выходных данных с указанием их состава и формата представления; примеры входных и выходных данных; возможные способы обработки входных данных из области недопустимых значений; возможные указания и дополнительные требования к реализации.

3. Выполнить оформление решения поставленной задачи в виде одной отдельной основной функции. Допускается наличие вспомогательных 2 функций, реализующих решение подзадач, возникающих в ходе решения поставленной задачи. Также допускается вызов вспомогательных функций из основной. Однако, ввод входных данных и вывод выходных данных должен быть исключен из основной функции, в том числе и посредством вспомогательных функций. Источником входных данных должен являться файл. Вывод результата также необходимо осуществлять в файл.


4. Разработать тестовый набор для проверки корректности решения поставленной задачи (основной функции), используя стратегию, позволяющую минимизировать количество тестовых случаев при сохранении максимально возможного тестового покрытия. По возможности оценить величину тестового покрытия для разработанного тестового набора.

5. Используя встроенные в среду разработки средства юнит-тестирования и разработанный тестовый набор, выполнить юнит-тестирование основной функции, реализующей решение поставленной задачи. При этом необходимо использовать файлы в качестве источника входных и эталонных выходных данных. Не допускается их явное задание в коде проекта юнит-тестирования.

6. При обнаружении дефектов в ходе юнит-тестирования выполнить отладку основной функции и повторное её тестирование.

1. Постановка задачи


Даны три целых числа a, b и c, такие, что верно только одно из следующих равенств:

1. a+b=c;

2. a−b=c.

Необходимо реализовать функцию, возвращающую число d, равное номеру выполняемого неравенства.

Входные данные

Допустимыми входными данными является три целых числа a, b, c, при условиях:

a, b = ,

Формат текстового представления: в единственной строке через пробел три числа a, b, c.

Выходные данные

Целое число d.

Формат текстового представления: в единственной строке одно число d.

Обработка исключительных ситуаций и данных из области недопустимых значений

Если входных параметров меньше трех, вывести 3. Если больше трех, функция должна работать с первыми тремя введенными параметрами (при условии, что значения данных допустимы).

Если хотя бы одно входное значение не является целочисленным числом в диапазоне от -1000 до 1000, вывести 255.

Если хотя бы одно входное значение является целочисленным числом, выходящим из диапазона [-1000;1000], вывести 244.

Если входные данные - это три допустимых значения, при которых оба равенства верны или оба ложны, вывести 0.

Примеры входных данных:

Входные данные

Выходные данные

1 2 3

1

4 3 1

2

-50 0 -50

0




2. Алгоритм решения поставленной задачи


Решение задачи было реализовано с помощью языка Javascript. Код программы представлен ниже:

function sum(a, b, c){

  if (a===undefined || b===undefined || c==undefined){

    return 3;

  } else if((a<-1000 || a>1000) || (b<-1000 || b>1000) || (c<-1000 || c>1000)){

    return 244;

  } else if (((a+b==c) && (a-b==c))){

    return 0;

  } else if (a+b==c){

    return 1;

  } else if (a-b==c){

    return 2;

}

}
module.exports = sum
Листинг 1 – Алгоритм неполного решения

3. Тестовый набор


Для получение минимального количества тестов, имеющих максимальное тестовое покрытие выделим следующие тесты:

1. Позитивные тесты: 2 теста, когда входные данные корректны и d равно 1 или 2.

2. Тесты граничных значений: 6 тестов на границу интервала a, b, c.

3. Негативные тесты: 18 тестов. 1 тест при b=0. 1 тест при 3 теста на вызов функции с двумя, одним и нулём переменных. 1 тест на вызов функции с избыточным количеством переменных. 3 теста на вызов функции с не числовыми переменными. 3 теста на вызов функции с не целочисленными переменами. 6 тестов на проверку a, b, c на выход за правую и левую границу допустимого интервала.

№ теста

Входные данные

Ожидаемый вывод

Что проверяет тест

1

24 4 20

2

Условие выполнения второго равенства

2

-450 -48 -498

1

Условие выполнения первого равенства

3

999 1 998

2

Пограничное условие выполнения

второго равенства

4

0 999 -999

2

Пограничное условие выполнения

второго равенства

5

999 -999 0

1

Пограничное условие выполнения

второго равенства

6

-999 31 -968

1

Пограничное условие выполнения

первого равенства

7

244 999 -755

2

Пограничное условие выполнения

второго равенства

8

-555 444 -999

2

Пограничное условие выполнения

второго равенства

9

89 0 89

0

Условие выполнения первого и второго равенства одновременно

10

12 85 102

0

Условие невыполнения первого и второго равенства одновременно

11

1 2

3

Условие проверки не менее трех переданных значений

12

998

3

Условие проверки не менее трех переданных значений

13

Нет данных

3

Условие проверки не менее трех переданных значений

14

45 -2 43 1001

1

Работа функции при избыточности данных

15

‘six’ 45 578

255

Распознавание недопустимых значений

16

-90 ‘j’ -87

255

Распознавание недопустимых значений

17

1 2 ‘a’

255

Распознавание недопустимых значений

18

0,2 98 -8

255

Распознавание недопустимых значений

19

-7 0,34 6

255

Распознавание недопустимых значений

20

8 23 0,987

255

Распознавание недопустимых значений

21

1001 15 9

244

Выход значений за допустимый интервал

22

-1001 89 -94

244

Выход значений за допустимый интервал

23

124 1001 -900

244

Выход значений за допустимый интервал

24

34 -1001 9

244

Выход значений за допустимый интервал

25

900 101 1001

244

Выход значений за допустимый интервал

26

-100 -804 -1001

244

Выход значений за допустимый интервал

4. Юнит-тестирование


Для проведения автоматизированного юнит-тестирования была использована библиотека Jest. Тесты описаны в файле sum.test.js в виде одного метода, в котором прописаны множество тест-кейсов. Результаты выполнения тестов можно увидеть на скриншоте ниже:



Рисунок 1 – Результаты тестирования

Во время выполнения тестов были найдены некоторые ошибки, которые были расписаны и исправлены в следующем разделе.

5. Баг-репорты и исправление дефектов


Дефект №1

Название дефекта

Некорректная обработка случая, когда оба равенства не выполняются

Приоритет дефекта

Высокий

Серьезность дефекта

Критический

Версия системы

ОС Windows 10, NodeJS v18.14.0

Инструкция по воспроизведению

Входные данные: 12 85 102


Фактический результат

undefined

Ожидаемый результат

0

Вид, тип, область тестирования

Функциональное, модульное тестирование

Вложения



После обнаружения код был изменен следующим образом:



Рисунок 2 – Исправление дефекта №1 (выделено серым)

Дефект №2

Название дефекта

Некорректная обработка случая, когда первый параметр – вещественное число

Приоритет дефекта

Высокий

Серьезность дефекта

Критический

Версия системы

ОС Windows 10, NodeJS v18.14.0

Инструкция по воспроизведению

Входные данные: 0.2 98 -8


Фактический результат

0

Ожидаемый результат

255

Вид, тип, область тестирования

Функциональное, модульное тестирование

Вложения





Дефект №3

Название дефекта

Некорректная обработка случая, когда первый параметр – строка

Приоритет дефекта

Высокий

Серьезность дефекта

Критический

Версия системы

ОС Windows 10, NodeJS v18.14.0

Инструкция по воспроизведению

Входные данные: ‘six’ 45 578


Фактический результат

0

Ожидаемый результат

255

Вид, тип, область тестирования

Функциональное, модульное тестирование

Вложения



Дефекты №2 и №3 были исправлены с помощью кода на рисунке 3.



Рисунок 3 – Исправление дефектов №2 и №3

function sum(a, b, c){

  if (a===undefined || b===undefined || c==undefined){

    return 3;

  } else if(!Number.isInteger(a) || !Number.isInteger(b) || !Number.isInteger(c)){

    return 255;

  } else if((a<-1000 || a>1000) || (b<-1000 || b>1000) || (c<-1000 || c>1000)){

    return 244;

  } else if (((a+b==c) && (a-b==c)) || ((a+b!=c) && (a-b!=c))){

    return 0;

  } else if (a+b==c){

    return 1;

  } else if (a-b==c){

    return 2;

}

}

module.exports = sum

Листинг 2 – Исправленный код



Рисунок 3 – Успешное прохождение всех тестов


ЗАКЛЮЧЕНИЕ


При выполнении лабораторной работы были получены навыки в базовом юнит-тестировании, подборе тест кейсов и анализе покрытия тестов. Была разработана корректно работающая программа, решающая поставленную задачу, а также были использованы средства автоматизации языка JavaScript (Jest).


ЛИСТИНГ ПРОГРАММЫ


Файл sum.test.js

const sum = require('./sum');
test('тесты', () => {

  expect(sum(24, 4, 20)).toBe(2);

  expect(sum(-450, -48, -498)).toBe(1);

  expect(sum(999, 1, 998)).toBe(2);

  expect(sum(0, 999, -999)).toBe(2);

  expect(sum(999, -999, 0)).toBe(1);

  expect(sum(-999, 31, -968)).toBe(1);

  expect(sum(244, 999, -755)).toBe(2);

  expect(sum(-555, 444, -999)).toBe(2);

  expect(sum(89, 0, 89)).toBe(0);

  expect(sum(12, 85, 102)).toBe(0);

  expect(sum(1, 2)).toBe(3);

  expect(sum(998)).toBe(3);

  expect(sum()).toBe(3);