Вступление
This commit is contained in:
7
lab2/.gitignore
vendored
Normal file
7
lab2/.gitignore
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
**/*
|
||||
!.gitignore
|
||||
!report.tex
|
||||
!img
|
||||
!img/**
|
||||
!programm
|
||||
!programm/*.py
|
||||
BIN
lab2/img/img1.png
Normal file
BIN
lab2/img/img1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 100 KiB |
BIN
lab2/img/img2.png
Normal file
BIN
lab2/img/img2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 82 KiB |
376
lab2/report.tex
Normal file
376
lab2/report.tex
Normal file
@@ -0,0 +1,376 @@
|
||||
\documentclass[a4paper, final]{article}
|
||||
%\usepackage{literat} % Нормальные шрифты
|
||||
\usepackage[14pt]{extsizes} % для того чтобы задать нестандартный 14-ый размер шрифта
|
||||
\usepackage{tabularx}
|
||||
\usepackage[T2A]{fontenc}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[russian]{babel}
|
||||
\usepackage{amsmath}
|
||||
\usepackage[left=25mm, top=20mm, right=20mm, bottom=20mm, footskip=10mm]{geometry}
|
||||
\usepackage{ragged2e} %для растягивания по ширине
|
||||
\usepackage{setspace} %для межстрочно го интервала
|
||||
\usepackage{moreverb} %для работы с листингами
|
||||
\usepackage{indentfirst} % для абзацного отступа
|
||||
\usepackage{moreverb} %для печати в листинге исходного кода программ
|
||||
\usepackage{pdfpages} %для вставки других pdf файлов
|
||||
\usepackage{tikz}
|
||||
\usepackage{graphicx}
|
||||
\usepackage{afterpage}
|
||||
\usepackage{longtable}
|
||||
\usepackage{float}
|
||||
|
||||
|
||||
|
||||
% \usepackage[paper=A4,DIV=12]{typearea}
|
||||
\usepackage{pdflscape}
|
||||
% \usepackage{lscape}
|
||||
|
||||
\usepackage{array}
|
||||
\usepackage{multirow}
|
||||
|
||||
\renewcommand\verbatimtabsize{4\relax}
|
||||
\renewcommand\listingoffset{0.2em} %отступ от номеров строк в листинге
|
||||
\renewcommand{\arraystretch}{1.4} % изменяю высоту строки в таблице
|
||||
\usepackage[font=small, singlelinecheck=false, justification=centering, format=plain, labelsep=period]{caption} %для настройки заголовка таблицы
|
||||
\usepackage{listings} %листинги
|
||||
\usepackage{xcolor} % цвета
|
||||
\usepackage{hyperref}% для гиперссылок
|
||||
\usepackage{enumitem} %для перечислений
|
||||
|
||||
\newcommand{\specialcell}[2][l]{\begin{tabular}[#1]{@{}l@{}}#2\end{tabular}}
|
||||
|
||||
|
||||
\setlist[enumerate,itemize]{leftmargin=1.2cm} %отступ в перечислениях
|
||||
|
||||
\hypersetup{colorlinks,
|
||||
allcolors=[RGB]{010 090 200}} %красивые гиперссылки (не красные)
|
||||
|
||||
% подгружаемые языки — подробнее в документации listings (это всё для листингов)
|
||||
\lstloadlanguages{ SQL}
|
||||
% включаем кириллицу и добавляем кое−какие опции
|
||||
\lstset{tabsize=2,
|
||||
breaklines,
|
||||
basicstyle=\footnotesize,
|
||||
columns=fullflexible,
|
||||
flexiblecolumns,
|
||||
numbers=left,
|
||||
numberstyle={\footnotesize},
|
||||
keywordstyle=\color{blue},
|
||||
inputencoding=cp1251,
|
||||
extendedchars=true
|
||||
}
|
||||
\lstdefinelanguage{MyC}{
|
||||
language=SQL,
|
||||
% ndkeywordstyle=\color{darkgray}\bfseries,
|
||||
% identifierstyle=\color{black},
|
||||
% morecomment=[n]{/**}{*/},
|
||||
% commentstyle=\color{blue}\ttfamily,
|
||||
% stringstyle=\color{red}\ttfamily,
|
||||
% morestring=[b]",
|
||||
% showstringspaces=false,
|
||||
% morecomment=[l][\color{gray}]{//},
|
||||
keepspaces=true,
|
||||
escapechar=\%,
|
||||
texcl=true
|
||||
}
|
||||
|
||||
\textheight=24cm % высота текста
|
||||
\textwidth=16cm % ширина текста
|
||||
\oddsidemargin=0pt % отступ от левого края
|
||||
\topmargin=-1.5cm % отступ от верхнего края
|
||||
\parindent=24pt % абзацный отступ
|
||||
\parskip=5pt % интервал между абзацами
|
||||
\tolerance=2000 % терпимость к "жидким" строкам
|
||||
\flushbottom % выравнивание высоты страниц
|
||||
|
||||
|
||||
% Настройка листингов
|
||||
\lstset{
|
||||
language=python,
|
||||
extendedchars=\true,
|
||||
inputencoding=utf8,
|
||||
keepspaces=true,
|
||||
% captionpos=b, % подписи листингов снизу
|
||||
}
|
||||
|
||||
\begin{document} % начало документа
|
||||
|
||||
|
||||
|
||||
% НАЧАЛО ТИТУЛЬНОГО ЛИСТА
|
||||
\begin{center}
|
||||
\hfill \break
|
||||
\hfill \break
|
||||
\normalsize{МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ\\
|
||||
федеральное государственное автономное образовательное учреждение высшего образования «Санкт-Петербургский политехнический университет Петра Великого»\\[10pt]}
|
||||
\normalsize{Институт компьютерных наук и кибербезопасности}\\[10pt]
|
||||
\normalsize{Высшая школа технологий искусственного интеллекта}\\[10pt]
|
||||
\normalsize{Направление: 02.03.01 <<Математика и компьютерные науки>>}\\
|
||||
|
||||
\hfill \break
|
||||
\hfill \break
|
||||
\hfill \break
|
||||
\hfill \break
|
||||
\large{Лабораторная работа №2}\\
|
||||
\large{<<Тестирование ПО методом белого и чёрного ящика>>}\\
|
||||
\large{по дисциплине}\\
|
||||
\large{<<Методы тестирования программного обеспечения>>}\\
|
||||
\hfill \break
|
||||
|
||||
% \hfill \break
|
||||
\hfill \break
|
||||
\end{center}
|
||||
|
||||
\small{
|
||||
\begin{tabular}{lrrl}
|
||||
\!\!\!Студент, & \hspace{2cm} & & \\
|
||||
\!\!\!группы 5130201/20102 & \hspace{2cm} & \underline{\hspace{3cm}} &Тищенко А. А. \\\\
|
||||
\!\!\!Преподаватель & \hspace{2cm} & \underline{\hspace{3cm}} & Курочкин М. А. \\\\
|
||||
&&\hspace{4cm}
|
||||
\end{tabular}
|
||||
\begin{flushright}
|
||||
<<\underline{\hspace{1cm}}>>\underline{\hspace{2.5cm}} 2025г.
|
||||
\end{flushright}
|
||||
}
|
||||
|
||||
\hfill \break
|
||||
% \hfill \break
|
||||
\begin{center} \small{Санкт-Петербург, 2025} \end{center}
|
||||
\thispagestyle{empty} % выключаем отображение номера для этой страницы
|
||||
|
||||
% КОНЕЦ ТИТУЛЬНОГО ЛИСТА
|
||||
\newpage
|
||||
|
||||
\tableofcontents
|
||||
|
||||
|
||||
\newpage
|
||||
\section*{Введение}
|
||||
\addcontentsline{toc}{section}{Введение}
|
||||
Одним из ключевых этапов в современной разработке программного обеспечения является тестирование. Существует несколько видов тестирования: модульное, интеграционное, функциональное, системное и приемочное. В данной работе будет рассмотрено модульное тестирование.
|
||||
|
||||
Модульное или unit-тестирование является основным видом тестирования, с которого практически всегда начинается проверка корректности работы программы. Этот вид тестирования включает проверку отдельных блоков ПО: классов, модулей и функций. Цель модульного тестирования -- выявить ошибки, то есть несоответствия поведения модуля его спецификации.
|
||||
|
||||
Существует два основных подхода к unit-тестированию: методы <<чёрного>> и <<белого ящика>>.
|
||||
|
||||
В данной работе будут рассмотрены оба метода. Также данные приёмы будут применены для тестирования двух программ:
|
||||
|
||||
\begin{itemize}
|
||||
\item
|
||||
\end{itemize}
|
||||
|
||||
Каждая из программ будет протестирована обоими методами с целью сравнения подходов.
|
||||
|
||||
|
||||
\newpage
|
||||
\section{Постановка задачи}
|
||||
Цель работы: провести тестирование двух программ методами <<черного ящика>> и <<белого ящика>>. Для достижения цели, были выделены следующие задачи:
|
||||
|
||||
\begin{itemize}
|
||||
\item Изучить методы модульного тестирования, в частности методы <<белого ящика>> и <<черного ящика>>.
|
||||
\item Разработать тесты для двух программ, и провести их тестирование используя оба метода на каждой программе.
|
||||
\item Проанализировать результаты тестирования.
|
||||
\end{itemize}
|
||||
|
||||
|
||||
\newpage
|
||||
\section {Описание методов тестирования}
|
||||
\subsection{Метод черного ящика}
|
||||
Метод черного ящика или тестирование управляемое данными, тестирование управляемое входом и выходом -- это метод тестирования, в котором программа рассматривается как <<черный ящик>>, внутреннее
|
||||
поведение и структура которого не имеют никакого значения. Вместо этого все внимание фокусируется на выяснении обстоятельств, при которых поведение программы не соответствует спецификации.
|
||||
|
||||
Единственной предоставляемой информацией о программе является
|
||||
ее спецификация, полностью описывающая поведение программы при
|
||||
различных входных данных.
|
||||
|
||||
При таком подходе тестовые данные выбираются исключительно на
|
||||
основе спецификаций требований (без привлечения каких-либо знаний о
|
||||
внутренней структуре программы).
|
||||
|
||||
Чтобы в рамках данного метода обнаружить все ошибки в программе, необходимо выполнить так называемое исчерпывающее входное тестирование (exhaustive input testing), т.е. перебрать все возможные комбинации входных данных
|
||||
|
||||
\subsubsection{Эквивалентное разбиение}
|
||||
Класс эквивалентности -- конечный набор входных данных, позволяющий допускать, что тестирования представительного значения данного класса эквивалентно тестированию любого другого значения принадлежащего тому же классу.
|
||||
|
||||
Разбитие области входных данных на конечное число связано с проблемой, того, что для осуществления исчерпывающего тестирования на
|
||||
всех входных наборах данных, неосуществимо, а также преследует следующие цели:
|
||||
|
||||
\begin{itemize}
|
||||
\item уменьшение более чем на единицу числа других тестов, которые
|
||||
должны быть разработаны для достижения поставленной цели
|
||||
<<обеспечить приемлемое тестирование>>;
|
||||
\item покрытие значительной части других возможных тестов, т.е. предоставление некой информации относительно наличия или отсутствия
|
||||
ошибок в ситуациях, не охватываемых данным конкретным набором входных значений.
|
||||
\end{itemize}
|
||||
|
||||
\subsubsection*{Определение классов эквивалентности}
|
||||
Определение классов эквивалентности сводится к последовательному рассмотрению каждого из входных условий (обычно это предложение
|
||||
или фраза, приведенные в спецификации) и разбиению его на две или
|
||||
несколько групп.
|
||||
|
||||
Определяется два типа классов:
|
||||
\begin{itemize}
|
||||
\item допустимые классы эквивалентности -- допустимые входные данные программы;
|
||||
\item недопустимые классы эквивалентности -- все остальные возможные состояния условий (т.е. недопустимые входные значения).
|
||||
\end{itemize}
|
||||
|
||||
Если есть вероятность, что не для всех значений из одного класса эквивалентности будет одинаковый результат, то следует разбить класс на
|
||||
более мелкие подклассы.
|
||||
|
||||
Определенные классы эквивалентности используются для составления тестов.
|
||||
|
||||
\subsubsection*{Разработка тестов}
|
||||
|
||||
Определение тестов по построенным классам эквивалентности состоит из трех этапов:
|
||||
\begin{enumerate}
|
||||
\item назначить каждому классу эквивалентности уникальный номер;
|
||||
\item записать новые тесты, охватывающие как можно большее количество оставшихся неохваченными допустимых классов эквивалентности, пока не будут покрыты все допустимые классы;
|
||||
\item записать новые тесты, каждый из которых охватывает один и только один из оставшихся неохваченными недопустимых классов эквивалентности, пока не будут покрыты все недопустимые классы.
|
||||
\end{enumerate}
|
||||
|
||||
\subsubsection{Анализ граничных значений}
|
||||
Граничные условия -- это ситуации, возникающие в области граничных значений входных эквивалентности. Анализ граничных значений отличается от методики разбиения на классы эквивалентности в следующем отношении:
|
||||
вместо того чтобы выбирать любой элемент класса эквивалентности в качестве представителя всего класса, анализ граничных значений требует выбирать такой элемент или элементы, которые обеспечивают тестирование каждой границы класса.
|
||||
|
||||
\subsubsection{Причинно-следственные диаграммы}
|
||||
Метод причинно-следственных диаграмм или метод диаграмм Исикавы -- метод, позволяющий выбирать высокорезультативные тесты.
|
||||
Его дополнительным преимуществом является то, что он позволяет обнаруживать неполноту и неоднозначность исходных спецификаций.
|
||||
|
||||
Метод позволяет решить проблему того, что метод анализа граничных значений и разбиения данных на классы эквивалентности не исследует комбинации входных условий.
|
||||
|
||||
Причинно-следственная диаграмма представляет собой формальный
|
||||
язык, на который транслируется спецификация, написанная на естественном языке.
|
||||
|
||||
Для построения тестов используется процесс, включающий несколько этапов:
|
||||
\begin{enumerate}
|
||||
\item Спецификация разбивается на части, с которыми легче работать.
|
||||
\item В спецификации определяются причины и следствия.
|
||||
|
||||
Причина -- это отдельное входное условие или класс эквивалентности входных условий.
|
||||
Следствие -- это выходное условие или преобразование системы
|
||||
Причины и следствия определяются путем последовательного (слово за словом) чтения спецификации и подчеркивания тех слов или
|
||||
фраз, которые описывают причины и следствия. Каждой причине и каждому следствию присваивается уникальный номер.
|
||||
\item Семантическое содержание спецификации анализируется и преобразуется в булев граф, связывающий причины и следствия. Полу-
|
||||
ченный граф называется причинно-следственной диаграммой.
|
||||
\item Диаграмма снабжается примечаниями, задающими ограничения и
|
||||
описывающими комбинации причин и (или) следствий, реализация
|
||||
которых невозможна из-за синтаксических или внешних ограничений. Нотация отображений ограничений представлена на Рис.~\ref{fig:img1}.
|
||||
\item Путем методичного прослеживания состояний условий диаграмма преобразуется в таблицу решений с ограниченными входами
|
||||
(limited-entry decision table). Каждый столбец таблицы решений соответствует тесту.
|
||||
\item Столбцы таблицы решений преобразуются в тесты.
|
||||
\end{enumerate}
|
||||
|
||||
Базовая нотация причинно-следственных диаграмм представлена на
|
||||
Рис.~\ref{fig:img1}. Каждый узел диаграммы может находиться в двух состояниях: 0
|
||||
или 1, где 0 представляет состояние <<отсутствует>>, а 1 -- <<присутствует>>.
|
||||
\begin{itemize}
|
||||
\item Функция тождество устанавливает, что если а равно 1, то и b равно 1; в противном случае b равно 0.
|
||||
\item Функция not устанавливает, что если а равно 1, то b равно 0; в
|
||||
противном случае b равно 1.
|
||||
\item Функция or устанавливает, что если а, или b, или с равно 1, то d
|
||||
равно 1; в противном случае d равно 0.
|
||||
\item Функция and устанавливает, что если и а, и b равны 1, то с равно
|
||||
1; в противном случае с равно 0.
|
||||
\end{itemize}
|
||||
|
||||
\begin{figure}[h!]
|
||||
\centering
|
||||
\includegraphics[width=0.5\linewidth]{img/img1.png}
|
||||
\caption{ Базовая нотация, используемая в причинно-следственных диаграммах.}
|
||||
\label{fig:img1}
|
||||
\end{figure}
|
||||
|
||||
Также для установления связи между входными условиями могут использоваться следующие ограничения: Существуют следующие ограничения.
|
||||
|
||||
\begin{itemize}
|
||||
\item Ограничение требует, чтобы всегда выполнялось условие, в соответствии с которым только или только b может быть равно 1 ( и b
|
||||
не могут быть равны 1 одновременно, но обе величины могут быть
|
||||
равны 0).
|
||||
\item Ограничение I требует, чтобы по крайней мере одна из величин, a,
|
||||
b или , была равна 1 (, b и не могут быть равны 0 одновременно).
|
||||
\item Ограничение требует, чтобы одна и только одна из величин, a или
|
||||
b,была равна 1.
|
||||
\item Ограничение R требует, чтобы a было равно 1, только если b равно 1 (т.е. не может быть равно 1, если b равно 0). На Рис.~\ref{fig:img2}
|
||||
представлены символы ограничений.
|
||||
\end{itemize}
|
||||
|
||||
\begin{figure}[h!]
|
||||
\centering
|
||||
\includegraphics[width=0.6\linewidth]{img/img2.png}
|
||||
\caption{Базовая нотация ограничений, используемая в причинно-следственных диаграммах.}
|
||||
\label{fig:img2}
|
||||
\end{figure}
|
||||
|
||||
При составлении причинно-следственной диаграммы возможно введение ограничения не использующегося в базовой нотации и характерного только для рассматриваемого случая. В таком случае, вводимое
|
||||
ограничение всегда сопровождается пояснительной подписью.
|
||||
|
||||
|
||||
\subsection{Метод белого ящика}
|
||||
Метод белого ящика -- метод тестирования основанный на анализе внутренней структуры кода. Для данного тестирования используется спецификация программы, описывающая её поведение и блоксхема, по которой тестировщик может осуществлять тестирование на
|
||||
уровне отдельных модулей, функций и логики программы.
|
||||
Тестирование методом белого ящика имеет и другое название, отражающее суть данной методологии: тестирование с управляемой логикой
|
||||
программы (logic-driving testing). При использовании данной методологии, тестировщик подбирает тестовые данные путём анализа логики программы с учетом её спецификации.
|
||||
Исчерпывающее тестирование методом <<белого ящика>> практически
|
||||
невозможно в следствии необходимости перебирать огромное количество
|
||||
данных. Поэтому для упрощения тестирования применяются следующие
|
||||
эвристические методы:
|
||||
|
||||
\subsubsection{Покрытие операторов}
|
||||
Критерий покрытия операторов/инструкций заключается в построении тестов, в которых каждая инструкция выполнялась как минимум один раз. Является необходимым но недостаточным критерием
|
||||
для тестирования программы методом <<белого ящика>>
|
||||
|
||||
\subsubsection{Покрытие решений}
|
||||
Критерий покрытие решений (decision coverage) или покрытие
|
||||
ветвлений заключается в построении тестов таким образом, чтобы каждое условие в программе хотя бы раз принимало как значение true (истина), так и false (ложь). Иными словами, каждая логическая ветвь каждой инструкции ветвления в программе должна быть выполнена хотя бы
|
||||
один раз.
|
||||
Обычно покрытие решений удовлетворяет критерию покрытия операторов/инструкций. Однако это правило не действует по крайней мере
|
||||
в трех перечисленных ниже случаях.
|
||||
|
||||
\begin{enumerate}
|
||||
\item Программы, не содержащие точек ветвления.
|
||||
\item Программы или подпрограммы (методы), имеющие несколько точек входа. В таком случае некоторые инструкции будут выполняться лишь тогда, когда выполнение программы начинается с определенной точки входа.
|
||||
\item Инструкции в блоках ON. Выполнение всех ветвей не обязательно
|
||||
приведет к выполнению всех блоков ON.
|
||||
\end{enumerate}
|
||||
|
||||
\subsubsection{Покрытие решений и условий}
|
||||
Согласно этому критерию набор тестов является достаточно полным, если выполняются следующие требования:
|
||||
\begin{itemize}
|
||||
\item каждое условие в решении принимает каждое возможное значение
|
||||
по крайней мере один раз;
|
||||
\item каждый возможный исход решения проверяется по крайней мере
|
||||
один раз;
|
||||
\item каждой точке входа управление передается по крайней мере один
|
||||
раз.
|
||||
\end{itemize}
|
||||
Однако, несмотря на кажущуюся возможность охвата им всех возможных исходов решений для всех условий, это зачастую не обеспечивается
|
||||
из-за маскирования одних условий
|
||||
|
||||
\subsubsection{Комбинаторное покрытие условий}
|
||||
Комбинаторное покрытие условий (multiple-condition covering) --
|
||||
критерий, требующий создания такого количества тестов, при котором
|
||||
каждая возможная комбинация результатов вычисления условий в каждом решении и каждая точка входа проверяются по крайней мере один
|
||||
раз.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
\newpage
|
||||
\section*{Заключение}
|
||||
\addcontentsline{toc}{section}{Заключение}
|
||||
|
||||
|
||||
\newpage
|
||||
\section*{Список литературы}
|
||||
\addcontentsline{toc}{section}{Список литературы}
|
||||
|
||||
\vspace{-1.5cm}
|
||||
\begin{thebibliography}{0}
|
||||
\bibitem{mayers}
|
||||
Майерс, Г. Искусство тестирования программ. -- Санкт-Петербург: Диалектика, 2012 г.
|
||||
\end{thebibliography}
|
||||
|
||||
\end{document}
|
||||
Reference in New Issue
Block a user