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

时间:2020-03-05 18:52:12  来源:igfitidea点击:

我开始学习如何使用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);
    }
}

因为每个测试都依赖于可以覆盖的create方法,并且由于该测试方法是从父测试类继承的,所以除非我们重写它们以更改预期的行为,否则将针对子类运行父类的所有测试。

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

回答

只要确保我们在这里没有遇到反模式。也许我们在构造函数中做了太多工作?也许这些实际上应该是不同的类?测试通常会为我们提供有关代码设计的线索。听他们说。