Первая прога (Спасибо Владу Гаару ;))
BIN
lab2/img/programm1/block-schema-1.png
Normal file
|
After Width: | Height: | Size: 243 KiB |
BIN
lab2/img/programm1/bounds.png
Normal file
|
After Width: | Height: | Size: 150 KiB |
BIN
lab2/img/programm1/classes-test-dop.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
lab2/img/programm1/classes-test-nedop.png
Normal file
|
After Width: | Height: | Size: 141 KiB |
BIN
lab2/img/programm1/classes.png
Normal file
|
After Width: | Height: | Size: 71 KiB |
BIN
lab2/img/programm1/diagram.png
Normal file
|
After Width: | Height: | Size: 104 KiB |
BIN
lab2/img/programm1/table-decisions.png
Normal file
|
After Width: | Height: | Size: 108 KiB |
BIN
lab2/img/programm1/table-operators.png
Normal file
|
After Width: | Height: | Size: 142 KiB |
289
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 программа зависает в бесконечном цикле (из-за условия <<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*{Список литературы}
|
||||
|
||||