5 апреля 2015 г. 16:32:03

Охота на баги автотестами или что хотелось бы знать изначально

Учебные приложения и выполнение домашних заданий к ним – написание автотестов на питоне и джаве – хорошо, но очень уж мало. Тогда мне казалось, что очень даже не мало, и что там сложного строить тесты, да еще и с автокомплитом в эклипсе. Кое-что не давало мне покоя. И это кое-что – баги, точнее их отсутствие в разбираемых примерах. Если домашка выполнена правильно, то тесты зеленые, иначе  проблема в самих тестах.

Я понимаю, что автотесты окупаются, если многократно запускаются, и что хорошо покрыть ими регрессию, как более стабильный участок. Но столько строчек кода, а проблемы могут найтись только в самих автотестах? 

Поскольку моя цель звучит как научиться использовать новый инструмент и «нанести им пользу», оставалось только выбрать жертву-приложение и начать действовать. Под горячую руку попал уже упоминавшийся в записях про нагрузочное тестирование опенсорсная блог-платформа Ghost.  

«Призрак» понравился своей кажущейся простотой. Я как раз ожидала новой волны информации и практических работ из универа, и считала копание с автотестами поздними вечерами после пар замечательной отдушиной. Если б не они, то некоторые пары по программированию были б гораздо тяжелее, чем они есть(требования растут гораздо быстрее, чем растет средний уровень в группе, да что там, первый семестр за 3й курс оставил группу поредевшей).

Итак, выбор был сделан, а для создания тестов взята уже знакомая связка selenium-Java-testNG-maven-eclipse. Да простит меня блог, названный в честь питона, за выбор джавы. Я не обладаю достаточной компетенцией, поэтому лично для себя, чтобы никто не видел, составила сравнительную табличку своих впечатлений от написания тестов на обоих языках для одного приложения. Затем поставила оценки и с перевесом в полбалла победил не питон. Сейчас понимаю, что надо было ее выбирать, поскольку в этом семестре мне нужны C, Java и C#, а так не придется слишком переключаться из одного контекста в другой.

Чтобы упростить себе задачу, взяла пустую заготовку от учебного проекта. Оставалось продумать, какие сущности, согласно ООП, PageObject  и здравого смысла, мне понадобятся. Поэтому открыла  приложение и составила простейшую майндкарту , чтобы уже на ее основе писать тесты.


 
Рис. 1 Первый набросок в тот памятный вечер



На этом моменте не могу удержаться и не вспомнить притчу про мудреца и уже юнит-тесты, услышанную на видео из Школы автоматизации процессов разработки (Яндекс).  

“Ранним утром программист спросил великого мастера:
— Я готов писать модульные тесты. К какому покрытию кода я должен стремиться?
Великий мастер ответил:
— Не переживай о покрытии, просто пиши хорошие тесты.
Программист улыбнулся, поклонился и ушел.

Немного времени спустя другой программист задала этот же вопрос. Великий мастер указал на котел с кипящей водой и сказал:
— Сколько зерен риса я должен положить в этот котел?
Программист с озадаченным видом ответила:
— Как я могу ответить наверняка? Все зависит от того, сколько людей вам надо накормить, насколько они голодны, какие еще блюда вы подаете, сколько риса у вас есть и от многого другого.
— Совершенно верно. — сказал великий мастер.
Второй программист улыбнулась, поклонилась и ушла.

В конце дня пришел третий программист, и задал тот же вопрос о покрытии кода:
— Восемьдесят процентов и ни строчкой меньше! — строго ответил мастер ударяя кулаком по столу.
Третий программист улыбнулся, поклонился и ушел.

После этого ответа, к великому мастеру подошел молодой ученик:
— Великий мастер, сегодня я подслушал, как вы дали три разных ответа на один и тот же вопрос о покрытии кода. Почему?
Великий мастер встал со стула:
— Пойдем со мной возьмем свежезаваренного чая и поговорим об этом. “

Объяснение Мастера можно прочитать здесь

Дальше, казалось, все просто, главное начать. Первый совет из притчи как раз для меня.

Для удобства использовался git, который оценила и не представляю жизни без него.

Чтобы ускорить запуск тестов из консоли, команда для запуска тестов в хрома  «mvn test –P chrome-local»   и сопутствующие шаги к директории с проектом были превращены в bash-скрипт, и вызывались из любого места командой «mtch» через консоль. 

Примечание: Позаботиться об окружающей среде. Как раз переехала на планшет и оценила удобство ввода 4 символов с экранной клавиатуры вместо команды целиком.

И началось веселье :). Оказалось, что в приложении айдишники генерируются динамически, из плагинов браузера (Firebug, Firepath) больше надежды на «Copy CSS path» (затем вырезав участки с id)  в Firebug, чем на xpath  в Firepath.
Также столкнулась с элементами, которые видны,  а их поиск возвращают пустоту вместо текста. 

Сами тесты получались очень хрупкими, несмотря на стратегически правильные ожидания наступления конкретного условия и т.д. Их часто преследовали NoSuchElementException  за ручку с TimeoutException. 

Как они могут дать хоть какую-то уверенность, что, например, форма авторизации работает как нужно, если сами падают?

Но на все нашлась управа, спасибо stackoverflow и мои предшественниками, задававшим волнующие  и меня вопросы, и добрым людям, не поленившимся подробно на них ответить.

К тому времени я завела в экселе чеклист, который следовало превратить в автотесты. Поняла, какая простыня из тестов получается, и что мне уже не захочется в них лишний раз лезть... скормила автотестам сам чеклист при помощи Data Provider.

С одной стороны, занимаешься интересным занятием – составляешь чеклист как положено, с вводными данными и ожидаемым результатом, а с другой стороны, вспоминаешь былые времена за экселем во время такой мелочи как перекидывании тестов на отдельные вкладки книги при помощи vlookup (чтобы ничего не потерять), группируя по ожидаемым результататам. И с третьей стороны, это используется автотестами прямо в том же виде.

Примечание: Пустые значения влукап тянет как 0. Убедиться, что файл доступен для чтения, выполнения, записи. Не забыть закрыть файл перед его использованием в тестах.

Тесты начинают упрямо падать. Поэтому важно в ассерты добавлять сообщение, выводимое в случае падения теста и предусмотреть добавление в него информации об использованных вводных данных. Иначе получится, что тест зафейлился потому что ожидал [true], а получил [false]. И ищи потом на котором из пунктов чеклиста возникла проблема. 

Примечание: Специально отучать себя следить за выполнением тестов, ведь наблюдать подобный «мультик» реально только при малом количестве тестов. В случае падения теста информации должно быть достаточно, чтобы сразу воспроизвести и завести баг.

И вот тесты упали. И не потому что нестабильные или ищут что-то не то.

Оказывается, разрешено использование почты, содержащей спецсимволы, а при приглашении пользователя с почтой в  кириллице проблема с кодировкой доменной части.

Совсем мелочь, но приятно.

Автотесты начали наносить пользу.  :)

И они нашли это используя чеклист. Так что,  чем лучше чеклисты – эффективнее ловля багов автотестами.

blog comments powered by Disqus