Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 使用PHPUnit对具有多个用户类型的网站进行单元测试的最佳方法_Unit Testing_Types_Phpunit - Fatal编程技术网

Unit testing 使用PHPUnit对具有多个用户类型的网站进行单元测试的最佳方法

Unit testing 使用PHPUnit对具有多个用户类型的网站进行单元测试的最佳方法,unit-testing,types,phpunit,Unit Testing,Types,Phpunit,我开始学习如何使用PHPUnit来测试我正在开发的网站。我遇到的问题是,我定义了五种不同的用户类型,我需要能够用不同的类型测试每个类。我目前有一个用户类,我想将其传递给每个函数,但我不知道如何传递该类或测试可能返回为正确与否的不同错误 编辑:我应该说。我有一个用户类,我想把这个类的不同实例传递给每个单元测试 如果您想测试实际的UI,可以尝试使用Selenium(www.openqa.org)之类的工具。它允许您用PHP编写代码(我假设它可以与phpUnit一起使用)来驱动浏览器 另一种方法是使用

我开始学习如何使用PHPUnit来测试我正在开发的网站。我遇到的问题是,我定义了五种不同的用户类型,我需要能够用不同的类型测试每个类。我目前有一个用户类,我想将其传递给每个函数,但我不知道如何传递该类或测试可能返回为正确与否的不同错误


编辑:我应该说。我有一个用户类,我想把这个类的不同实例传递给每个单元测试

如果您想测试实际的UI,可以尝试使用Selenium(www.openqa.org)之类的工具。它允许您用PHP编写代码(我假设它可以与phpUnit一起使用)来驱动浏览器


另一种方法是使用一个通用方法,每个测试可以为不同的用户类型调用该方法。例如,类似于“ValidatePage”的东西,您可以从TestAdminUser或TestRegularUser调用它,让该方法简单地执行与预期相同的基本验证。

如果您的各种用户类继承自父用户类,那么我建议您对测试用例类使用相同的继承结构

考虑以下示例类:

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);
    }
}
您可以对测试用例类执行以下操作:

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方法,并且因为测试方法是从父测试类继承的,所以父类的所有测试都将针对子类运行,除非您重写它们以更改预期的行为


这在我有限的经验中非常有效。

请确保您没有在这里遇到反模式。也许你在构造器里做了太多的工作?或者这些应该是不同的班级?测试通常会为您提供有关代码设计的线索。倾听它们