Защо поставяме log4 тестване на уеб приложения и Selenium блог от Deep Shift Labs
Без значение какъв лог формат искаме да използваме, PHPUnit може да каже само това:
. - Тестът е изпълнен успешноF - Твърдението е неуспешноE - Грешка по време на изпълнение на тестаS - Тестът е пропуснат (пропуснат)I - Тестът е маркиран като незавършен
За лицето, което извършва теста, това е напълно достатъчно.
Но ние не сме читатели, ние сме писатели.
От какво се нуждаят писателите? Те се нуждаят от обратна връзка от почти всеки ред код. Дали променливата е била инициализирана, дали функцията е върнала правилната стойност, към кой клон е отишъл скриптът - всичко това е интересно за писателя. За да задоволят този техен интерес, авторите на PHP екипа (скромно: т.е. аз) използват библиотеката log4php.
По принцип използването на log4php може да бъде полезно за човек, който просто изпълнява тест. Например, трябва да тествате някоя уеб страница. Тестването започва с проверка дали всички необходими елементи присъстват на страницата. Това може да се направи по два начина (по отношение на регистриране).
Метод 1, използвайки само регистрационни файлове на PHPUnit
Да приемем, че на тестваната страница липсват първият и третият елемент. Ето какво ще има в конзолата в резултат на теста:
C:\SimpleTest\PHP>phpunit simpleTest.php PHPUnit 3.3.9 от Себастиан Бергман.
Време: 15 секунди
Имаше 1 грешка:
1) testSimple(simpleTest) Елемент _element1_ не присъства Неуспешно потвърждаване, че е вярно. С:SimpleTestPHPsimpleTest.php:35
ПРОВАЛИ! Тестове: 1, Твърдения: 1, Неуспехи: 1.
Разглеждайки дневниците, можем да отбележим, че отсъствието на първия елемент е забелязано от теста, но околоняма да знаем, че няма и трети елемент, т.е. задачата за проверка на наличието на ВСИЧКИ елементи няма да бъде изпълнена.
Метод 2, използвайте log4php
Отново да предположим, че на тестовата страница липсват първият и третият елемент. В резултат на провеждане на теста при тези условия регистрационните файлове на конзолата ще изглеждат по следния начин:
C:\SimpleTest\PHP>phpunit simpleTest.php PHPUnit 3.3.9 от Себастиан Бергман. // два следващи реда log4php изход ГРЕШКА - Елемент _element1_ не присъства ГРЕШКА - Елемент _element3_ не присъства F // от тази точка PHPUnit изход
Време: 15 секунди
Имаше 1 грешка:
1) testSimple(simpleTest) Не всички елементи присъстват. Неуспешно потвърждаване, че това е вярно. C:SimpleTestPHPsimpleTest.php:52
ПРОВАЛИ! Тестове: 1, Твърдения: 1, Неуспехи: 1.
Виждаме, че при този подход тестът не се срива при първия ненамерен елемент, а само показва съобщение за него и задава флага $elementsPresent на FALSE. След като всички елементи са проверени, се проверява състоянието на флага и само тук, ако флагът не е TRUE, тестът е неуспешен.
Общо лицето, което е извършило теста, има информация за всички липсващи елементи, а не само за първия. Тук регистрационните файлове PHPUnit и log4php работеха заедно. PHPUnit изрази проблема като цяло (Не всички елементи присъстват), а log4php направи необходимите разяснения (ГРЕШКА - Елемент _element1_ не присъства и ГРЕШКА - Елемент _element2_ не присъства).
Така, след като прочетохме внимателно всичко написано по-горе, можем спокойно да кажем, че логовете на PHPUnit са добри, а заедно с log4php са още по-добри.
Само за информация, ще ви напомня, че TestNg, в допълнение към изхвърлянето на грешки в Asserts, ви позволява да пишете прости съобщения във вашите регистрационни файлове(тези в html форма), но той има този механизъм като пето колело на каруца. Можете да го използвате, но е неудобно.
как успяхте да хванете лошите действия в теста? Ако напиша:
Не мога да покажа TestErr на екрана ( Пише нещо като: Testing_Selenium_Exception: Отговорът на Selenium RC е невалиден: ГРЕШКА: E lement link=test not found
Като цяло, как да се уверите, че определена функция се извиква, когато тестването е неуспешно? Възможно ли е?
Болноглаво, Ако няма елемент с локатор "link=test", selenium->click() ще хвърли изключение. Следователно въпросът, разбира се, няма да стигне до реда с записа в дневника. Как можем да се справим с това? 1) преди да изпълните click(), проверете дали елементът присъства с isElementPresent(). 2) хваща генерираното изключение и го обработва.
Това са и отговори на въпроса за извикването на конкретна функция: за 1) трябва да я извикате, ако елементът не е намерен, за 2) - извикайте я в манипулатора на изключения.
Можете да видите как се обработват изключенията, като изтеглите PHP версията на тестовете от SVN тук: http://deepshiftlabs.com/svn/tests/trunk/salesforce/php. Във файла seleniumActions.php има много примери). Този клас съдържа само обвивки за методи на Selenium, които обработват прекъсвания.
Вариант s isElementPresent() не подоидет т.к. esli naprimer ne srabotaet funksia “open” v selenium, otlovit’ osibku ne udastsa(
Ето защо в seleniumActions.php всички методи на Selenium се извикват вътре в try<> блок. Това е най-надеждният начин, но isElementPresent() в описания по-горе случай ще ви позволи да хванете грешката и да разберете нейната причина, без да довеждате случая до изключения.
Колкото до TestListener - никога не сме работили с този клас, така че поне в близко бъдещевреме за писане на статия просто няма да работи.
Е, поне накратко опишете инсталирането на разширенията на класа може би?
Кои са Deep Shift Labs?
Игор Крилцов Сидни, АвстралияДмитрий Якубовски Катя Якубовски Александър Савченко Харков, УкрайнаВадим Чепков Лийзбърг, Вирджиния