четверг, 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 инженерам, как пригодилась бы мне раньше :)

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

четверг, 21 января 2016 г.

Размышления о карьере QA инженера

Стратоплан выпустил новые бесплатные лекции "Архитектор карьеры":
http://s.stratoplan.net/career-architect-special-offer/index_alt.html

Есть спорные моменты, конечно, но есть и правильные мысли.
Делюсь ссылкой так как очень рад что эти ребята иногда делают бесплатные курсы и вебинары по актуальным темам и рассказывают обо всём достаточно просто.

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

пятница, 1 января 2016 г.

Китайский для тех кто его совсем не знает - или как перевести новогодние поздравления :)

Сегодня пытались перевести пару фраз на китайском - пожелания / предсказания на 2016 год и оказалось что для этого есть отличный ресурс в Интернете:


Он поддерживает функцию рисования и распознавания иероглифов! :) и она работает, я смог найти все иероглифы, которые были в пожелании, правда перевод ни на этом сайте, ни в гугле не дал особых результатов, но, как минимум, символы распознаны и я могу вставить их в пост:

友妤的建议

А это уже даёт возможность использовать электронные переводчики, форумы и прочее :)

Непредвиденная ошибка с кодом ()

Вот и наступил новый год, а пару дней назад по случаю праздников мы заказывали пиццу в разные локации, и, похоже, заказать пиццу в Москве или Саратове можно без проблем, а вот в Харькове при оплате заказа картой онлайн на сайте одной из пиццерий уже как минимум пол года воспроизводится ошибка - вместо сообщения об успешной оплате заказа сайт радостно сообщает, что произошла неизвестная ошибка с кодом (). Пицца при этом приходит, но вот ты подтвердил оплату и получил подтверждение списания со счёта, а вместо подтверждения оплаты заказа получаешь "неизвестную ошибку" и думаешь придёт тебе заказанный товар или нет.

Написал им сообщение с описанием проблемы, надеюсь поправят.

В Тамбове вообще не обнаружилось пиццерий, которые позволяют оплачивать заказы пластиковыми картами через сайт - только наличными курьеру :)

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

Почему большинству хватает быть не хуже чем другие, и что заставляет немногих из нас становиться с каждым днём лучше чем мы были вчера?