Лучший способ модульного тестирования сайта с несколькими типами пользователей с помощью PHPUnit - PullRequest
3 голосов
/ 12 сентября 2008

Я начинаю изучать, как использовать PHPUnit для тестирования сайта, над которым я работаю. Проблема, с которой я сталкиваюсь, заключается в том, что у меня определены пять разных типов пользователей, и мне нужно иметь возможность тестировать каждый класс с разными типами. В настоящее время у меня есть пользовательский класс, и я хотел бы передать его каждой функции, но я не могу понять, как передать это или проверить различные ошибки, которые могут возвращаться как правильные или нет.

Редактировать: Я должен был сказать. У меня есть пользовательский класс, и я хочу передать разные экземпляры этого класса для каждого модульного теста.

Ответы [ 3 ]

2 голосов
/ 15 сентября 2008

Если ваши различные пользовательские классы наследуют от родительского пользовательского класса, то я рекомендую вам использовать ту же структуру наследования для классов тестового примера.

Рассмотрим следующие примеры классов:

class User
{
    public function commonFunctionality()
    {
        return 'Something';
    }

    public function modifiedFunctionality()
    {
        return 'One Thing';
    }
}

class SpecialUser extends User
{
    public function specialFunctionality()
    {
        return 'Nothing';
    }

    public function modifiedFunctionality()
    {
        return 'Another Thing';
    }
}

Вы можете сделать следующее с вашими классами теста:

class Test_User extends PHPUnit_Framework_TestCase
{
    public function create()
    {
        return new User();
    }

    public function testCommonFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('Something', $user->commonFunctionality);
    }

    public function testModifiedFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('One Thing', $user->commonFunctionality);
    }
}

class Test_SpecialUser extends Test_User
{
    public function create() {
        return new SpecialUser();
    }

    public function testSpecialFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('Nothing', $user->commonFunctionality);
    }

    public function testModifiedFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('Another Thing', $user->commonFunctionality);
    }
}

Поскольку каждый тест зависит от метода create, который вы можете переопределить, и поскольку методы теста наследуются от родительского класса теста, все тесты для родительского класса будут выполняться для дочернего класса, если вы не переопределите их для изменения ожидаемое поведение.

Это отлично сработало в моем ограниченном опыте.

1 голос
/ 17 сентября 2008

Просто убедитесь, что вы не столкнетесь с анти-паттерном здесь. Может быть, вы слишком много работаете в конструкторе? Или, может быть, это на самом деле разные классы? Тесты часто дают вам подсказки о дизайне кода. Слушайте их.

1 голос
/ 12 сентября 2008

Если вы хотите проверить реальный пользовательский интерфейс, вы можете попробовать использовать что-то вроде Selenium (www.openqa.org). Он позволяет вам писать код на PHP (который, как я предполагаю, будет работать с phpUnit) для управления браузером ..

Другой подход заключается в том, чтобы иметь общий метод, который может вызываться каждым тестом для вашего другого типа пользователя. то есть что-то вроде «ValidatePage», которое вы могли бы затем вызвать из TestAdminUser или TestRegularUser и чтобы метод просто выполнял ту же базовую проверку того, что вы ожидаете.

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