за всеки елемент с behat или кодиране

Искам да тествам уебсайт, който има динамична структура на менюто. Искам да премина през всички елементи от менюто и да изпълня една и съща поредица от тестове на всяка страница. Говорим за 100+ страници, които се променят редовно.

Бих искал да направя това или с behat, или с кодиране.

Някой има ли идея как да стане това?


person Jeroen    schedule 11.05.2013    source източник


Отговори (2)


Когато използвате Behat с Mink, можете да вземете вашите елементи от менюто с findAll() и след това да го повторите:

/**
 * @When /^I run my test series for all menu items$/
 */
public function iRunMyTestSeriesForAllMenuItems() {

    $result = TRUE;
    $this->getSession()->visit('http://www.example.com/');
    $links = $this->getSession()->getPage()->findAll('css', '#menu ul li a');
    foreach ($links as $link) {
        $url = $link->getAttribute('href');
        if (FALSE === $this->yourTestHere($url)) {
            $result = FALSE;
        }
    }

    return $result;
}
person stmllr    schedule 13.05.2013
comment
Вместо да върнете true/false, би било по-добре просто да хвърлите изключение. Behat ще го третира като грешка на стъпката. - person Jakub Zalas; 05.06.2013

Имах подобен случай на употреба, при който исках да посетя всички страници от дадена карта на сайта, като се уверя, че няма мъртви връзки. Имах подход за динамично генериране на масив от стъпки, който след това се връща и обработва от Behat. Трябваше да добавя изкуствена стъпка „Отпечатвам страница“, за да съм сигурен, че мога да видя на конзолата коя страница е тествана в момента.

/**
 * @Then /^I should access all pages of site map "([^"]*)"$/
 */
public function iShouldAccessAllPagesOfSiteMap($selector) {

    $page = $this->getSession()->getPage();
    $locator = sprintf('#%s a', $selector);
    $elements = $page->findAll('css', $locator);

    $steps = array();
    foreach ($elements as $element) {
        /** @var \Behat\Mink\Element\NodeElement $element */
        $steps[] = new Behat\Behat\Context\Step\When(sprintf('I print out page "%s"', $element->getAttribute('href')));
        $steps[] = new Behat\Behat\Context\Step\When(sprintf('I go to "%s"', $element->getAttribute('href')));
        $steps[] = new Behat\Behat\Context\Step\Then('the response status code should be 200');
    }
    return $steps;
}

/**
 * @When /^I print out page "([^"]*)"$/
 */
public function iPrintOutThePage($page) {
    $string = sprintf('Visiting page ' . $page);
    echo "\033[36m    ->  " . strtr($string, array("\n" => "\n|  ")) . "\033[0m\n";
}

Тогава моят сценарий изглежда по следния начин:

Scenario: my website has no "dead" pages
Given I am on "/examples/site-map/"
Then I should access all pages of site map "c118"

Цялата същност е тук https://gist.github.com/fudriot/6028678

person Fabien    schedule 18.07.2013