diff --git a/lab2/.gitignore b/lab2/.gitignore new file mode 100644 index 0000000..8bbef0e --- /dev/null +++ b/lab2/.gitignore @@ -0,0 +1,7 @@ +**/* +!.gitignore +!report.tex +!img +!img/** +!programm +!programm/*.py \ No newline at end of file diff --git a/lab2/img/img1.png b/lab2/img/img1.png new file mode 100644 index 0000000..fdde759 Binary files /dev/null and b/lab2/img/img1.png differ diff --git a/lab2/img/img2.png b/lab2/img/img2.png new file mode 100644 index 0000000..c654ffd Binary files /dev/null and b/lab2/img/img2.png differ diff --git a/lab2/report.tex b/lab2/report.tex new file mode 100644 index 0000000..c5e8d64 --- /dev/null +++ b/lab2/report.tex @@ -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} \ No newline at end of file