PHPUnit中的测试用例类型

时间:2013-08-10 18:30:34

标签: php unit-testing phpunit

我是PHPUnit的新手,事实上我今天开始了。而且,据我所读,我开始只了解这个脚本的作用。

class UserTest extends PHPUnit_Framework_TestCase
{
     protected $user;

    // test the talk method
    protected function setUp() {
        $this->user = new User();
        $this->user->setName("Tom");
    }

    protected function tearDown() {
        unset($this->user);
    }

 public function testTalk() {
        $expected = "Hello world!";
        $actual = $this->user->talk();
        $this->assertEquals($expected, $actual);
    }

}

对于这堂课:

<?php
class User {
    protected $name;

    public function getName() {
        return $this->name;
    }

    public function setName($name) {
        $this->name = $name;
    }

    public function talk() {
        return "Hello world!";
    }
} 

好的,所以我已经确定测试会根据测试的相等性返回Ok / Fail语句,但是我正在寻找的更多。我需要一种实际的方法来测试一个更复杂的类,它的结果,在这个例子中不喜欢,不能轻易猜到。

说,我写了一个执行轮询的脚本。如果方法/类可以工作,我将如何测试或以何种方式测试?上面的代码只显示方法结果是否只有'Hello World'但是,这很容易测试,因为我需要测试复杂的东西,并没有太多的教程。

2 个答案:

答案 0 :(得分:7)

在单元测试中测试类应该不复杂。

这样做的原因是,在设计良好的系统中,您可以单独测试该类,并且不会在该类后面添加系统的复杂性 - 因为在测试期间该系统不存在,它被嘲笑了。

这方面的经典示例是User类通常会向数据库询问信息,但在测试用例中,该数据库实际上很难设置,准备数据并在之后销毁。使用真实数据库也会降低速度。因此,您将User类设计为从外部接受数据库对象,并在测试用例中为其提供数据库的模拟对象。

这样,从数据库中模拟各种返回值非常简单,另外,您可以检查数据库对象是否获得正确的参数,而无需处理真实数据库的复杂性。

如果您的类设计为允许依赖注入,则只能执行正确的模拟对象注入。这是一个原则,不在其他对象内创建对象,但需要外部世界提供它们。只需快速浏览一些视频即可获得解释:

请记住,创建好的测试需要一些经验。很适合你开始试验。

答案 1 :(得分:2)

  

但是,这很容易测试,因为我需要测试复杂的东西,并没有太多的教程。

测试越复杂,越复杂。这有点像蛇咬自己的结局。您通常希望防止这种情况,因此要做到这一点:编写简单的测试以确保测试并运行复杂的软件。

这并不总是100%有效,但它比没有测试更好。 PHPUnit专为单元测试(Xunit test patterns)而设计,但您也可以使用它来运行不同的测试。为此你分组测试。不同的人根据不同的事情做不同的事情。例如:

  1. 小测试
  2. 中等测试
  3. 大型测试
  4. 或(不等同于):

    1. 单元测试
    2. 集成测试
    3. 验收测试
    4. 或(或许等效TestPyramid):

      1. 单元测试
      2. 服务测试
      3. UI测试
      4. 什么不是。当你开始测试时,从单元测试开始并作为Sven already answered开始可能很好,保持简单。熟悉TDD,阅读一些幻灯片和书籍。欢迎来到自动化测试的世界。

        P.S。是的,简单的getter setter太容易测试了。如果所有的setter都存储到私有成员并且getter将其恢复,那么你可以相信PHP正在工作,为此编写测试是浪费时间并且只会导致失败。它清楚地表明有人在编写代码后编写了测试。而是首先编写测试并看到它失败(红色),然后尽可能快地将代码混合在一起以使测试通过(绿色)。您可以稍后在上改进代码,因为测试已经显示它正在运行。