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

StackOverflow https://stackoverflow.com/questions/58969

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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);
    }
}

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

По моему ограниченному опыту, это отлично сработало.

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top