Сеанс браузера в setUp (), tearDown (), нет для каждого теста? - PullRequest
6 голосов
/ 31 марта 2011

Ранее я написал несколько тестов на селен, используя ruby ​​/ rspec, и нашел его довольно мощным.Теперь я использую Selenium с PHPUnit, и я пропускаю несколько вещей, возможно, из-за неопытности.В Ruby / RSpec я привык определять «глобальные» настройки для каждого тестового случая, когда я, помимо прочего, открываю окно браузера и захожу на свой сайт.

Iчувствую, что здесь немного не хватает PHPUnit: 1) у вас есть только setUp() и tearDown(), которые запускаются до и после каждого отдельного теста, и что 2) кажется, что фактический сеанс браузера устанавливается между setUp() и тестирование, и закрытое до tearDown().

Это создает немного больше помех в самих тестах, поскольку вам явно нужно открыть страницу в начале и выполнить очистку в конце.В каждом тесте.Также кажется ненужным накладные расходы на закрытие и повторное открытие браузера для каждого теста вместо того, чтобы просто вернуться на целевую страницу.

Есть ли альтернативные способы достижения того, что я ищу?

Ответы [ 2 ]

8 голосов
/ 31 марта 2011

В прошлом я делал защищенный метод, который возвращает объект для сеанса, например:

protected function initBrowserSession() {
    if (!$this->browserSession) {
        $this->setBrowser('*firefox');
        $this->setBrowserUrl('http://www.example.com/');
        //Initialize Session
        $this->open('http://www.example.com/login.php');
        // Do whatever other setup you need here
    }
    $this->browserSession = true;
}

public function testSomePage() {
    $this->initBrowserSession();
    //Perform your test here
}

Вы не можете использовать функции setupBefore/AfterClass, поскольку они статические(и поэтому у вас не будет доступа к экземпляру).

Теперь, с учетом сказанного, я бы поставил под сомнение вашу мотивацию для этого.Имея тест, который повторно использует сеанс между тестами, вы вводите возможность побочных эффектов между тестами.Повторно открывая новый сеанс для каждого теста, вы изолируете его эффекты от результатов теста.Кто заботится о производительности (по крайней мере, в разумной степени) повторного открытия браузера?Это на самом деле увеличивает достоверность теста, поскольку он изолирован.Опять же, можно было бы что-то сказать для тестирования продолжительного сеанса.Но если бы это было так, я бы сделал это отдельным тестовым примером / классом для отдельного функционального теста ...

0 голосов
/ 29 мая 2012

Хотя я согласен с @ircmaxell в том, что, возможно, было бы лучше сбросить сеанс между тестами, я вижу случай, когда тесты переходят от нескольких минут к часам, просто чтобы перезапустить браузер.

Поэтому я немного покопался и обнаружил, что вы можете переопределить метод start () в базовом классе. В моей настройке у меня есть следующее:

<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';

class SeleniumTestCase extends PHPUnit_Extensions_SeleniumTestCase
{
    public function setUp() {
        parent::setUp();
        // Set browser, URL, etc.
        $this->setBrowser('firefox');
        $this->setBrowserUrl('http://www.example.com');
    }

    public function start() {
        parent::start();
        // Perform any setup steps that depend on
        // the browser session being started, like logging in/out
    }
}

Это автоматически повлияет на все классы, расширяющие SeleniumTestCase, поэтому вам не нужно беспокоиться о настройке среды в каждом отдельном тесте.

Я не проверял, но, вероятно, существует метод stop (), который также вызывается перед tearDown ().

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...