Тестирование программного обеспечения
Характеристика сущности тестирования программного обеспечения. Классификация видов тестирования. Разработка и выполнение тест-кейсов. Расчет экономической целесообразности введения автоматизированного тестирования. Внедрение автоматизированных тестов.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 30.08.2016 |
Размер файла | 378,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Ca - Оценка затрат на анализ результатов одной итерации цикла автоматизированного тестирования, которая вычисляется как оценка доли отрицательных тестов, умноженная на количество тестов, на среднее время, необходимое для анализа причин отрицательной оценки одного теста одним тестировщиком, и на цену одного рабочего часа тестировщика.
Cm - Оценка стоимости поддержания автоматизированных тестов в рабочем и актуальном состоянии. Рассчитывается как вероятность появления необходимости изменения одного теста между циклами тестирования, умноженная на количество тестов, на среднее время, необходимое для актуализации одного теста и на цену одного рабочего часа тестировщика.
Оценка стоимости ручного тестирования (Gp) представлена в следующей формуле:
G0 - Оценка стоимости разработки базы тест-кейсов для ручного тестирования.
k - Это количество планируемых прогонов тестов (циклов тестирования) за всё оставшееся время жизненного цикла продукта.
Ge - Оценка стоимости однократного выполнения цикла ручного тестирования, которая рассчитывается как среднее время, затрачиваемое на подготовку к тестированию плюс среднее время, нужное для выполнения одного тест-кейса одним тестировщиком, умноженное на суммарное количество кейсов и на цену одного рабочего часа тестировщика.
Ga - Оценка стоимости анализа результатов для одного прогона цикла ручного тестирования. Вычисляется как оценка средней доли отрицательных тестов в прогоне, умноженная на количество тестов, на среднее время, необходимое для анализа причин отрицательной оценки одного теста одним тестировщиком, и на цену одного рабочего часа тестировщика;
Gm - Оценка стоимости поддержания ручных тестов в актуальном состоянии. Рассчитывается как вероятность появления необходимости изменения одного теста между циклами тестирования, умноженная на количество тестов, на среднее время, необходимое для актуализации одного теста и на цену одного рабочего часа тестировщика [7].
С помощью этих формул компания может посчитать, будет ли внедрение автоматизированных тестов экономически оправдано. В следующей главе на конкретном примере будет рассчитана экономическая целесообразность внедрения таких тестов.
Глава 3. Автоматизация процесса тестирования
В этой главе на конкретном примере будет проверяться гипотеза о целесообразности автоматизации тестирования в компании. Также будут написаны автоматизированные тесты для проверки данной гипотезы на реальных данных.
3.1 Описание компании
Для данного исследования мною была выбрана компания АО «РТ Лабс». РТ Лабс является дочерней компанией ОАО «Ростелеком», который в свою очередь представляет собой единственного исполнителя работ в Российской Федерации по развитию электронного правительства. Будучи подрядчиком «Ростелекома» в области развития электронного правительства и национальной облачной платформы, компания РТ Лабс обеспечивает развитие и поддержку портала государственных услуг https://www.gosuslugi.ru/. В компании РТ Лабс есть большой отдел тестирования, состоящий из 25 специалистов. В отделе есть ----, занимающиеся статическим тестированием, тестированием документации, есть -- занимающийся динамическим тестированием сайта. Каждую неделю в продуктивную среду выпускаеются исправления и улучшения сайта. Перед выпуском релиза в продуктив, на тестовой среде проводится регрессионное тестирование, для того, чтобы убедиться, что основной функционал сайта не поврежден и в продуктив выйдет корректный релиз.
На данный момент регрессионное тестирование состоит из 220 проверок, и ни один тест не автоматизирован.
3.2 Расчёт экономической целесообразности введения автоматизированного тестирования
Для проверки гипотезы о целесообразности автоматизации процесса тестирования в компании необходимо посчитать затраты на ручное тестирование и затраты на автоматизацию. Расчеты будут производится исходя из данных, полученных в ходе опроса работников отдела тестирования в компании РТ Лабс. При опросе было выявлено, что регрессионное тестирование, которое проводится каждую неделю, занимает большое количество времени у тестировщиков и именно этот вид тестирования специалисты данного отдела хотели бы автоматизировать. Для расчета целесообразности автоматизации используются формулы, описанные во второй главе. В ходе опроса были получены данные, необходимые для подсчетов.
· Оплата тестировщика, занимающегося автоматизацией, оценивается в 600 рублей в час, в то время как оплата ручного тестировщика составляет 500 рублей в час.
· Данный проект рассчитан как минимум еще на три года. Регрессионное тестирование проводится каждую неделю, но часто случается так, что после исправления критичных ошибок, найденных при тестировании, проверки необходимо выполнять заново. И того, примерно 1.5 прогона в неделю. При тестировании используется 220 тестов.
· На подготовку к циклу у ведущего тестировщика обычно уходит порядка 45 минут, преимущественно это время тратится на распределение задач между тестировщиками и другие организационные задачи. Среднее время, необходимое одному тестировщику на выполнение одного тест-кейса, составляет 10 минут.
· При каждом прогоне примерно 5% тестов имеют отрицательные результаты. На определение источника ошибки для каждого теста у ручного тестировщика уходит около 10 минут, в то время как при автоматизированном тестировании анализ ошибки занимает 15 минут. При ручном тестировании тестировщик сразу видит, где именно и при каких входных данных произошла ошибка, а при автоматизированном тестировании эту информацию необходимо искать коде.
· Вероятность появления необходимости изменения одного теста между циклами тестирования оценена в 3%, Среднее время, необходимое для актуализации одного теста около 6 минут. Для актуализации автоматизированного теста потребуется 30 минут.
· Автоматизация одного теста оценивается в 3 часа
Учитывая информацию, полученную в ходе опроса специалистов отдела тестирования, можно произвести расчет затрат на ручное и автоматизированное тестирование.
Формула для расчета затрат на автоматизированное тестирование
Начальные инвестиции в данном случае равны нолю, поскольку используется бесплатный стек технологий (IDE, Фреймфорки и прочее) и отсутствует необходимость вкладываться в дополнительное оборудование.
Стоимость разработки автоматизированных тестов равна 396 000 рублей (220 тестов * 3 часа * 600 руб/час).
Планируемое количество циклов тестирования - 234 раз (3года*52недели*1.5раза)
Оценка стоимости однократного выполнения цикла автоматизированного тестирования равна нулю, поскольку подготовка к циклу тестирования не требуется, а само тестирование не нуждается в дополнительном контроле со стороны работника и происходит полностью автономно.
Оценка стоимости анализа результатов выполненного цикла автоматизированного тестирования равна 1 650 рублей (220тестов * 0.05 * 0.25часа * 600руб/час)
Оценка стоимости поддержания автоматизированных тестов в рабочем и актуальном состоянии равна 1 980 рублей (220тестов * 0.03 * 0.5часа * 600руб/час).
Таким образом, итоговая стоимость внедрения и эксплуатации системы автоматизированных тестов равна:
0 + 396 000 + 234 * (0 + 1 650 + 1 980) = 1 245 420 рублей.
Формула для расчет затрат на ручное тестирование:
Оценка стоимости разработки базы тест-кейсов для ручного тестирования равна нулю, поскольку компания уже обладает базой тест-кейсов
Оценка стоимости однократного выполнения цикла ручного тестирования равна 19 075 рублей (0.75 + 220 тестов* 0.17) * 500руб/час.
Оценка стоимости анализа результатов для одного прогона цикла ручного тестирования равна 935 рублей (220 * 0.05 * 0.17 * 500).
Оценка стоимости поддержания ручных тестов в актуальном состоянии равна 330 рублей (220 * 0.03 * 0.1 * 500).
Итоговая стоимость затрат на ручное тестирование равна:
0 + 234 * (19 075 + 935 + 330) = 4 759 560 рублей.
Следовательно, можно прийти к заключению, что на данном проекте автоматизация целесообразна. Далее будут разработаны два автоматизированных теста для проверки данной гипотезы на реальных данных.
3.3 Внедрение автоматизированных тестов
Автоматизация функциональных тестов веб-приложений обычно происходит с помощью специальных программных фреймворков, позволяющих симулировать поведение реальных пользователей из программной среды. Эти фреймворки обычно состоят из 2-х частей: программы или надстройки над браузером, которая позволяет управлять браузером и выполнять команды внутри него и программного API, предоставляющего удобные функции для контролирования этой программы. Ниже описаны основные функции, которые предоставляют подобные фреймворки.
· Общие функции браузера (Открытие новой вкладки или окна и контролирование их размеров).
· Навигация между веб страницами.
· Поиск веб элемента на странице с указанными параметрами.
· Функции ожидания определенных событий (например ожидание полной загрузки страницы или появления на ней определенного элемента).
· Симуляция действий пользователя, таких как нажатие кнопки мыши на определенный элемент или ввод последовательности символов с клавиатуры.
· Для более сложных действий предоставляется возможность исполнять JavaScript команды на странице.
Автоматизировать ф тесты можно с помощью различных программных фреймворков. Есть большое кол-во инструментов для автоматизации функц тестирования основные из которых Selenium WebDriver, Watij HtmlUnit Jamaleon.
Мною был выбран Selenium WebDriver, поскольку он в отличие от других фреймровков позволяет выбрать язык программирования для реализации тестов (большинство остальных фреймворков позволяют использовать только Java), способен работать со всеми браузерами и обладает максимально богатым функционалом с точки зрения функционально тестирования. Из предоставляемых Selenium WebDriver возможных языков программирования для реализации тестов (Java, C#, Ruby, Python) был выбран C#, поскольку на момент написания данной работы мною был накоплен больший опыт использования этого языка чем других.
При практическом применении автоматизированных функциональных тестов очень быстро обнаруживается что тестирование каждого отдельного веб приложения обладает своей спецификой. Это подталкивает к созданию дополнительного программного слоя между фреймворком для тестирования и самими автотестами. Такой подход позволяет минимизировать количество повторяющегося кода путем вынесения его в функции этого слоя, что положительно сказывается на скорости создания автотестов, понижает вероятность возникновения ошибок и улучшает удобочитаемость кода. Обычно такие промежуточные API содержат утилиты и классы, позволяющие оперировать более высокоуровневыми сущностями, существующими в контексте конкретного веб приложения. Часто в автотестах может понадобиться протестировать функционал, для которого необходимо авторизоваться, найти типичный для всех страниц приложения элемент, сделать прямой запрос к базе данных чтобы сверить данные с представленными на сайте и т.д. Такие действия будут регулярно выполняться из автотестов, при этом если не вынести их в отдельное API они будут только загромождать код, поскольку занимают много места и не имеют прямого отношения к конкретному тест кейсу.
Ниже представлены реальные тест-кейсы для тестирования сайта Госуслуги в компании РтЛабс, описанные в программе TestLink.
Данный тест проверяет работу технической поддержки сайта. Для проверки данного функционала необходимо отправить сообщение в службу поддержки сайта и проверить, что отправленное сообщение отображается в личном кабинете. Далее идет проверка на возможность отправить сообщение в службу поддержки со страницы личного кабинета и возможность отправить второе сообщение по ранее созданному. В данном тест-кейсе также есть проверка на корректную работу поиска на странице технческой поддержки в личном кабинете пользователя.
Тест PGU-174: ФОС |
|||||
#: |
Шаги: |
Ожидаемая реакция: |
Execution Status: |
||
1 |
Отправка обращения. Переход в ЛК по кнопке Вернуться к списку |
Отображается список |
Пройден |
||
2 |
Отображение данных на вкладке ЛК - Техподдержка |
Данные отображаются |
Пройден |
||
3 |
Создание нового сообщения с вкладки ЛК - Техподдержка |
Сообщение создано |
Пройден |
||
4 |
Отправка второго сообщение по ранее созданному. |
Повторное сообщение отправлено |
Пройден |
||
5 |
Проверка поиска на вкладке ЛК - Техподдержка |
Поиск работает корректно |
Пройден |
||
Execution type: |
Вручную |
||||
Estimated exec. duration (min): |
10.00 |
||||
Приоритет: |
Medium |
||||
Execution Details |
|||||
Версия (сборка) |
Тестовая сборка |
||||
Тестировщик |
elizaveta.cherkasova |
||||
Execution Result: |
Пройден |
||||
Execution Mode: |
Вручную |
Этот тест проверяет работоспособность всех вкладок на странице «Лента уведомлений» в личном кабинете пользователя, работоспособность фильтра и поиска на странице ленты уведомлений.
Тест PGU-176: ФЛ ЛК - Лента уведомлений |
|||||
#: |
Шаги: |
Ожидаемая реакция: |
Execution Status: |
||
1 |
Работоспособность вкладок, отображение верной информации на каждой из них. |
Вкладки работают корректно, отображается верная информация |
Пройден |
||
2 |
Отображение Заявок, черновиков. |
Отображаются корректно |
Пройден |
||
3 |
Работоспособность поиска, фильтра. |
Поиск и фильтр работают корректно |
Пройден |
||
Execution type: |
Вручную |
||||
Estimated exec. duration (min): |
10.00 |
||||
Приоритет: |
Medium |
||||
Execution Details |
|||||
Версия (сборка) |
Тестовая сборка |
||||
Тестировщик |
elizaveta.cherkasova |
||||
Execution Result: |
Пройден |
||||
Execution Mode: |
Вручную |
Далее представлена реализация описанных выше тестов.
Тест, который проверяет отправку сообщения в службу поддержки и отображение данного сообщения в ЛК пользователя.
· Переход на страницу «Лента уведомлений», вкладка «Техподдержка»
WebDriver.Chrome.NavigateToUrl("http://lk-dev.test.gosuslugi.ru/notifications?type=FEEDBACK");
· Ожидание появления элемента «Создать новое сообщение» и последующее нажатие на него
WebDriver.Chrome.WaitUntilElementVisible(By.CssSelector("#content>div.ng-scope>div>ng-include>div>fieldset>ul>li.feedback-button.ng-scope>a")).SafeClick();
· Заполнение формы обратной связи
WebDriver.Chrome.WaitUntilElementVisible(By.Id("_epgu_el2")).SafeClick(); WebDriver.Chrome.WaitUntilElementVisible(By.XPath("//*[@id=\"feedbackForm\"]/div/div/div/div[2]/ul/li[4]")).SafeClick(); WebDriver.Chrome.WaitUntilElementVisible(By.XPath("//*[@id=\"feedbackForm\"]/div/div/ng-include/epgu-input[1]/div/textarea")).SendKeys("TEST"); WebDriver.Chrome.WaitUntilElementVisible(By.XPath("//*[@id=\"feedbackForm\"]/div/div/ng-include/epgu-input[1]/div/textarea")).Submit();
· Фиксация время отправки сообщения
DateTime time = DateTime.Now;
· Ожидание появления элемента «Вернуться к списку» и последующее нажатие на него
WebDriver.Chrome.WaitUntilElementVisible(By.XPath("//*[@id=\"content\"]/div[2]/div/div/div/div[4]/a")).SafeClick();
· Ожидание появления сообщения с совпадающим временем отправки и последующее нажатие на него
WebDriver.Chrome.RefreshUntil(_ => _.FindElements(By.ClassName("advice-datetime")).Any(a => a.Text.Equals(time.ToString("dd.MM.yyyy HH:mm"))));
WebDriver.Chrome.FindElements(By.ClassName("advice-datetime")).First(_ => _.Text.Equals(time.ToString("dd.MM.yyyy HH:mm"))).SafeClick();
· Создание уникального сообщения для отправки дополнительного сообщения
Guid guid = Guid.N
· Отправка дополнительного сообщения
WebDriver.Chrome.WaitUntilElementVisible(By.XPath("//*[@id=\"content\"]/div[2]/div/ng-include/ng-include/div/div[2]/form/div/div[1]/div[1]/textarea")).SendKeys(guid.ToString()); WebDriver.Chrome.WaitUntilElementVisible(By.XPath("//*[@id=\"content\"]/div[2]/div/ng-include/ng-include/div/div[2]/form/div/div[1]/div[1]/textarea")).Submit();
· Ожидание отображения отправленного сообщения в окне переписки
WebDriver.Chrome.WaitUntilElementVisible(By.ClassName("event-text"));
· Проверка совпадения текста сообщения с отправленным ранее
Assert.IsTrue(WebDriver.Chrome.FindElements(By.ClassName("event-text")).Any(_ => _.Text == guid.ToString()), "No message recieved");}
Тест, который проверяет функцию поиска на странице техподдержки.
· Переход на страницу «Лента уведомлений», вкладка «Техподдержка»
WebDriver.Chrome.NavigateToUrl("http://lk- dev.test.gosuslugi.ru/notifications?type=FEEDBACK");
· Ввод определенного текста в поле фильтрации сообщений
string searchText = "отзыв";
WebDriver.Chrome.WaitUntilElementVisible(By.XPath("//*[@id=\"content\"]/div[2]/div/ng-include/div/fieldset/ul/li[1]/dl[2]/dd/input")).SendKeys(searchText);
· Ожидание пока все отсортированные сообщения не будут содержать введенный в фильтр текст
WebDriver.Chrome.WaitUntil(_ => _.FindElements(By.ClassName("highlighted")).All(a => a.Text == searchText));}
Тест, который проверяет работоспособность всех вкладок Личного кабинета
· Переход на страницу «Лента уведомлений», вкладка «Все»
WebDriver.Chrome.NavigateToUrl("http://lk-dev.test.gosuslugi.ru/notifications?type=all");
WebDriver.Chrome.WaitUntilElementExists(By.ClassName("advice-item"));
· Поочередный переход на все вкладки на странице «Лента уведомлений»
WebDriver.Chrome.NavigateToUrl("http://lk-dev.test.gosuslugi.ru/notifications?type=PAYMENT");
WebDriver.Chrome.WaitUntilElementExists(By.ClassName("advice-item"));
WebDriver.Chrome.NavigateToUrl("http://lk-dev.test.gosuslugi.ru/notifications?type=ORDER");
WebDriver.Chrome.WaitUntilElementExists(By.ClassName("advice-item"));
WebDriver.Chrome.NavigateToUrl("http://lk-dev.test.gosuslugi.ru/notifications?type=DRAFT");
WebDriver.Chrome.WaitUntilElementExists(By.ClassName("advice-item"));
WebDriver.Chrome.NavigateToUrl("http://lk-dev.test.gosuslugi.ru/notifications?type=FEEDBACK");
WebDriver.Chrome.WaitUntilElementExists(By.ClassName("advice-item"));");
· Переход на вкладку «Все» и ввод в поле фильтрации определенного текста
WebDriver.Chrome.NavigateToUrl("http://lk-dev.test.gosuslugi.ru/notifications?type=all WebDriver.Chrome.WaitUntilElementVisible(By.XPath("//*[@id=\"content\"]/div[2]/div/ng-include/div/fieldset/ul/li/dl[2]/dd/input")).SendKeys("35");
· Ожидание появления результатов фильтрации
WebDriver.Chrome.WaitUntilElementExists(By.ClassName("advice-item"));
· Проверка правильности фильтрации сообщений
Assert.IsTrue(WebDriver.Chrome.FindElements(By.ClassName("highlighted")).All(_ => _.Text == "35"));
· Очистка поля фильтрации
WebDriver.Chrome.WaitUntilElementVisible(By.XPath("//*[@id=\"content\"]/div[2]/div/ng-include/div/fieldset/ul/li/dl[2]/dd/input")).Clear();
· Фильтрация сообщений по дате
WebDriver.Chrome.WaitUntilElementVisible(By.XPath("//*[@id=\"_epgu_el1\"]/div[1]")).SafeClick(); WebDriver.Chrome.WaitUntilElementVisible(By.XPath("//*[@id=\"content\"]/div[2]/div/ng-include/div/fieldset/ul/li/dl[1]/dd/div/div[2]/ul/li[5]")).SafeClick();
WebDriver.Chrome.WaitUntilElementExists(By.ClassName("advice-datetime"));
· Проверка соответствия даты на всех элементах с датой фильтрации
Assert.IsTrue(WebDriver.Chrome.FindElements(By.ClassName("advice-datetime")).All(_ => (DateTime.Now - DateTime.Parse(_.Text)).Duration().Days == 0));
После того как были автоматизированы несколько тестов, описанных выше, можно сделать вывод о целесообразности автоматизации в контексте компании РТ Лабс.
Разработка автоматизированных тестов состояла из двух этапов: разработка промежуточного слоя между фреймворком для тестирования и самими авто тестами, и разработка автоматизированных тестов. На первый этап ушло около 16 часов рабочего времени, а на второй около 8. При этом было разработано 2 масштабных теста.
При расчете затрат на автоматизированное тестирование по данной формуле
Используя вышеописанные формулы можно рассчитать величину вложений, нужных для реализации автоматизированного и ручного тестирований.
Для автоматизированного тестирования необходимы затраты в 22 122 рублей.
Для ручного тестирования - 43 269 рублей.
Таким образом, автоматизировав всего 2 теста, была получена выгода почти в два раза, при этом, можно ожидать, что последующая автоматизация тестирования приведет к еще большей разнице в эффективности, поскольку этап разработки промежуточного слоя уже пройден (хотя, однозначно по нему потребуются доработки при использовании в реальной компании).
Такая большая разница в эффективности очень показательна, однако нужно понимать, что в зависимости от конкретного проекта и рассматриваемого типа тестирования улучшение эффективности за счет автоматизации может меняться, и в ряде случаев автоматизация может оказаться нецелесообразной.
Заключение
Сегодня тестирование является неотъемлемой частью процесса производства программных продуктов. Качественное тестирование помогает своевременно выявлять и исправлять ошибки, тем самым уменьшая риски и затраты на разработку программного обеспечения. При автоматизации тестирования скорость и качество тестирования может повыситься, что приведет к еще большему снижению издержек и повышению качества.
В данной работе была проанализирована эффективность внедрения автоматизированного тестирования в компании РТ Лабс. Для достижения поставленной цели были решены такие теоретические задачи, как описание теоретических основ тестирования, классификация и описание различных видов тестирования, описание методологий, анализ процесса тестирования, выявление и описание критериев корректного построения процесса тестирования. В работе также были определены критерии эффективности процесса тестирования, описаны и проанализированы формулы, позволяющие выразить эффективность данного процесса в денежном эквиваленте.
В практической части работы на примере компании РТ Лабс была просчитана эффективность внедрения автоматизированного тестирования для проведения регрессионного тестирования. Для подсчета эффективности были применены формулы, описанные ранее. После полученных результатов, в которых говорилось о целесообразности применения автоматизированного тестирования в теории, были автоматизированы два больших теста с целью подтвердить или опровергнуть полученные ранее результаты.
В результате автоматизации двух тестов были получены результаты, подтверждающие целесообразность внедрения автоматизированного тестирования для проведения регрессионного тестирования.
Данные результаты показывают целесообразность только для конкретной компании и для конкретного вида тестирования. Необходимо понимать, что каждая компания сама должна оценивать целесообразность внедрения автоматизированного тестирования программного обеспечения.
Для правильного построения и автоматизации процесса тестирования необходимо обладать теоретическими знаниями в данной области, различать виды тестирования, понимать, как именно должен быть написан правильный тест-кейс, для повышения качества тестирования программного обеспечения. Данная работа актуальна для компаний, нацеленных на развитие направления тестирования, автоматизацию процесса тестирования и повышение качества своего продукта, поскольку в работе описаны необходимые теоретические основы, более того, проанализированы критерии эффективности процесса тестирования и на конкретном примере рассчитана эффективность внедрения автоматизированного тестирования в компании.
Список литературы
1. Джек Фолк, Сэм Канер, Енг. Кек Нгуен. Тестирование программного обеспечения. Издательство ДиаСофт, 2001.
2. Савин Роман. Тестирование DOT COM. Издательство Дело, 2007.
3. Виды Тестирования [Электронный ресурс]/ Про Тестинг - Тестирование Программного Обеспечения. URL: http://www.protesting.ru/testing/types/sanity.html
4. Certifying Software Testers Worldwide [Электронный ресурс]/ URL: http://www.istqb.org/
5. Александр Хрущев. Эффективность использования автоматических тестов в ИТ-проектах. Доклад на конференции CEE-SECR 2009, октябрь 2009.
6. Оценка эффективности автоматизации тестирования [Электронный ресурс]/ Технологии качества. URL: http://a1qa.ru/blog/otsenka-effektivnosti-avtomatizatsii-testirovaniya/
7. Гребенюк В. М. Oценка целесообразности внедрения автоматизированного тестирования. Институт Государственного управления, права и инновационных технологий (ИГУПИТ). Интернет-журнал «НАУКОВЕДЕНИЕ» №1 2013
8. Джефф Рэшка, Элфрид Дастин, Джон Пол. Автоматизированное тестирование программного обеспечения. Внедрение, управление, эксплуатация. Издательство Лори, 2012.
9. Ron Patton. Software Testing. 2005.
10. Винниченко И.В. Автоматизация процессов тестирования. Издательство Питер, 2005.
11. Рекс Блек. Ключевые процессы тестирования - М.: Издательство Лори, 2014. - 544 с.
12. Сертификация программного обеспечения (ПО) [Электронный ресурс]/ Национальная сертификационная палата. URL: http://www.nspru.ru/sertsoftware/
13. Автоматизированное тестирование [Электронный ресурс]/ GitHub. URL: https://gist.github.com/codedokode/a455bde7d0748c0a351a
14. Основные положения тестирования [Электронный ресурс]/ Интересные публикации / Хабрахабр. URL: https://habrahabr.ru/post/110307/
15. Что такое Конфигурационное тестирование [Электронный ресурс]/ software-testing. URL: http://software-testing.org/testing/chto-takoe-konfiguracionnoe-testirovanie-configuration-testing.html
16. Автоматизация тестирования [Электронный ресурс]/ Перфоманс Лаб. URL: http://www.performance-lab.ru/avtomatizacija-testirovanija
Приложение
Исходный код решения по автоматизации тестов
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace UnitTestProject {
public static class WebDriver {
public static event Action<IWebDriver> OnDocumentReady;
public static IWebDriver Chrome {
get
{
if (ChromeInstance == null) {
ChromeInstance = new ChromeDriver(@"..\..\Drivers\");
ChromeInstance.Manage().Window.Maximize();
}
return ChromeInstance;
}
}
private static IWebDriver ChromeInstance;
public static void WaitUntil(this IWebDriver driver, Func<IWebDriver, bool> condition, int timeout = 15) {
var webDriverWait = new WebDriverWait(driver, new TimeSpan(0, 0, timeout));
webDriverWait.Until(condition);
}
public static IWebElement WaitUntilElementVisible(this IWebDriver driver, By path, int timeout = 15) {
var webDriverWait = new WebDriverWait(driver, new TimeSpan(0, 0, timeout));
return webDriverWait.Until<IWebElement>(ExpectedConditions.ElementIsVisible(path));
}
public static IWebElement WaitUntilElementExists(this IWebDriver driver, By path, int timeout = 15) {
var webDriverWait = new WebDriverWait(driver, new TimeSpan(0, 0, timeout));
return webDriverWait.Until<IWebElement>(ExpectedConditions.ElementExists(path));
}
public static void WaitUntilDocumentReady(this IWebDriver driver, int timeout = 15) {
var webDriverWait = new WebDriverWait(driver, new TimeSpan(0, 0, timeout));
webDriverWait.Until(_ => _.DocumentReady());
if (OnDocumentReady != null)
OnDocumentReady(driver);
}
public static void RefreshUntil(this IWebDriver driver, Func<IWebDriver, bool> condition, int timeout = 15) {
while (!condition(driver)) {
driver.Refresh();
driver.WaitUntilDocumentReady();
}
}
public static bool DocumentReady(this IWebDriver driver) {
return ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete");
}
public static void NavigateToUrl(this IWebDriver driver, string url) {
driver.Navigate().GoToUrl(url);
}
public static void Refresh(this IWebDriver driver) {
driver.Navigate().Refresh();
}
public static void SafeClick(this IWebElement element) {
Application.DisableTopBar(Chrome);
element.Click();
}
}
}
using OpenQA.Selenium;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
using OpenQA.Selenium.Support.UI;
namespace UnitTestProject {
public static class Application {
public static void RequiresAuthentication() {
if (!IsAuthenticated())
Authenticate();
}
public static void DisableTopBar(IWebDriver driver) {
driver.WaitUntilElementVisible(By.CssSelector("body>iframe"));
((IJavaScriptExecutor)WebDriver.Chrome).ExecuteScript(
"var bar = document.querySelector(\"body>iframe\");" +
"bar.style.pointerEvents = \"none\";"
);
}
public static void EnableTopBar() {
WebDriver.Chrome.WaitUntilElementVisible(By.CssSelector("body>iframe"));
((IJavaScriptExecutor)WebDriver.Chrome).ExecuteScript(
"var bar = document.querySelector(\"body>iframe\");" +
"bar.style.pointerEvents = \"auto\";"
);
}
private static void Authenticate() {
WebDriver.Chrome.NavigateToUrl("http://beta-dev.test.gosuslugi.ru/");
WebDriver.Chrome.NavigateToUrl("http://beta-dev.test.gosuslugi.ru/auth/esia/?redirectPage=/");
WebDriver.Chrome.WaitUntilDocumentReady();
WebDriver.Chrome.FindElement(By.CssSelector("#mobileOrEmail")).SendKeys("fedora@mailforspam.com");
WebDriver.Chrome.FindElement(By.CssSelector("#password")).SendKeys("1234567890");
WebDriver.Chrome.FindElement(By.CssSelector("#authnFrm>div.content-box.login-slils-box>div.data-form.flt-lbl-form>div.line-btns>button")).Click();
WebDriver.Chrome.WaitUntilDocumentReady();
}
private static bool IsAuthenticated() {
var currentUrl = WebDriver.Chrome.Url;
WebDriver.Chrome.NavigateToUrl("http://beta-dev.test.gosuslugi.ru/user");
WebDriver.Chrome.WaitUntilDocumentReady();
var user = JObject.Parse(WebDriver.Chrome.FindElement(By.CssSelector("body>pre")).Text);
var result = user["error"].Value<int>("errorCode") == 0;
if (result) {
WebDriver.Chrome.NavigateToUrl(currentUrl);
WebDriver.Chrome.WaitUntilDocumentReady();
}
return result;
}
}
}
using System;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
namespace UnitTestProject {
[TestClass]
public class AcctountTests {
[TestMethod]
public void Account_Support() {
Application.RequiresAuthentication();
// Переход на страницу техподдержки
WebDriver.Chrome.NavigateToUrl("http://lk-dev.test.gosuslugi.ru/notifications?type=FEEDBACK");
// Переход на форму обратной связи
WebDriver.Chrome.WaitUntilElementVisible(By.CssSelector("#content>div.ng-scope>div>ng-include>div>fieldset>ul>li.feedback-button.ng-scope>a")).SafeClick();
// Заполнение формы
WebDriver.Chrome.WaitUntilElementVisible(By.Id("_epgu_el2")).SafeClick();
WebDriver.Chrome.WaitUntilElementVisible(By.XPath("//*[@id=\"feedbackForm\"]/div/div/div/div[2]/ul/li[4]")).SafeClick();
WebDriver.Chrome.WaitUntilElementVisible(By.XPath("//*[@id=\"feedbackForm\"]/div/div/ng-include/epgu-input[1]/div/textarea")).SendKeys("TEST");
WebDriver.Chrome.WaitUntilElementVisible(By.XPath("//*[@id=\"feedbackForm\"]/div/div/ng-include/epgu-input[1]/div/textarea")).Submit();
// Фиксируем время отправки формы
DateTime time = DateTime.Now;
// Возврат на страницу техподдержки
WebDriver.Chrome.WaitUntilElementVisible(By.XPath("//*[@id=\"content\"]/div[2]/div/div/div/div[4]/a")).SafeClick();
WebDriver.Chrome.RefreshUntil(_ => _.FindElements(By.ClassName("advice-datetime")).Any(a => a.Text.Equals(time.ToString("dd.MM.yyyy HH:mm"))));
WebDriver.Chrome.FindElements(By.ClassName("advice-datetime")).First(_=>_.Text.Equals(time.ToString("dd.MM.yyyy HH:mm"))).SafeClick();
Guid guid = Guid.NewGuid();
WebDriver.Chrome.WaitUntilElementVisible(By.XPath("//*[@id=\"content\"]/div[2]/div/ng-include/ng-include/div/div[2]/form/div/div[1]/div[1]/textarea")).SendKeys(guid.ToString());
WebDriver.Chrome.WaitUntilElementVisible(By.XPath("//*[@id=\"content\"]/div[2]/div/ng-include/ng-include/div/div[2]/form/div/div[1]/div[1]/textarea")).Submit();
WebDriver.Chrome.WaitUntilElementVisible(By.ClassName("event-text"));
Assert.IsTrue(WebDriver.Chrome.FindElements(By.ClassName("event-text")).Any(_ => _.Text == guid.ToString()), "No message recieved");
}
[TestMethod]
public void Account_Support_Search() {
Application.RequiresAuthentication();
WebDriver.Chrome.NavigateToUrl("http://lk-dev.test.gosuslugi.ru/notifications?type=FEEDBACK");
string searchText = "отзыв";
WebDriver.Chrome.WaitUntilElementVisible(By.XPath("//*[@id=\"content\"]/div[2]/div/ng-include/div/fieldset/ul/li[1]/dl[2]/dd/input")).SendKeys(searchText);
WebDriver.Chrome.WaitUntil(_ => _.FindElements(By.ClassName("highlighted")).All(a => a.Text == searchText));
}
}
}
Размещено на Allbest.ru
Подобные документы
Неразрешимость проблемы тестирования программного обеспечения. Виды и уровни тестирования. Стратегии восходящего и нисходящего тестирования. Методы "белого" и "черного" ящика. Автоматизированное и ручное тестирование. Разработка через тестирование.
курсовая работа [112,2 K], добавлен 22.03.2015Изучение различных видов тестирования программного обеспечения. Выявление в программной системе скрытых дефектов до того, как она будет сдана заказчику. Тестирование методом черного ящика. Требования, предъявляемые к процессу тестирования больших систем.
курсовая работа [3,0 M], добавлен 19.11.2009История развития и виды тестирования программного обеспечения. Инсталляционное, регрессионное, конфигурационное, интеграционное, локализационное, модульное тестирование. Методы сокращения трудоемкости модульного тестирования разрабатываемого приложения.
курсовая работа [309,5 K], добавлен 16.12.2015История возникновения тестирования программного обеспечения, основные цели и особенности его проведения. Виды и типы тестирования, уровни его автоматизации. Использование и исследование необходимых технологий. Полный цикл прогона всей системы мониторинга.
дипломная работа [1,7 M], добавлен 03.05.2018Выбор инструментальной среды разработки программного обеспечения системы. Алгоритм создания теста и ввода его исходных данных. Анализ экономической эффективности применения программного обеспечения "Тестирования знаний обучающихся программированию".
дипломная работа [3,2 M], добавлен 11.09.2014Комплексное функциональное и структурное тестирование программного продукта - граф-программа решения квадратного уравнения. Постановка задачи структурного тестирования маршрутов. Заключение о типе и причине ошибки, предложение по ее исправлению.
курсовая работа [2,8 M], добавлен 05.01.2013Тестирование как составляющая часть процесса отладки программного обеспечения, его роль для обеспечения качества продукта. Обнаружение ошибок в программах, выявление причин их возникновения. Подходы к формулированию критериев полноты тестирования.
курсовая работа [1,6 M], добавлен 20.12.2012Описание исходных текстов программного продукта. Системные требования и установка программного продукта. Тестирование пользователя по двадцати вопросам указанной темы и сохранение результатов тестирования. Форма отображения результатов тестирования.
курсовая работа [2,8 M], добавлен 09.07.2013Проектирование базы данных, информационной подсистемы PLC-Tester, модуля тестирования и web-приложения. Разработка логической структуры программного продукта и общие требования к техническому обеспечению. Запуск программы и описание тестовых прогонов.
дипломная работа [3,2 M], добавлен 30.06.2011Выбор среды разработки программного обеспечения. Компьютерная система тестирования знаний в дистанционном обучении OpenTEST. Написание встроенного текстового редактора для расширенного форматирования текста. Руководство пользователя, структура программы.
дипломная работа [7,1 M], добавлен 20.05.2013