From 7596e5632cf1683dd34ddd7b0d3bef937d53b7db Mon Sep 17 00:00:00 2001 From: Arity-T Date: Wed, 30 Apr 2025 18:08:02 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D1=82=D1=87=D1=91=D1=82=D0=B8=D0=BA=20(?= =?UTF-8?q?=D0=B7=D0=B0=20=D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D1=83=20=D1=81?= =?UTF-8?q?=D0=BF=D0=B0=D1=81=D0=B8=D0=B1=D0=BE=20=D0=9F=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=83=20=D0=9B=D0=BE=D0=B1=D0=B0=D0=BD=D0=BE=D0=B2=D1=83=20:)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab4/.gitignore | 1 + lab4/report/.gitignore | 7 + lab4/report/img/selenium-tests.png | Bin 0 -> 35833 bytes lab4/report/img/test1.png | Bin 0 -> 21348 bytes lab4/report/img/test2.png | Bin 0 -> 39458 bytes lab4/report/img/test3.png | Bin 0 -> 5945 bytes lab4/report/img/test4.png | Bin 0 -> 32254 bytes lab4/report/report.tex | 845 +++++++++++++++++++++++++++++ 8 files changed, 853 insertions(+) create mode 100644 lab4/.gitignore create mode 100644 lab4/report/.gitignore create mode 100644 lab4/report/img/selenium-tests.png create mode 100644 lab4/report/img/test1.png create mode 100644 lab4/report/img/test2.png create mode 100644 lab4/report/img/test3.png create mode 100644 lab4/report/img/test4.png create mode 100644 lab4/report/report.tex diff --git a/lab4/.gitignore b/lab4/.gitignore new file mode 100644 index 0000000..27fa349 --- /dev/null +++ b/lab4/.gitignore @@ -0,0 +1 @@ +other \ No newline at end of file diff --git a/lab4/report/.gitignore b/lab4/report/.gitignore new file mode 100644 index 0000000..8bbef0e --- /dev/null +++ b/lab4/report/.gitignore @@ -0,0 +1,7 @@ +**/* +!.gitignore +!report.tex +!img +!img/** +!programm +!programm/*.py \ No newline at end of file diff --git a/lab4/report/img/selenium-tests.png b/lab4/report/img/selenium-tests.png new file mode 100644 index 0000000000000000000000000000000000000000..625203df65543652cf45b8a44e70a6d3add07e35 GIT binary patch literal 35833 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 literal 0 HcmV?d00001 diff --git a/lab4/report/img/test2.png b/lab4/report/img/test2.png new file mode 100644 index 0000000000000000000000000000000000000000..3e2434b15fbfbc7d311e723f98dd55e70e5d8e83 GIT binary patch literal 39458 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 bdJUVO-{XDs?8F!b{P$2wNwVUBalror^5i)* literal 0 HcmV?d00001 diff --git a/lab4/report/img/test3.png b/lab4/report/img/test3.png new file mode 100644 index 0000000000000000000000000000000000000000..78901893d494e13c19e7ef144b9e43845c5c1d55 GIT binary patch literal 5945 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 YSndj4dyrl~HrO3^0tUrL0T%K!iX literal 0 HcmV?d00001 diff --git a/lab4/report/img/test4.png b/lab4/report/img/test4.png new file mode 100644 index 0000000000000000000000000000000000000000..cf0b7087ad05e24cc3d5146c32ed313a4bd3df6f GIT binary patch literal 32254 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 k)bA<| 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⋘#3u1ba0ZzoXVbSv_1OX>sm;)es1zcG&D0a%dG5PX%~xYJ#k>=N z*LtSFU4%cW?EkJ)eNaU&{}>J5a3>ei>L3WbT5_2$UOIcA`(Mv+IUhfDwfITgKs}FW zhH)xc$$jr*ayj*2eQAsu7cTT`!ci+YI z#mYYF#stw+7g(0XTWpxacH(W`jLZx*I{{{8i13wjTg zPyV%ChOc>ojh@-?{+V)z#ce#QwoeoTBynH!*0-UD01xl8WyGaCtC z#j_K9ox#$&AaD`r%SBUnWNccdV@~GfR{Y@YvH1OFpvx`k@z7oOuQXs)grp^W)wX-w zDzKUGy(9lJLl@Um#-ByN*-plrdh0Jsj^xuEU;{1M+Q7dpFaI;cid%>EnUowcYX5P; ec?8=ddHh3dxYSb>eqd+&6KM%~@$z>D0sjqBCWvtW literal 0 HcmV?d00001 diff --git a/lab4/report/report.tex b/lab4/report/report.tex new file mode 100644 index 0000000..0af92e7 --- /dev/null +++ b/lab4/report/report.tex @@ -0,0 +1,845 @@ +\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{ Java} +% включаем кириллицу и добавляем кое−какие опции +\lstset{tabsize=2, + breaklines, + basicstyle=\footnotesize, + columns=fullflexible, + flexiblecolumns, + numbers=left, + numberstyle={\footnotesize}, + keywordstyle=\color{blue}, + inputencoding=cp1251, + extendedchars=true +} +\lstdefinelanguage{MyC}{ + language=Java, +% 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=Java, + 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{Лабораторная работа №4}\\ + \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{Постановка задачи} + + Данная лабораторная работа делится на две части. В первой части необходимо разработать набор юнит-тестов к предоставленной библиотеке calculator.jar, которая содержит методы для проведения разнообразных операций над числами. Во второй части необходимо протестировать сайт в Chrome путем написания двух тестов, проверяющих корректность отображения страниц. Использовать для тестирования Selenuim WebDriver. + + + \newpage + \section {Средства автоматизации тестирования} + \subsection{JUinit} + \textit{JUnit} — это фреймворк, созданный для тестирования программного обеспечения на языке Java. Он предназначен для разработки и выполнения автоматизированных тестов, что дает разработчикам возможность проверять правильность функционирования своего кода и обнаруживать ошибки на ранних стадиях разработки. + + + \subsubsection{Основные особенности JUnit} + \begin{itemize} + \item\textbf{ Модульное тестирование:} JUnit поддерживает тестирование отдельных модулей, позволяя разработчикам проверять работу отдельных компонентов (методов и классов) независимо друг от друга. + \item\textbf{ Аннотации:} JUnit использует аннотации, такие как \texttt{@Test}, \texttt{@Before}, \texttt{@After}, которые упрощают написание тестов и делают код более читабельным. Например, аннотация \texttt{@Before }позволяет выполнять определенный код перед каждым тестом, а @After — после его завершения. + \item \textbf{Ассерты: }JUnit предоставляет различные методы ассертов, такие как assertEquals, assertTrue, assertNotNull, которые помогают проверять ожидаемые результаты тестов. + \item \textbf{Группировка тестов:} Тесты могут быть сгруппированы с помощью аннотации @Suite, что позволяет запускать их вместе. +\item \textbf{ Интеграция:} JUnit просто интегрируется с различными инструментами и фреймворками, такими как Maven, Gradle и широко используемые IDE, включая Eclipse и IntelliJ IDEA, что упрощает процесс тестирования. + + \end{itemize} +\subsubsection{ Преимущества использования JUnit} +\begin{itemize} + \item \textbf{Упрощение процесса тестирования:} JUnit делает написание тестов более удобным и структурированным. + \item \textbf{Автоматизация:} Позволяет автоматизировать тесты, что снижает вероятность ошибок и повышает качество кода.\par + \item \textbf{Поддержка непрерывной интеграции:} JUnit хорошо совместим с системами непрерывной интеграции, позволяя запускать тесты автоматически при каждом изменении кода. + \item \textbf{Снижение затрат на отладку:} Регулярное тестирование помогает выявлять проблемы на ранних стадиях, что уменьшает расходы на их исправление. +\end{itemize} +\subsubsection{Функционал библиотеки} + JUnit имеет широкий функционал для проверки совпадения ожидаемого резульата, и результата полученного тестируемым методом.\par + \vspace{5pt} + Класс \texttt{junit.framework.Assert} предоставляет набор статических методов для проверки различных условий в тестах. + + \begin{itemize} + \item \texttt{assertEquals(expected, actual)} - проверяет равенство двух значений. Если значения не равны, тест завершается с ошибкой. Имеет перегрузки для различных типов данных. + + \item \texttt{assertFalse(condition)} - проверяет, что переданное булево значение является \texttt{false}. Если значение \texttt{true}, тест завершается с ошибкой. + + \item \texttt{assertNotNull(object)} - проверяет, что объект не является \texttt{null}. Если объект \texttt{null}, тест завершается с ошибкой. + + \item \texttt{assertNull(object)} - проверяет, что объект является \texttt{null}. Если объект не \texttt{null}, тест завершается с ошибкой. + + \item \texttt{assertNotSame(unexpected, actual)} - проверяет, что два объекта не ссылаются на один и тот же экземпляр. Если ссылки идентичны, тест завершается с ошибкой. + + \item \texttt{assertSame(expected, actual)} - проверяет, что два объекта ссылаются на один и тот же экземпляр. Если ссылки разные, тест завершается с ошибкой. + + \item \texttt{assertTrue(condition)} - проверяет, что переданное булево значение является \texttt{true}. Если значение \texttt{false}, тест завершается с ошибкой. + \end{itemize} + + Класс \texttt{junit.framework.TestCase} наследуется от \texttt{junit.framework.Assert} и предоставляет базовую функциональность для создания тестовых случаев. + + \begin{itemize} + \item \texttt{run()} - основной метод, выполняющий тест. Содержит логику запуска и выполнения тестового случая. + + \item \texttt{setUp()} - метод, выполняемый перед каждым тестом. Используется для инициализации тестового окружения и подготовки данных. В аннотационной версии JUnit 4+ заменён на \texttt{@Before}. + + \item \texttt{tearDown()} - метод, выполняемый после каждого теста. Используется для очистки ресурсов после выполнения теста. В аннотационной версии JUnit 4+ заменён на \texttt{@After}. + \end{itemize} +\subsubsection{Этапы написания тестов} +\begin{enumerate} + \item \textbf{Реализация теста}: Написание тестового метода и аннотирование его с помощью. \texttt{@Test} + \item \textbf{Настройка и очистка} Использование аннотаций \texttt{@Before} и \texttt{@After} + для выполнения операйи перед и после теста. + \item \textbf{Запуск тестов:} Использование встроенных средств IDE или командной строки для выполнения тестов. +\end{enumerate} + \subsection{Selenium WebDriver} + \textit{Selenium WebDriver } --- это фреймворк с открытым исходным кодом для автоматизации тестирования веб-приложений. Он предоставляет программный интерфейс для взаимодействия с браузерами, позволяя эмулировать действия пользователя на веб-страницах. + \textbf{Основные особенности Selenium WebDriver}: + \begin{itemize} + \item \textbf{Кроссбраузерность:} Поддержка всех популярных браузеров, включая Chrome, + Firefox, Safari, Edge и Opera. + \item \textbf{Многоязычность:} Возможность написания тестовых скриптов на различных + языках программирования — Java, Python, C\#, Ruby, JavaScript, PHP и Perl. + \item \textbf{Прямое взаимодействие:} WebDriver напрямую отправляет команды браузеру и + получает результаты, что обеспечивает более точное воспроизведение + пользовательских действий. + \item \textbf{Кроссплатформенность:} Возможность запуска тестов на различных операционных + системах (Windows, MacOS, Linux). + \item \textbf{Параллельное выполнение:} Поддержка одновременного запуска тестов в + разных браузерах для ускорения тестирования. +\end{itemize}\par + + Архитектура Selenium WebDriver состоит из четырех основных компонентов: + \begin{itemize} + \item \textbf{Selenium Client Libraries:} Набор библиотек для различных языков + программирования, позволяющих писать и запускать тесты на предпочитаемом языке. + JSON Wire Protocol: REST API на основе JSON, обеспечивающий передачу + информации между клиентом и сервером через HTTP. + \item \textbf{Browser Drivers:} Специфичные для каждого браузера драйверы (ChromeDriver, + GeckoDriver для Firefox и др.), которые получают команды и выполняют их + в соответствующем браузере. + \item \textbf{Browsers:} Сами браузеры, в которых выполняются тестовые сценарии. + \end{itemize} + \textbf{Этапы работы с WebDriver}: + \begin{enumerate} + \item \textbf{Инициализация:} Создание экземпляра WebDriver и открытие браузера. + \item \textbf{Навигация:} Переход к нужной веб-странице с помощью метода get(). + \item \textbf{Поиск элементов:} Обнаружение элементов на странице с использованием + различных локаторов (ID, XPath, CSS-селекторы и др.). + \item \textbf{Взаимодействие:} Выполнение действий над элементами (клик, ввод текста, + выбор из выпадающих списков и т.д.). + \item \textbf{Ожидание:} Использование явных и неявных ожиданий для синхронизации + с динамическими элементами страницы. + \item \textbf{Проверка:} Получение информации о состоянии элементов и проверка результатов. + \item \textbf{Завершение:} Закрытие браузера и освобождение ресурсов. + \end{enumerate} + Принцип выполнения команд: + \begin{enumerate} + \item Команда из тестового скрипта преобразуется в HTTP-запрос через JSON Wire Protocol. +\item Запрос передается соответствующему драйверу браузера. + \item Драйвер интерпретирует запрос и выполняет необходимые действия в браузере. + \item Результат действия возвращается обратно в виде HTTP-ответа. +\item Ответ преобразуется в формат, понятный тестовому скрипту. + \end{enumerate} + + + \newpage + \section{Описание выполненных работ} + \subsection{Работа №1} + В ходе работы необходимо прописать юнит тесты для методов библиотеки calcualtor.jar, реализующий функционал калькулятора, производящего вычисления суммы, разности, умножения, деления, возведения в степень, ивзлечение корня, а также значений базовых тригонометрических функций. Дря реализации тестов, необходимо использовать JUnit. + + \subsubsection{Класс CalculatorTest} + Все тесты содержатся в классе CalculatorTest. В методе setUp() инициализируется объект \texttt{Calculator}. Константой DELTA задается допустимая погрешность. Код определения полей класса и метода setUp() представлен в листинге \ref{lst:CalculatorTest}. + + \begin{lstlisting}[caption={Класс CalculatorTest}, label={lst:CalculatorTest}] + class CalculatorTest { + private static final double DELTA = 0.0001; + private Calculator calculator; + + @BeforeEach + void setUp() { + calculator = new Calculator(); + } + }\end{lstlisting} + + \subsubsection{Тесты для метода Sum} + В классе CalculatorTest реализованы следующие тесты для метода sum: + + \begin{itemize} + \item \texttt{testLongSum} - тест для проверки суммы двух чисел типа long. + \item \texttt{testDoubleSum} - тест для проверки суммы двух чисел типа double. + \end{itemize} + + Код тестов представлен в листинге \ref{lst:SumTest}. Тесты параметризованы с помощью аннотации \texttt{@ParameterizedTest} и \texttt{@CsvSource}. + +\begin{lstlisting}[caption={Тесты для метода Sum}, label={lst:SumTest}] +@ParameterizedTest +@CsvSource({ + "1, 2, 3", + "5, 0, 5", + "-7, 7, 0", + "9223372036854775806, 1, 9223372036854775807" +}) +void testLongSum(long a, long b, long expected) { + assertEquals(expected, calculator.sum(a, b)); +} + +@ParameterizedTest +@CsvSource({ + "1.5, 2.5, 4.0", + "5.5, 0.0, 5.5", + "-3.5, 3.5, 0.0", + "0.1, 0.2, 0.3" +}) +void testDoubleSum(double a, double b, double expected) { + assertEquals(expected, calculator.sum(a, b), DELTA); +} +\end{lstlisting} + + \textbf{Результаты запуска тестов:} + + Результаты запуска тестов представлены на рисунке \ref{fig:test1}. + \begin{figure}[h!] + \centering + \includegraphics[width=0.65\linewidth]{img/test1.png} + \caption{Результаты запуска тестов для метода sum} + \label{fig:test1} + \end{figure} + + По итогам запуска, метод sum прошел все тесты. + + \subsubsection{Тесты для метода Mul} + + В классе CalculatorTest реализованы следующие тесты для метода mul: + + \begin{itemize} + \item \texttt{testLongMul} - тест для проверки произведения двух чисел типа long. + \item \texttt{testDoubleMul} - тест для проверки произведения двух чисел типа double. + \end{itemize} + + Код тестов представлен в листинге \ref{lst:MulTest}. + +\begin{lstlisting}[caption={Тесты для метода Mul}, label={lst:MulTest}] +@ParameterizedTest +@CsvSource({ + "2.5, 3.0, 7.5", + "0.0, 5.5, 0.0", + "-2.5, 3.0, -7.5", + "-2.5, -3.0, 7.5" +}) +void testDoubleMult(double a, double b, double expected) { + assertEquals(expected, calculator.mult(a, b), DELTA); +} + +@ParameterizedTest +@CsvSource({ + "2, 3, 6", + "0, 5, 0", + "-2, 3, -6", + "-2, -3, 6", + "1000, 1000, 1000000" +}) +void testLongMult(long a, long b, long expected) { + assertEquals(expected, calculator.mult(a, b)); +} +\end{lstlisting} + + \textbf{Результаты запуска тестов:} + + Результаты запуска тестов представлены на рисунке \ref{fig:test2}. + + \begin{figure}[h!] + \centering + \includegraphics[width=0.65\linewidth]{img/test2.png} + \caption{Результаты запуска тестов для метода mul} + \label{fig:test2} + \end{figure} + + По итогам запуска, метод mul для типа long прошел все тесты, а для типа double прошёл лишь 1 из 4 тестов. + + \subsubsection{Тесты для метода Sqrt} + + В классе CalculatorTest реализованы следующие тесты для метода sqrt: + + \begin{itemize} + \item \texttt{testSqrt} - тест для проверки квадратного корня числа типа double. Проверяет положительные, отрицательные значения, а также 0. + \end{itemize} + + Код тестов представлен в листинге \ref{lst:SqrtTest}. + +\begin{lstlisting}[caption={Тесты для метода Sqrt}, label={lst:SqrtTest}] +@ParameterizedTest +@ValueSource(doubles = { 4.0, 0.0, -4.0, 1000000.0 }) +void testSqrt(double value) { + double expected = Math.sqrt(Math.abs(value)); + assertEquals(expected, calculator.sqrt(value), DELTA); +} +\end{lstlisting} + + \textbf{Результаты запуска тестов:} + + Результаты запуска тестов представлены на рисунке \ref{fig:test3}. + + \begin{figure}[h!] + \centering + \includegraphics[width=0.35\linewidth]{img/test3.png} + \caption{Результаты запуска тестов для метода sqrt} + \label{fig:test3} + \end{figure} + + По итогам запуска, метод sqrt прошел все тесты. + + \subsubsection{Тесты для метода Tg} + + В классе CalculatorTest реализованы следующие тесты для метода tg: + + \begin{itemize} + \item \texttt{testTg} - тест для проверки тангенса числа типа double. Проверяет положительные, отрицательные значения, а также 0. + \end{itemize} + + Код тестов представлен в листинге \ref{lst:TgTest}. + +\begin{lstlisting}[caption={Тесты для метода Tg}, label={lst:TgTest}] +@ParameterizedTest +@ValueSource(doubles = { 0, Math.PI / 6, Math.PI / 4, -Math.PI / 3, 10 }) +void testTg(double angle) { + double expected = Math.tan(angle); + double actual = calculator.tg(angle); + assertEquals(expected, actual, 0.0001); +} +\end{lstlisting} + + \textbf{Результаты запуска тестов:} + + Результаты запуска тестов представлены на рисунке \ref{fig:test4}. + + \begin{figure}[h!] + \centering + \includegraphics[width=0.65\linewidth]{img/test4.png} + \caption{Результаты запуска тестов для метода tg} + \label{fig:test4} + \end{figure} + + По итогам запуска, метод tg прошел лишь 1 из 5 тестов. + + \subsubsection{Результаты работы №1} + В результате комплексного тестирования библиотеки \texttt{calculator.jar} были получены следующие результаты: + + \begin{enumerate} + \item \textbf{Тестирование метода сложения (SumTests)}: + \begin{itemize} + \item Все тесты корректности сложения для целых чисел и чисел с плавающей точкой прошли успешно + \item Операции с граничными значениями (максимальные/минимальные значения \texttt{long} и \texttt{double}) выполняются без переполнения + \item Особые случаи (сложение с нулем) соответствуют ожидаемым результатам. + \end{itemize} + \item \textbf{Тестирование метода умножения (MulTests)}: + \begin{itemize} + \item Метод для умножения целых чисел прошёл все тесты. + \item Метод для умножения чисел с плавающей точкой прошёл 1 из 4 тестов. + \end{itemize} + + \item \textbf{Тестирование метода квадратного корня (SqrtTests)}: + \begin{itemize} + \item Метод прошёл все 4 теста. + \item Метод корректно обрабатывает положительные, отрицательные значения и 0. + \item Отрицательные числа обрабатываются через модуль (\texttt{Math.abs}) + \end{itemize} + + \item \textbf{Тестирование метода тангенса (tgTests)}: + \begin{itemize} + \item Метод прошёл 1 из 5 тестов. + \item Функция тангенса фактически всегда возвращает 1 (кроме случаев, когда \texttt{sin(a) = 0}) + \item Свойство нечетности (\texttt{tg(-x) = -tg(x)}) не соблюдается, значение \texttt{tg(x)} равно 1. + \item Функция возвращает неккоректное значение при попытке вычислить \texttt{tg(0)}. При вычислении возваращется \texttt{NaN}, а не 0, как ожидается. + \end{itemize} + + \item \textbf{Общие выводы:} + + Два из четырёх тестируемых методов не прошли все тесты. В реализации методов умножения и вычисления тангенса присутствуют ошибки. + + Метод умножения неккоректно работает с дробными числами. А метод для вычисления тангенса возвращает 1 для любого входного значения, кроме 0. При нулевом входном значении метод возвращает \texttt{NaN}. + \end{enumerate} + + \newpage + \subsection{Работа №2} +В ходе выполнения работы №2 необходимо было реализовать два теста для тестирования web-сайта с помощью библиотеки Selenium WebDriver. Тесты должны проверять, что элементы сайта \texttt{https://jdi-testing.github.io/jdi-light/index.html} отображаются корректно и позволяют взаимодействовать с собой правильным образом. Реализация тестов должна быть выполнена согласно Java Code Convention и запускаться с помощью TestNG suite xml.\par + +Тесты разделяются на 2 класса, в которых необходимо реализовать тесты, связанные с взаимодействием сайта. + +В первом наборе тестов необходимо проверить корректность отображения страницы. Все сценарии, которые необходимо проверить, представлены в \hyperref[tab1]{таблице 1} + +\begin{table}[h!] + \centering + \label{tab1} + \caption{\centering{Тест-кейсы для веб-приложения (с использованием SoftAsserts)}} + \footnotesize + \begin{tabularx}{\textwidth}{|c|>{\centering\arraybackslash}X|>{\centering\arraybackslash}X|>{\centering\arraybackslash}X|} + \hline + № & Шаг тестирования & Данные & Ожидаемый результат \\ + \hline + 1 & Открыть тестовый сайт по URL & \url{https://jdi-testing.github.io/jdi-light/index.html} & Тестовый сайт открыт \\ + \hline + 2 & Проверить заголовок браузера & "Home Page" & Заголовок соответствует "Home Page" \\ + \hline + 3 & Выполнить вход в систему & Логин: Roman, Пароль: Jdi1234 & Пользователь авторизован \\ + \hline + 4 & Проверить отображение имени пользователя & "ROMAN IOVLEV" & Имя отображается корректно \\ + \hline + 5 & Проверить пункты меню в шапке & "HOME", "CONTACT FORM", "SERVICE", "METALS \& COLORS" & 4 пункта меню с правильным текстом \\ + \hline + 6 & Проверить изображения на странице & 4 изображения & Все изображения отображаются \\ + \hline + 7 & Проверить тексты под иконками & 4 текстовых блока & Тексты соответствуют ожидаемым \\ + \hline + 8 & Проверить наличие iframe & Кнопка "Frame Button" & iframe существует \\ + \hline + 9 & Проверить кнопку во фрейме & - & Кнопка "Frame Button" доступна \\ + \hline + 10 & Вернуться в основное окно & - & Фокус на основном окне \\ + \hline + 11 & Проверить левое меню & "Home", "Contact form", "Service", "Metals \& Colors", "Elements packs" & 5 пунктов меню с правильным текстом \\ + \hline + 12 & Закрыть браузер & - & Браузер закрыт \\ + \hline + \end{tabularx} +\end{table}\par +Во втором наборе тестов необходимо проверить корректность взаимодействия пользователя с сайтом (в частности, правильность выбора чекбоксов, радиобаттонов и элементов из выпадающего списка). +Таблица тестов, необходимых к реализации во втором упражнении, представлена в \hyperref[tab2]{таблице 2}. + +\begin{table}[h!] + \centering + \label{tab2} + \caption{\centering{Тест-кейсы для веб-приложения (с использованием SoftAsserts)}} + \footnotesize + \begin{tabularx}{\textwidth}{|c|>{\RaggedRight\arraybackslash}X|>{\RaggedRight\arraybackslash}X|>{\RaggedRight\arraybackslash}X|} + \hline + \ № & Шаг тестирования (Testing Step) & Данные (Data) & Ожидаемый результат (Expected Result) \\ + \hline + 1 & Открыть тестовый сайт по URL & \url{https://jdi-testing.github.io/jdi-light/index.html} & Тестовый сайт открыт (Test site is opened) \\ + \hline + 2 & Проверить заголовок браузера (Check browser title) & "Home Page" & Заголовок соответствует "Home Page" (Title matches "Home Page") \\ + \hline + 3 & Выполнить вход в систему (Perform login) & username: Roman, password: Jdi1234 & Пользователь авторизован (User is logged in) \\ + \hline + 4 & Проверить отображение имени пользователя (Verify username display) & "ROMAN IOVLEV" & Имя отображается корректно (Name is displayed correctly) \\ + \hline + 5 & Открыть через хедер меню Service -> Different Elements Page (Navigate using header menu: Service -> Different Elements Page) & & Страница открыта (Page is opened) \\ + \hline + 6 & Выбрать чекбоксы (Select checkboxes) & Water, Wind & Элементы отмечены (Elements are checked) \\ + \hline + 7 & Выбрать переключатель (Select radio) & Selen & Элемент отмечен (Element is selected) \\ + \hline + 8 & Выбрать в один из выпадающего списка (Select in dropdown) & Yellow & Элемент выбран (Element is chosen) \\ + \hline + 9 & Проверить, что для каждого чекбокса, radio и dropdown есть отдельная строчка лога (Verify that for each checkbox, radio, and dropdown there is a separate log row) & & Логи отображаются и соответствуют выбранным значениям (Logs are displayed and correspond to selected values) \\ + \hline + 10 & Закрыть браузер (Close browser) & & Браузер закрыт (Browser is closed) \\ + \hline + \end{tabularx} +\end{table} +\subsubsection{Класс DriverSetup} +Класс \texttt{DriverSetup} выполняет первоначальную настройку \texttt{WebDriver} перед запуском тестов. Он устанавливает системные свойства для Chrome Driver, настраивает HTTP клиент и создает экземпляр Chrome Driver, открывая тестовый сайт и выполняет авторизацию пользователя. + +\begin{lstlisting}[label= list5, caption=\ ] +public class DriverSetup { + protected static WebDriver driver; + + @BeforeTest + public static void setup() { + System.setProperty("webdriver.chrome.driver", "src/test/resources/chromedriver.exe"); + System.setProperty("webdriver.http.factory", "jdk-http-client"); + + driver = new ChromeDriver(); + + driver.navigate().to("https://jdi-testing.github.io/jdi-light/index.html"); + + driver.findElement(By.cssSelector("html > body > header > div > nav > ul.uui-navigation.navbar-nav.navbar-right > li > a > span")).click(); + driver.findElement(By.id("name")).sendKeys("Roman"); + driver.findElement(By.id("password")).sendKeys("Jdi1234"); + driver.findElement(By.id("login-button")).click(); + } + + @AfterTest + public static void exit() { + driver.close(); + } +} +\end{lstlisting} + +Класс содержит следующие элементы: +\begin{itemize} + \item \textbf{driver}: Защищенная статическая переменная типа WebDriver, представляющая экземпляр браузера Chrome, используемый для выполнения тестов. + \item \textbf{@BeforeTest setup()}: Статический метод, помеченный аннотацией @BeforeTest, выполняемый перед всеми тестовыми методами. Он выполняет следующие действия: + \begin{itemize} + \item Устанавливает системные свойства `webdriver.chrome.driver` и `webdriver.http.factory`. + \item Создает экземпляр `ChromeDriver`. + \item Открывает тестовый сайт по URL: \url{https://jdi-testing.github.io/jdi-light/index.html}. + \item Выполняет вход в систему, находя и заполняя поля логина и пароля, а также нажимая кнопку входа. + \end{itemize} + \item \textbf{@AfterTest exit()}: Статический метод, помеченный аннотацией `@AfterTest`, выполняемый после всех тестовых методов. Он закрывает браузер с помощью `driver.close()`. +\end{itemize} +\subsubsection{Класс Task1Test} +Класс \texttt{Task1Test} является тестовым классом, который выполняет проверки различных элементов на главной странице веб-сайта. Для проверки ожидаемых результатов используются "мягкие" утверждения (SoftAsserts), что позволяет продолжить выполнение теста даже в случае неудачи одного из утверждений. + +\begin{lstlisting}[language=Java, caption=Класс Task1Test, basicstyle=\footnotesize\ttfamily, breaklines=true] +package edu.hsai.homework2; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; +import org.testng.annotations.Test; +import org.testng.asserts.SoftAssert; + +import java.util.List; + +public class Task1Test extends DriverSetup { + @Test + public void testTask1() { + SoftAssert softAssert = new SoftAssert(); + + softAssert.assertEquals(driver.getTitle(), "Home Page"); + + softAssert.assertEquals(driver.findElement(By.id("user-name")).getText(), "ROMAN IOVLEV"); + + List headerItems = driver.findElements(By.cssSelector("ul.uui-navigation.nav > li")); + softAssert.assertEquals(headerItems.size(), 4); + + String[] expectedHeaderTexts = {"HOME", "CONTACT FORM", "SERVICE", "METALS & COLORS"}; + for (int i = 0; i < headerItems.size(); i++) { + softAssert.assertTrue(headerItems.get(i).isDisplayed()); + softAssert.assertEquals(headerItems.get(i).getText(), expectedHeaderTexts[i]); + } + + List images = driver.findElements(By.cssSelector(".benefit-icon > span")); + softAssert.assertEquals(images.size(), 4); + for (WebElement image : images) { + softAssert.assertTrue(image.isDisplayed()); + } + + List texts = driver.findElements(By.className("benefit-txt")); + softAssert.assertEquals(texts.size(), 4); + + String[] expectedTexts = { + "To include good practices\nand ideas from successful\nEPAM project", + "To be flexible and\ncustomizable", + "To be multiplatform", + "Already have good base\n (about 20 internal and \n some external projects), \n wish to get more..." + }; + + for (int i = 0; i < texts.size(); i++) { + softAssert.assertEquals(texts.get(i).getText(), expectedTexts[i]); + } + + WebElement iframe = driver.findElement(By.id("frame")); + softAssert.assertTrue(iframe.isDisplayed()); + + driver.switchTo().frame(iframe); + WebElement frameButton = driver.findElement(By.id("frame-button")); + softAssert.assertTrue(frameButton.isDisplayed()); + + driver.switchTo().defaultContent(); + + List leftMenuItems = driver.findElements(By.cssSelector("ul.sidebar-menu.left > li")); + softAssert.assertEquals(leftMenuItems.size(), 5); + + String[] expectedMenuTexts = {"Home", "Contact form", "Service", "Metals & Colors", "Elements packs"}; + for (int i = 0; i < leftMenuItems.size(); i++) { + WebElement item = leftMenuItems.get(i); + softAssert.assertTrue(item.isDisplayed()); + softAssert.assertEquals(item.getText(), expectedMenuTexts[i]); + } + + softAssert.assertAll(); + } +} +\end{lstlisting} + +Класс содержит следующие основные компоненты: + +\begin{itemize} + \item \textbf{Наследование от DriverSetup}: Класс \texttt{Task1Test} наследуется от класса \texttt{DriverSetup}, который выполняет предварительную настройку WebDriver и открывает веб-сайт. + \item \textbf{@Test testTask1()}: Это тестовый метод, помеченный аннотацией \texttt{@Test}, который указывает, что это метод TestNG для выполнения тестов. + \item \textbf{SoftAssert softAssert = new SoftAssert()}: Создание экземпляра \texttt{SoftAssert}, который позволяет собирать ошибки и не останавливать выполнение теста при первой неудаче. + \item \textbf{Проверки (Assertions)}: Метод содержит ряд проверок с использованием \texttt{softAssert.assertEquals()} и \texttt{softAssert.assertTrue()} для проверки различных элементов веб-страницы: + \begin{itemize} + \item Заголовок страницы (\texttt{softAssert.assertEquals(driver.getTitle(), "Home Page")})). + \item Имя пользователя (\texttt{softAssert.assertEquals(driver.findElement(By.id("user-name")).getText(), "ROMAN IOVLEV")})). + \item Элементы в секции заголовка (количество и текст элементов меню). + \item Изображения на главной странице (количество и отображение). + \item Тексты под иконками (количество и соответствие ожидаемым текстам). + \item Наличие и отображение iframe. + \item Наличие и отображение кнопки во iframe. + \item Элементы в левом меню (количество и текст элементов). + \end{itemize} + \item \textbf{Переключение на iframe и обратно}: В коде происходит переключение на iframe для проверки содержимого внутри него, а затем возврат обратно к основному содержанию страницы. + \item \textbf{softAssert.assertAll()}: Вызов этого метода в конце тестового метода позволяет убедиться, что все собранные ошибки будут выведены, и тест завершится с соответствующим статусом. +\end{itemize} + +\subsubsection{Класс Task2Test} +Класс \texttt{Task2Test} является тестовым классом, который проверяет различные элементы и функциональности веб-сайта. Он использует библиотеку Selenium WebDriver для взаимодействия с веб-страницей и библиотеку TestNG для организации и выполнения тестов. Класс выполняет проверку заголовка страницы, имени пользователя, а также взаимодействует с элементами на странице "Different Elements" (чекбоксы, радиокнопки, выпадающий список) и проверяет логи. + +\begin{lstlisting}[language=Java, caption=Класс Task2Test, basicstyle=\footnotesize\ttfamily, breaklines=true] +public class Task2Test extends DriverSetup { + private static final By USER_NAME = By.id("user-name"); + + @Test + public void testBrowserTitle() { + assertEquals(driver.getTitle(), "Home Page", "Browser title should be 'Home Page'"); + } + + @Test + public void testLogin() { + WebElement userNameElement = new WebDriverWait(driver, Duration.ofSeconds(10)) + .until(ExpectedConditions.visibilityOfElementLocated(USER_NAME)); + + assertTrue(userNameElement.isDisplayed(), "Username should be displayed"); + assertEquals(userNameElement.getText(), "ROMAN IOVLEV", "Username should be 'ROMAN IOVLEV'"); + } + + @Test + public void testElements() { + WebElement serviceDropdown = driver.findElement(By.cssSelector("header .nav > li.dropdown")); + serviceDropdown.click(); + + WebElement differentElementsLink = driver.findElement(By.xpath("//a[text()='Different elements']")); + differentElementsLink.click(); + assertEquals(driver.getTitle(), "Different Elements", "Заголовок страницы 'Different Elements' неверный."); + + List checkboxesToSelect = Arrays.asList("Water", "Wind"); + List checkboxes = new WebDriverWait(driver, Duration.ofSeconds(10)) + .until(ExpectedConditions.visibilityOfAllElementsLocatedBy( + By.cssSelector(".label-checkbox") + )); + + for (WebElement checkbox : checkboxes) { + if (checkboxesToSelect.contains(checkbox.getText())) { + if (!checkbox.findElement(By.tagName("input")).isSelected()) { + checkbox.click(); + } + assertTrue(checkbox.findElement(By.tagName("input")).isSelected()); + } + } + + String radioToSelect = "Selen"; + List radios = new WebDriverWait(driver, Duration.ofSeconds(10)) + .until(ExpectedConditions.visibilityOfAllElementsLocatedBy( + By.cssSelector(".label-radio") + )); + + for (WebElement radio : radios) { + if (radio.getText().equals(radioToSelect)) { + radio.click(); + assertTrue(radio.findElement(By.tagName("input")).isSelected()); + break; + } + } + + String dropdownValueToSelect = "Yellow"; + WebElement dropdown = new WebDriverWait(driver, Duration.ofSeconds(10)) + .until(ExpectedConditions.elementToBeClickable( + By.cssSelector(".colors select") + )); + + Select select = new Select(dropdown); + select.selectByVisibleText(dropdownValueToSelect); + assertEquals(select.getFirstSelectedOption().getText(), dropdownValueToSelect); + + List logs = new WebDriverWait(driver, Duration.ofSeconds(10)) + .until(ExpectedConditions.visibilityOfAllElementsLocatedBy( + By.cssSelector(".logs li") + )); + for (var elem : logs) + System.out.println(elem.getText()); + + List expectedLogs = Arrays.asList( + "Water: condition changed to true", + "Wind: condition changed to true", + "metal: value changed to Selen", + "Colors: value changed to Yellow" + ); + + for (int i = 0; i < expectedLogs.size(); i++) { + String actualLog = logs.get((logs.size()-1) - i).getText().replaceAll("\\d{2}:\\d{2}:\\d{2}", "").trim(); + assertTrue(actualLog.endsWith(expectedLogs.get(i))); + } + } +} +\end{lstlisting} + +Класс содержит следующие основные компоненты: + +\begin{itemize} + \item \textbf{Наследование от DriverSetup}: Класс \texttt{Task2Test} наследуется от класса \texttt{DriverSetup}, который выполняет предварительную настройку WebDriver и открывает веб-сайт. + \item \textbf{Поле USER\_NAME}: Приватное статическое поле \texttt{USER\_NAME} типа \texttt{By}, содержащее локатор для элемента с именем пользователя. + \item \textbf{@Test testBrowserTitle()}: Тестовый метод, который проверяет заголовок браузера на соответствие значению "Home Page". Использует \texttt{assertEquals} для проверки. + \item \textbf{@Test testLogin()}: Тестовый метод, который проверяет, что имя пользователя отображается и соответствует ожидаемому значению "ROMAN IOVLEV". Использует явное ожидание (\texttt{WebDriverWait}) для проверки видимости элемента. + \item \textbf{@Test testElements()}: Тестовый метод, который выполняет следующие шаги: + \begin{itemize} + \item Открывает страницу "Different Elements" через меню "Service". + \item Выбирает чекбоксы "Water" и "Wind". + \item Выбирает радиокнопку "Selen". + \item Выбирает значение "Yellow" в выпадающем списке. + \item Проверяет логи на соответствие ожидаемым значениям. + \end{itemize} + \item \textbf{Явные ожидания (WebDriverWait)}: Используются для ожидания появления и кликабельности элементов, что делает тесты более стабильными. + \item \textbf{Проверка логов}: Код проверяет логи на соответствие ожидаемым значениям, учитывая порядок и формат записей. +\end{itemize} +\subsubsection{Результаты работы №2} +Результаты запуска тестов представлены на Рис.~\ref{fig:selenium-tests} + +\begin{figure}[h!] + \centering + \includegraphics[width=0.35\linewidth]{img/selenium-tests.png} + \caption{Результаты выполнения тестов Selenium WebDriver} + \label{fig:selenium-tests} +\end{figure} + +Все разработанные тесты для проверки веб-сайта успешно пройдены. Тесты охватывают широкий спектр элементов страницы, включая заголовки, элементы навигации, iframe, чекбоксы и выпадающие списки. + + + + \newpage + \section*{Заключение} + \addcontentsline{toc}{section}{Заключение} + + В ходе выполнения лабораторной работы были изучены ключевые аспекты автоматизированного тестирования программного обеспечения. Работа охватила создание, написание и выполнение юнит-тестов для Java-библиотеки calculator.jar с использованием JUnit, а также организацию тестирования веб-страниц с помощью Selenium WebDriver и TestNG. + + В результате тестирования библиотеки calculator.jar были обнаружены неточности в реализации некоторых методов, в частности, неверное вычисление тангенса и некорректная работа с числами с плавающей точкой при умножении. Эти ошибки могли бы остаться незамеченными при поверхностном ручном тестировании, что демонстрирует ценность автоматизированного подхода. + + При тестировании веб-сайта с помощью Selenium WebDriver была подтверждена корректность отображения элементов и их функциональность. Успешное прохождение всех тестов показало, что сайт работает в соответствии с ожиданиями в тестовых сценариях. + + Использованные инструменты автоматизированного тестирования продемонстрировали себя как эффективное средство для систематической проверки программного обеспечения на соответствие требованиям. Они позволяют выполнять тесты на больших наборах данных и многократно повторять одни и те же сценарии, что затруднительно при ручном тестировании. + + Тем не менее, автоматизированное тестирование имеет свои ограничения. Оно фокусируется преимущественно на проверке функциональности и не способно в полной мере оценить удобство использования или обнаружить непредвиденные сценарии использования. Кроме того, сами автоматизированные тесты могут содержать ошибки. + + Таким образом, можно заключить, что наиболее эффективный подход к тестированию сочетает в себе автоматизированные и ручные методы. Автоматизированное тестирование обеспечивает стабильность и повторяемость проверок, а ручное позволяет выявлять проблемы, связанные с удобством использования и нестандартными сценариями. Комплексное применение обоих подходов существенно повышает качество программного обеспечения. + +\newpage +\section*{Список литературы} +\addcontentsline{toc}{section}{Список литературы} + +\vspace{-1.5cm} +\begin{thebibliography}{0} + \bibitem{1} {Что такое Selenium WebDriver? — Habr. [Электронный ресурс]. \\URL: \href{https://habr.com/ru/articles/152971/}{https://habr.com/ru/articles/152971/} (дата обращения: 30.04.2025).} + + \bibitem{2} {Selenium IDE — Habr. [Электронный ресурс]. \\URL: \href{https://habr.com/ru/articles/590607/}{https://habr.com/ru/articles/590607/} (дата обращения: 30.04.2025).} +\end{thebibliography} + +\end{document} \ No newline at end of file