\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}