пятница, 4 августа 2017 г.

Новый блог :)

Так как последнее время в свободное время я активно занялся разработкой Android игр, то решил завести блог, в котором я буду записывать какие-то ценные для себя мысли и идеи, а так же публиковать анонсы моих новых игр :)

Вот новый блог (вдруг кому будет интересно подписаться и читать :) ):
https://xwizard-mobile-games.blogspot.ru

четверг, 20 июля 2017 г.

PyTest: красивые имена тестов в репортиках

Последнее время довольно много приходится работать с PyTest, и несколько месяцев назад я написал небольшой кусочек кода, который позволяет переопределять имена тест кейсов через doc strings к ним.

Зачем это нужно?

Когда показываешь отчет о проделанном тестировании человеку, который не занимается запуском и написанием тестов, то имена тестовых сценариев им не говорят ни о чем, и выглядит такой отчет очень неаккуратно (он же автосгенерирован на основе кода).

Еще одним минусом является то, что очень сложно определить по такому отчету то, какие кейсы уже покрыты, а какие еще нет - так и хочется залезть в код функции теста, чтобы в этом разобраться.
Когда же у нас есть возможность описать тестовый сценарий в подробном doc string применяя обычные предложения на английском - у нас есть полная свобода в описании тестового сценария, и это описание можно импортировать в чек листы, в отчеты, в баг репорты и куда угодно еще.

Как было - список тестовых сценариев (пример запуска pytest --collect-only):

Как стало - список тестовых сценариев (пример запуска pytest --collect-only):

вторник, 18 июля 2017 г.

Дополнительные проверки не помешают

Сегодня мне довелось пользоваться супер продвинутым сканером безопасности (название и создатели которого останутся за NDA). Сканер реально крут.

Разобрался с параметрами, создал тестовый стенд, запустил сканер - задача на сканирование ушла в in progress и можно идти пить кофе - красота!

Вот кофе закончился - проверяем результаты сканирования.

Сканер радостно сообщает мне, что "все проверено, ни одной уязвимости не найдено!". На страничке с репортом даже вставлена прикольная смешная картинка чтобы порадовать пользователя:



Что еще нужно, да? :)

Написал разработчикам сканера - спросил как бы мне посмотреть детальный репорт - что проверялось, что отвечал сервер...

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

Так что проверяйте и перепроверяйте. Даже если кажется что все "проверено" и "работает"... ;)

Интересное наблюдение - в данном случае у меня стригерилась в голове моя любовь к циферкам - захотелось посмотреть сколько же тестов пройдено и что они там писали в логах.

И да, я оказался первым, кто вообще захотел это проверить... и вот это уже наводит на мысли о том как устроено человеческое сознание - "нет проблем" и веселая картинка, которая выключает системное мышление - и человек не копает глубже, интересно, да? :)

среда, 22 марта 2017 г.

Python joblib и GIL: ретроспектива после сессии дебага

Есть такая отличная библиотечка для параллелльного запуска одной функции с разными параметрами в параллельных потоках - joblib.

Сегодня я столкнулся с тем, что некоторые библиотечки питона могут быть зависимы от логики GIL, из-за чего при параллельном выполнении метода вы можете получать System Error: broken pipe, хотя тот же код в один поток будет работать.

В моем случае все осложнялось ещё и тем, что код, который падал, был внутри фикстуры для автоматических тестов, запускаемых с pytest. И без pytest проблема не воспроизводилась, а дебажить работу функции, запускаемой через joblib.Parallel внутри pytest фикстуры это то ещё удовольствие.

Самое печальное это то, что несколько часов поиска в Интернете не давали ничего вменяемого, как будто с этой проблемой никто не сталкивался раньше, поэтому я решил написать эту статью, чтобы, если кто-то ещё столкнется с подобной проблемой, она могла вас навести на правильное решение.

Решение кроется в использовании альтернативного метода для параллельного запуска кода - multi-threading, который, конечно же, зависит от GIL, но и ваш код не падает, как в случае с multiprocessing.

Чтобы намекнуть joblib использовать multi-threading, вам необходимо указать параметр backend=“threading”, вот так:
from joblib import Parallel, delayed

results = Parallel(n_jobs=200, backend='threading')(
                delayed(your_function)(i, parameter2)
                for i in xrange(10000))
Здесь results будет содержать список возвращаемых функцией your_function значений, your_function - функция, которую мы запустим в 200 тредов, i и parameter2 - параметры, которые будут переданы в качестве аргументов функции your_function (они не обязательные, просто как пример). Значение n_jobs определяет количество тредов, которое будет создано для запуска функции, backend='threading' сообщает интерпретатору что надо создавать именно треды, а не отдельные процессы.

Подробнее об этой библиотечке и этом параметре можно почитать здесь: http://pythonhosted.org/joblib/generated/joblib.Parallel.html

вторник, 7 февраля 2017 г.

Подборка материалов для подготовки к QA Interview (QA, Automation & Python, Linux & Networks)

Всем привет,

как и многие технические специалисты и менеджеры, я проходил и проводил множество технических интервью на позицию QA Engineer / QA Automation Engineer / Software Engineer In Testing и пр., каждая компания называет это по-своему.

Сегодня решил выложить свою подборку ссылок на интересные статьи, позволяющих быстро (за несколько дней) освежить в памяти то, что может пригодиться для прохождения технического собеседования на позицию QA Engineer / QA Automation Engineer.

Когда я сам готовился к прохождению технического интервью, мне помогали похожие статьи (например, эта и эта), но эти статьи были преимущественно ориентированны на разработчиков, поэтому я надеюсь что данная статья будет полезна многим QA инженерам, как пригодилась бы мне раньше :)

Темы, которые надо выучить, чтобы просто не выглядеть неучем (и не только не выглядеть, но и не быть им):