Основи на функционалното тестване на единици на Simpletest

В тази статия ще говоря за основите на тестването в Drupal. След като прочетете, ще можете сами да напишете прост тест. За по-голяма яснота, в хода на статията ще бъде създаден модулsimpletest_example, който ще предостави тип съдържание, наречен simpletest_example, което не се различава от типовете история, страница и т.н., с които сме свикнали. След това ще бъде написан тест за този модул, който проверява правилността на работата му в различни ситуации.

Подготовка за тестване

Първо се уверете, че най-простият модул е ​​активиран. ВDrupal 7,най-простият модул е ​​част от ядрото. Може да се намери в списъка с модули, наречен Тестване. Той е деактивиран по подразбиране, така че не забравяйте да го активирате преди тестване. За да проверите дали simpletest работи, отидете наadmin/config/development/testing/settings.

Модулът, който ще бъде създаден в хода на статията, се използва в проекта Примери, нареченSimpletest Example, така че ако е необходимо, всички източници могат да бъдат намерени там.

Как работи Simpletest в Drupal

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

Много е важно да разберете, чевсяко изпълнение на теста създава напълно нова инсталация (обект, инсталация, каквото и да е) на Drupal, създадена специално за текущия тест. С други думи, без настройки, потребители, съдържание и т.н. при изпълнение на тестасъществува. Ако имате нужда от потребител с определени права по време на тестването, ще трябва да го създадете. Ако модулът трябва да бъде активиран, ще трябва да го активирате. Ако искате да използвате настройки, различни от стандартните, ще трябва да използвате инструментитеSimpletest за това. Файловата директория не съдържа никакви файлове, не са включени модули (с изключение на задължителните). Въпреки това,Simpletest съдържа набор от полезни методи, които ви позволяват бързо да създадете необходимата функционалност за тестване.

Кратко описание на модула Simpletest Example

МодулътНай-прост пример създава нов тип съдържание като страница или история, който съдържа заглавието и съдържанието на възела. Всъщност модулът не прави нищо друго, а ни дава възможност да демонстрираме тестване на създаването на съдържание.

Между другото, има малък бъг в този модул: потребителските права се обработват неправилно. По-точно, линия с право за редактиране на собствен материал от типsimpletest_example се обработва неправилно от функциятаsimpletest_example_access().В резултат на това потребителят, създаден по време на фазата на тестване, няма възможност да промени създадения материал. Въпреки това ще се върнем към това по-късно.

Какво ще тестваме?

Ако вече сте инсталирали модулаsimpletest_example, тогава можете да отидете на страницата за създаване на материали и да видите на живо какво трябва да се тества. За да направите това, отидете на разделаnode/add/simpletest-example. Там ще видите нещо подобно:

основи

На следващата екранна снимка стрелките показват какво точно ще се използва при тестването:

simpletest

Надявам се, че вече сте запознати с интерфейса на Drupal и няма да се налага да обяснявате какво ще се случи след товазапазване на материала. В противен случай едва ли ще можете да разберете следващите стъпки.

Създаване на тест за най-простия пример

Сега е време да създадете своя тест. За него обикновено се създава файл на принципаmodule_name.test, който се поставя в корена на модула. Между другото, модулътПрост пример вече съдържа този файл.

Когато добавяте тестов файл към модул вDrupal 7, ще трябва да го опишете винформационния файл на модула в секциятаfiles[]. В нашия пример тестовият файл се казва simpletest_example.test:

Ако добавите тестов файл към активиран модул, тогава ще трябва да изчистите кеша на Drupal, преди да бъде взет от системата. Можете да направите това на страницатаadmin/config/development/performance с бутонаClear all caches (изчистване на целия кеш).

Създаването на тест включва четири основни стъпки:

  • Създаване на структура (просто създаване на клас, наследен отDrupalWebTestCase )
  • Тествайте инициализацията със създаването на необходимите обекти и конфигурационни настройки
  • Създаване на модулни тестови методи
  • Разбиране на резултатите от теста, за да разберем защо тестът не работи така, както бихме искали. Както и установяване на грешки в теста (или модула).

Първо, трябва да наследим класа с нашия тест отDrupalWebTestCase :

За да бъде създаденият тест видим от уеб интерфейсаSimpletest, трябва да добавите методаgetInfo() към класа. Предоставя основна информация за създавания тест - име, описание и групата му (подобно на групата за модули, само че там е пакет).

Следва изключително важната функцияsetUp(). В него се извършва цялата подготовка за стартиране на работната версия на инсталацията.Drupal, така че тестът да работи както трябва в бъдеще. Когато пишете код в тази функция, първото нещо, за което трябва да помислите, е „Какво трябва да създам и включа, за да могат моите тестове да се изпълняват правилно?“. В нашия случай трябва да направим три неща:

  • Активиране на модулНай-прост пример
  • Създайте потребител с достъп за създаване на материал от типsimpletest_example
  • Упълномощаване на създадения потребител

Извършваме всички тези действия в методаsetUp() :

Забележка: в Drupal 6 трябва да активирате всички модули, от които зависи модулът, от който се нуждаем. В седмия Drupal тези модули ще се включват автоматично.

Създаване на тест: Добавяне на материал

Сега трябва да създадем специален метод, който съдържа тест за модула. За да направим това, ние просто добавяме метод към нашия клас, който съдържа набор от инструкции за тестване.

Първият ни тест ще създаде нов възел от типsimpletest_example с помощта на формуляра на страницатаnode/add/simpletest-example :

drupalPost, drupalGet и методи за вмъкване (утвърждения)

Кодът по-горе прави доста просто подаване на формуляр от страницатаnode/add/simpletest-example. Първо, той подготвя масив от полета със стойности на формуляра (заглавието и съдържанието на материала) и след това просто го изпраща с помощта на метода POST, като показва кой бутон на формуляра трябва да бъде натиснат. Този метод е много подобен по принцип на drupal_form_submit() (за тези, които са срещали).

Повечето тестове се създават по следния модел:

  • С помощта на drupalGet() отиват на желаната страница или с помощта на drupalPost() извършват манипулации с формуляри
  • Направете едно или повече вмъквания, за да сравните какъв е резултатът с каквотрябваше да се случи

$this->drupalGet($path) : Просто навигира до страница$path.

$this->drupalPost($path, $edit_fields, $submit_button_name) : взема формуляр от страницата$path, попълва полетата му със стойности от$edit_fields и симулира натискане на бутона$submit_button_name.

Сега относно вложките. Има десетки различни видове вложки. Най-простият е$this->assertText($text_to_find_on_page). Няма да ги изброявам всички - можете да прочетете за тях сами.

Потребители и среда на ядрото

Simpletest превключва потребителя към потребителя с uid 1 (superadmin) по време на тестване и също така гарантира, че превключва правилно обратно. Така че не е нужно да се притеснявате за уязвимости в сигурността на вашия сайт.

Стартиране на най-простия уеб интерфейс

Сега трябва да изпълним теста. Тук ще използваме уеб интерфейса.

Отидете на страницата с настройки за тестване/admin/config/development/testing. Тук ще видите два раздела - Списък и Настройки. В първия раздел има списък с налични тестове, а във втория раздел има настройки на тестовата среда.

Сега се интересуваме от първия раздел. Изберете току-що създадения тест (той ще бъде в групата Примери) и щракнете върху бутонаИзпълни тестове. Може да се наложи да изчистите кеша си, преди да видите теста си в списъка.

След провеждане на теста ще видите резултатите от преминаването на тестовете по модула.

Тестовете могат да се изпълняват и от командния ред. Повече информация за това ще намерите тук.

Пример за тест, който ще се провали

Нека да разгледаме пример за тест, който би довел до неуспех.

Работата все още продължавав рамките на същия клас. Този път обаче ще се опитаме да тестваме редактирането на възли. Както казах, има грешка в модула - неправилно обработва ред с потребителски достъп за редактиране на собствени материали. Следователно потребителят няма да може да ги редактира. В този тест ще създадем материал и ще се опитаме да го редактираме:

Тестване на единици

Тестването, което беше обсъдено по-рано, се нарича функционално. НоSimpletest предоставя алтернатива на класаDrupalWebTestCase, класаDrupalUnitTestCase. Този тип тестване се нарича тестване на единици.

Таблиците на базата данни и файловите директории не се създават, когато се инициализира модулно тестване. Това му позволява да работи по-бързо от функционалното тестване. Това обаче означава, че той няма достъп нито до базата данни, нито до файловете. Извикването на която и да е функция на Drupal, която съдържа извикване на база данни, ще доведе до грешка. Това се отнася дори за такива общи функции катоwatchdog(),module_implements(),module_invoke_all() и т.н.

Можете да прочетете повече за този тип тестване в статията за модулно тестване със Simpletest.

Прости тестове за отстраняване на грешки

Можете също така да използвате метода$this->verbose("some message"), за да отпечатате информация за отстраняване на грешки на екрана при тестване.

За повече информация относноdebug() и$this->verbose() вижте Отстраняване на грешки в Drupal 7.