Первая прога (Спасибо Владу Гаару ;))

This commit is contained in:
2025-04-08 18:39:26 +03:00
parent cc6b784614
commit 4800f11a7e
9 changed files with 285 additions and 4 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

View File

@@ -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 программа зависает в бесконечном цикле (из-за условия <<k != N>>), хотя по спецификации должна выводить число 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*{Список литературы}