Автоматизацията е неизменна част от работата на всеки QA. Често обаче при поддръжката на тестове се проявяват затруднения от различен тип. В настоящият пост, ще бъде описано решение на един от проблемите, а именно невъзможността след дадено изпълнение на тестове, да се преизпълнят само неуспешно изпълненитe. Описаното решение може да бъде използвано за тестове, изпълнявани от Jenkins job с MSTest.

Проблемът – причини да искаме да изпълним само фейлващите тестове

При поддръжката на голямо количество тестове, често се налага да пожелаем да изпълним само тези, които не са минали успешно при автоматичното изпълнение. Какви са някои от често срещаните причини за това:

– Промяна по фунционалност – пропуснали сме да оправим някой метод, докато е разработвана или променяна фунционалността. Оправяме си метода, но не искаме да изпълняваме всички тестове, а само тези, които са били провалени в следствие на тази промяна.

– Временно недостъпна 3rd party система – за автоматизиране на end-to-end сценарии, както и в други случаи тестовете, както и самият application зависят от 3rd party системи. Ако тестовете се изпълняват, докато тази система е down, ще има определен брой неминаващи тестове, без да има проблем с application-a, който реално се тества. И в този случай, след оправяне на 3rd party системата, не бихме искали да изпълняваме всичките си тесове.

– Нестабилни тестове – най-доброто решение на този проблем е пренаписване на такъв тип тестове, но при невъзможност това да се случи към момента, също би било хубаво да имаме възможност да преизпълним само фейлващите тестове.

Решението

Решението, което е описано по-долу е използвано за ре-рънване на тестове, които се изпълняват от Jenkins job. Това е и причината то да бъде пряко обвързно с него.

Сетъпът е следния: Jenkins job, който само изпълнява тестове от DLL-ки с тестове с MSTest.

Плъгини, които е необходимо да бъдат инсталирани в Jenkins: Environment Injector, Managed scripts, MSTest.

За да бъде възможно да се изпълняват само фейлналите тестове от job, се използва Powershell script, който извиква Jenkins API-то. От него  се взимат само тестовете с резултат failed, error или unstable и се подават на MSTests, за да изпълни само тях.

Ето го и самият сетъп:

Къде ще се съхранява скрипта е въпрос на практика в екипа. В описания случай, го съхраняваме в Managed Powershells на Jenkins.

След като е добавен Powershell скрипта в Jenkins, всеки job, който ще рерънва тестове трябва да бъде настроен по следния начин:

1. Добавя се един текстов параметър „RunFailedTestsOnly“. Неговата дефолтна стойност се сетва на „false“, за да може по дефолт job-a да изпълнява всички тестове.

2. В Build секцията на job-a се добавя Execute managed powershell стъпка ( за да има такава стъпка е необходимо да се инсталира плъгина Managed scripts). В дроп-дауна се избира създадения powershell script и се дефинира аргумент със следната стойност: http://{Jenkins_Server_Url}/job/$JOB_NAME/lastCompletedBuild/testReport/api/json, където  {Jenkins_Server_Url} e URL-a на Jenkins server-a. Както се забелязва, това е пътя към последното изпълнение на job-a. За да се изпълнят фейлналите тестове от конкретен build, на мястото на „lastCompletedBuild“ трябва да се напише номера на съответния билд.

3. След нея се добавя Inject Environment variable стъпка (достъпна от Environment Injector плъгина). Стойността, която й се сетва е “command“.

4. Добавя се Execute windows batch command със следната команда:

При следващото изпълнение на job-a, ще бъде видим параметъра „RunFailedTestsOnly“.  При стойност ‘ Yes“,  ще се изпълнят само фейлналите тестове от последното изпълнение на джоба. При стойност „No“, ще се изпълнят всички тестове.

Забележка: Ако последното изпълнение на джоба е фейлнало поради причина, различна от фейлнали тестове, изпълнението само на фейлнали тестове ще изгърми с грешка, че не са намерени тестове за изпълнение.

С какво да внимаваме при използването на описания подход

Преди да се ре-ръннат тестовете е важно да сме сигурни, че няма да замаскираме проблем, който не се проявява всеки път, т.е да сме проверили каква е била причината да не минат.

Възможно ли е да се направи за nunit

В описаното решение са използвани MSTest команди. При преработка на скрипта, с използването на съотвените NUnit команди и посочване на правилните места с резултатите от тестовете, няма да има проблем да се използва и за тестове, които се изпълняват с NUnit.

Полезни ресурси

Запознаване с Powershell

Как да изпълняваме тестове с MSTest през command line

Jenkins плъгини:

https://wiki.jenkins.io/display/JENKINS/EnvInject+Plugin

https://wiki.jenkins.io/display/JENKINS/MSTest+Plugin

https://wiki.jenkins.io/display/JENKINS/Managed+Script+Plugin


Автор:

Ива Андонова

>>> В моемнта Ива Андонова е Senior QA Engineer в Progress Software.
>>> Занимава се с тестване от около 10 години.
>>> Интересно събитие от биографията ѝ е участието ѝ в Software Testing World Cup Europe 2016, където заедно с отбора ѝ са завършили на 11-то място.
>>> В свободното си време обича да си почивам в планината, разхождайки се или карайки ски.
>>> Българските народни танци, както и експериментирането с приготвяне на десерти без захар, също са ѝ страст.


Стани част от потребителските групи на DEV.BG. Абонирай се и ще ти изпращаме информация за всичко, което предстои в групата.

Визия: Личен архив

Прочети още:

Share This