diff --git a/lab2/img/programm1/block-schema-1.png b/lab2/img/programm1/block-schema-1.png new file mode 100644 index 0000000..f6dc474 Binary files /dev/null and b/lab2/img/programm1/block-schema-1.png differ diff --git a/lab2/img/programm1/bounds.png b/lab2/img/programm1/bounds.png new file mode 100644 index 0000000..6a70cdf Binary files /dev/null and b/lab2/img/programm1/bounds.png differ diff --git a/lab2/img/programm1/classes-test-dop.png b/lab2/img/programm1/classes-test-dop.png new file mode 100644 index 0000000..6d01a94 Binary files /dev/null and b/lab2/img/programm1/classes-test-dop.png differ diff --git a/lab2/img/programm1/classes-test-nedop.png b/lab2/img/programm1/classes-test-nedop.png new file mode 100644 index 0000000..bd834a7 Binary files /dev/null and b/lab2/img/programm1/classes-test-nedop.png differ diff --git a/lab2/img/programm1/classes.png b/lab2/img/programm1/classes.png new file mode 100644 index 0000000..d057c85 Binary files /dev/null and b/lab2/img/programm1/classes.png differ diff --git a/lab2/img/programm1/diagram.png b/lab2/img/programm1/diagram.png new file mode 100644 index 0000000..19263f6 Binary files /dev/null and b/lab2/img/programm1/diagram.png differ diff --git a/lab2/img/programm1/table-decisions.png b/lab2/img/programm1/table-decisions.png new file mode 100644 index 0000000..f051fcc Binary files /dev/null and b/lab2/img/programm1/table-decisions.png differ diff --git a/lab2/img/programm1/table-operators.png b/lab2/img/programm1/table-operators.png new file mode 100644 index 0000000..bd3a863 Binary files /dev/null and b/lab2/img/programm1/table-operators.png differ diff --git a/lab2/report.tex b/lab2/report.tex index c5e8d64..33f078d 100644 --- a/lab2/report.tex +++ b/lab2/report.tex @@ -353,15 +353,296 @@ раз. - - - - + \newpage + \section{Тестирование программы №1} + \subsection{Формальное описание программы} + \textbf{Название:} «Вычисление факториала числа». + \textbf{Дано:} + \begin{itemize} + \item $N$ --- целое положительное число. + \end{itemize} + + + \textbf{Требуется:} Вычислить факториал числа $N$ и вывести результат на экран. + + \textbf{Ограничения:} + \begin{itemize} + \item $1 \leq N \leq 65$; + \item $N$ --- целое. + \end{itemize} + + \textbf{Спецификация} + + \begin{table}[h!] + \centering + %\caption{Спецификация} + %\label{.} + \footnotesize + \begin{tabularx}{\textwidth}{|X|X|X|} + \hline + \textbf{Входные данные} & \textbf{Выходные данные} & \textbf{Реакция программы} \\ + \hline + $N = -5$ & ''Ошибка! Введите положительное целое число:'' & Вывод на экран сообщения: ''Ошибка! Введите положительное целое число:''. Ожидание корректного ввода $N$. \\ + \hline + $N = 5.7$ & ''Ошибка! Введите целое число, а не дробное:'' & Вывод на экран сообщения: ''Ошибка! Введите целое число, а не дробное:''. Ожидание корректного ввода $N$. \\ + \hline + $N =$ ''пять'' & ''Ошибка! Введите целое число, а не строку:'' & Вывод на экран сообщения: ''Ошибка! Введите целое число, а не строку:''. Ожидание корректного ввода $N$. \\ + \hline + $N = 70$ & ''Ошибка! Введите целое положительное число, не более 65:'' & Вывод на экран сообщения: ''Ошибка! Введите целое положительное число, не более 65:''. Ожидание корректного ввода $N$. \\ + \hline + $N = 5$ & 120 & Вывод на экран значения факториала для заданного числа $N$. Завершение программы. \\ + \hline + $N = 0$ & 1 & Вывод на экран значения факториала для заданного числа $N$. Завершение программы. \\ + \hline + $N = 1$ & 1 & Вывод на экран значения факториала для заданного числа $N$. Завершение программы. \\ + \hline + \end{tabularx} + \end{table} + + \newpage + \textbf{Блок-схема} + + \begin{figure}[h!] + \centering + \includegraphics[width=1\linewidth]{img/programm1/block-schema-1.png} + \caption{Блок схема программы №1.} + \label{fig:programm1/block-schema-1} + \end{figure} + + \newpage + \subsection{Тестирование методом «белого ящика»} + Алгоритм составления тестов методом «белого» ящика предполагает обход всех + возможных путей в теле программы и проверку выполнения каждого оператора не + менее одного раза. Для этого на блок-схеме программы, которая изображена на Рис.~\ref{fig:programm1/block-schema-1}, все возможные пути обозначены символами латинского алфавита от~A~до~I. + + Условия в ветвлениях программы: + \begin{enumerate} + \item $N > 65$; + \item $N < 0$; + \item $N$ строка? + \item $N$ дробное? + \item $k \neq N$ + \end{enumerate} + + + \subsubsection{Покрытие операторов} + Критерием покрытия является выполнение каждого оператора программы хотя + бы один раз. Это необходимое, но не достаточное условие для приемлемого тестирования по принципу белого ящика. + + Для покрытия всех операторов был составлен набор тестов из 6 тестов (Рис.~\ref{fig:programm1/table-operators}). + + \begin{figure}[h!] + \centering + \includegraphics[width=1\linewidth]{img/programm1/table-operators.png} + \caption{Набор тестов для покрытия операторов второй программы.} + \label{fig:programm1/table-operators} + \end{figure} + + \newpage + При тестировании покрытия операторов был составлен тест (№3), который программа не проходит. Программа не может пройти тест №3, так как была допущена ошибка при составлении блок-схемы программы. При вводе строки программа завершается при попытке сравнить строку с числом 65, хотя по спецификации должна выводить строку <<Ошибка! Введите целое число, а не строку>>. + + + \subsubsection{Покрытие решений} + В соответствии с этим критерием необходимо составить такой набор тестов, при котором каждое условие в программе примет как истинное, так и ложное значения. Таким образом, к тестам, составленным для метода покрытия операторов, необходимо добавить тесты, которые будут проверять все возможные переходы. + + Тесты, покрывающие все решения программы представлены на Рис.~\ref{fig:programm1/table-operators-2}. + + \begin{figure}[h!] + \centering + \includegraphics[width=1\linewidth]{img/programm1/table-operators.png} + \caption{Набор тестов для покрытия решений второй программы.} + \label{fig:programm1/table-operators-1} + \end{figure} + + Покрыть истинную ветку условия 3 (путь B->D->E) невозможно из-за экстренного завершения программы при вводе строкового значения N. + + \newpage + \subsubsection{Покрытие условий} + В соответствии с этим критерием количество тестов должно быть таким, чтобы + все возможные результаты каждого условия в решении выполнялись по крайней мере + один раз. + + Тесты, покрывающие все условия программы представлены на Рис.~\ref{fig:programm1/table-operators-2}. + + \begin{figure}[h!] + \centering + \includegraphics[width=1\linewidth]{img/programm1/table-operators.png} + \caption{Набор тестов для покрытия решений второй программы.} + \label{fig:programm1/table-operators-2} + \end{figure} + + Покрыть истинную ветку условия 3 (путь B->D->E) невозможно из-за экстренного завершения программы при вводе строкового значения N. + + \newpage + \subsubsection{Покрытие решений и условий} + Согласно этому критерию набор тестов является достаточно полным, если удовлетворяются следующие требования: каждое условие в решении принимает каждое + возможное значение по крайней мере один раз, каждый возможный исход решения + проверяется по крайней мере один раз и каждой точке входа управление передается + по крайней мере один раз. + + Тесты, написанные ранее, обеспечивают покрытие решений и условий (Рис.~\ref{fig:programm1/table-operators-3}). + + \begin{figure}[h!] + \centering + \includegraphics[width=1\linewidth]{img/programm1/table-operators.png} + \caption{Набор тестов для покрытия решений второй программы.} + \label{fig:programm1/table-operators-3} + \end{figure} + + Покрыть истинную ветку условия 3 (путь B->D->E) невозможно из-за экстренного завершения программы при вводе строкового значения N. + + \newpage + \subsubsection{Комбинаторное покрытие условий} + Этот критерий требует создания такого набора тестов, при котором каждая возможная комбинация результатов вычисления условий в каждом решении и + каждая точка входа проверяются по крайней мере один раз. + + Совокупность всех ранее написанных тестов дает покрытие условий и решений (Рис.~\ref{fig:programm1/table-operators-4}). + + \begin{figure}[h!] + \centering + \includegraphics[width=1\linewidth]{img/programm1/table-operators.png} + \caption{Набор тестов для покрытия решений второй программы.} + \label{fig:programm1/table-operators-4} + \end{figure} + + Покрыть истинную ветку условия 3 (путь B->D->E) невозможно из-за экстренного завершения программы при вводе строкового значения N. + + \subsubsection{Результаты тестирования методом <<белого ящика>>} + В результате тестирования методом «белого ящика» было составлено 6 тестов, + из которых были пройдены 5 и не пройден 1. При строковом значении $N$ программа + должна вывести сообщение ”Ошибка! Введите целое число, а не строку:” и ожидать + повторного ввода значения $N$, однако она экстренно завершается с кодом -1 на первом блоке ветвления ($N$ > 65) при попытке сравнить строку с числом, что означает + некорректно составленную программу и спецификацию. + + \newpage + \subsection{Тестирование методом <<чёрного ящика>>} + \subsubsection{Разбиение на классы эквивалентности} + Составлено разбиение на классы эквивалентности исходя из ограничений для + программы, представленное на Рис.~\ref{fig:programm1/classes}. Тесты для допустимых классов эквивалентности представлены на Рис.~\ref{fig:programm1/classes-test-dop} и тесты для недопустимых классов эквивалентности + — на Рис.~\ref{fig:programm1/classes-test-nedop}. + + \begin{figure}[h!] + \centering + \includegraphics[width=0.7\linewidth]{img/programm1/classes.png} + \caption{Разбиение на классы эквивалентности.} + \label{fig:programm1/classes} + \end{figure} + + \begin{figure}[h!] + \centering + \includegraphics[width=0.9\linewidth]{img/programm1/classes-test-dop.png} + \caption{Тесты для допустимых классов эквивалентности.} + \label{fig:programm1/classes-test-dop} + \end{figure} + + \begin{figure}[h!] + \centering + \includegraphics[width=0.9\linewidth]{img/programm1/classes-test-nedop.png} + \caption{Тесты для недопустимых классов эквивалентности.} + \label{fig:programm1/classes-test-nedop} + \end{figure} + + \newpage + При тестировании недопустимых классов эквивалентности был составлен тест, который программа не проходит. Программа не может пройти тест №3, так как была допущена ошибка при составлении блок-схемы программы. При вводе строки программа завершается при попытке сравнить строку с числом 65, хотя по спецификации должна выводить строку <<Ошибка! Введите целое число, а не строку>>. + + \subsubsection{Анализ граничных условий} + В программе можно выделить следующие граничные условия: + \begin{itemize} + \item $N \geq 0$; + \item $N \leq 65$. + \end{itemize} + + Для каждой из границ определим тесты, соответствующие: + \begin{itemize} + \item граничному целому числу (верхнему/нижнему); + \item целому числу, выходящему за границу (верхнюю/нижнюю) на единицу; + \item дробному числу, на 0.001 выходящему за границу (верхнюю/нижнюю). + \end{itemize} + + Составленные тесты представлены на Рис.~\ref{fig:programm1/bounds}. + + \begin{figure}[h!] + \centering + \includegraphics[width=0.8\linewidth]{img/programm1/bounds.png} + \caption{Тесты граничных условий.} + \label{fig:programm1/bounds} + \end{figure} + + При тестировании граничных условий был составлен тест, который программа не проходит. Программа не может пройти тест №1 (Рис.~\ref{fig:programm1/bounds}), так как была допущена ошибка при составлении блок-схемы программы. При вводе числа 0 программа зависает в бесконечном цикле (из-за условия <>), хотя по спецификации должна выводить число 1. + + \subsubsection{Причинно-следственная диаграмма} + + \begin{figure}[h!] + \centering + \includegraphics[width=0.6\linewidth]{img/programm1/diagram.png} + \caption{Причинно следственная диаграмма.} + \label{fig:programm1/diagram} + \end{figure} + + \textbf{Причины:} + \begin{enumerate} + \item $N$ -- число; + \item $N$ -- целое; + \item $N \geq 0$; + \item $N \leq 65$. + \end{enumerate} + + \textbf{Промежуточные причины:} + \begin{enumerate} + \item[1.1] $N$ -- целое и $0 \leq N \leq 65$. + \end{enumerate} + + \textbf{Следствия:} + \begin{enumerate} + \item[2.1] Программа выводит сообщение об ошибке ($N$ -- строка) и заново запрашивает число; + \item[2.2] Программа выводит сообщение об ошибке ($N$ -- дробное) и заново запрашивает число; + \item[2.3] Программа выводит значение факториала для числа $N$; + \item[2.4] Программа выводит сообщение об (ошибке $N < 0$) и заново запрашивает число; + \item[2.5] Программа выводит сообщение об (ошибке $N > 65$) и заново запрашивает число. + \end{enumerate} + + На Рис.~\ref{fig:programm1/diagram} представлена причинно-следственная диаграмма. + + Таблица решений для диаграммы представлена на Рис.~\ref{fig:programm1/table-decisions}. + + \begin{figure}[h!] + \centering + \includegraphics[width=1\linewidth]{img/programm1/table-decisions.png} + \caption{Таблица решений.} + \label{fig:programm1/table-decisions} + \end{figure} + + Все тесты для таблицы решений уже были покрыты ранее при рассмотрении + классов эквивалентности и граничных условий. + + \subsubsection{Результаты тестирования методом <<чёрного ящика>>} + В результате тестирования методом чёрного ящика было составлено 11 тестов, из которых не пройдено 2. Ошибки, из-за которых тесты не были пройдены, связаны с некорректной проверкой входных значений и неверно составленной спецификацией: программа экстренно завершается при вводе вместо числа $N$ строки, а также входит в бесконечный цикл при $N = 0$, что не соответствует поведению, описанному в спецификакции. + \newpage \section*{Заключение} \addcontentsline{toc}{section}{Заключение} + В ходе выполнения данной лабораторной работы были изучены методологии модульного тестирования: метод <<белого>> ящика и метод <<чёрного>> ящика. + При помощи изученных методологий были спроектированы тесты для программы возведения матрицы в степень и программы вычисления факториала числа. При составлении тестов использовались методы: + \begin{itemize} + \item Разбиения на классы эквивалентности; + \item Анализа граничных значений; + \item Причинно-следственной диаграммы; + \item Критерия покрытия операторов; + \item Критерия покрытия решений; + \item Критерия покрытия условий; + \item Критерия покрытия решений и условий; + \item Критерия комбинаторного покрытия условий. + \end{itemize} + + Тестирование проводилось с помощью комбинированного подхода: сначала проводилось тестирование методом «белого ящика», затем добавлялись тесты, основанные на методе «черного ящика». + + % Тестирование первой программы показало, что 11 тестов из 21, составленных методом чёрного ящика не были пройдены программой, и все 5 тестов, составленных методом белого ящика, были пройдены. Таким образом, сочетанием методов <<чёрного>> и <<белого>> ящиков удалось выявить ошибки в спецификации первой программы. + + При тестировании первой программы методом чёрного ящика не было пройдено 2 теста, методом белого ящика --- 1 тест. Ошибки, из-за которых тесты не были пройдены, связаны с некорректной проверкой входных значений и неверно составленной спецификацией. + + Более эффективным методом для проверки программ оказался метод <<чёрного>> ящика. \newpage \section*{Список литературы}