两个断言在同一单元测试方法中,如何制作?

时间:2013-10-30 18:12:55

标签: unit-testing

我开始使用单元测试。我有一个情况,不知道如何继续:

例如: 我有一个打开并读取文件的类。 在我的单元测试中,我想测试open方法和read方法,但要读取我需要先打开文件的文件。

如果“打开文件”测试失败,“读取文件”测试也会失败!

那么,如何明确表示读取失败因为打开?我在read ??

里面测试了open

3 个答案:

答案 0 :(得分:1)

单元测试的关键特性是隔离:一个特定的单元测试应该涵盖一个特定的功能 - 如果失败,它应该报告它。

在您的示例中,read显然取决于open功能:如果后者被破坏,则没有理由测试前者,因为我们知道结果。此外,报告read失败只会为您的测试结果添加一些无关的噪音。

在这种情况下,read可以(并且应该)报告的内容是test skipped或类似内容。这就是PHPUnit中的完成方式,例如:

class DependencyFailureTest extends PHPUnit_Framework_TestCase
{
    public function testOne()
    {
        $this->assertTrue(FALSE);
    }

    /**
     * @depends testOne
     */
    public function testTwo()
    {
    }
}

这里我们有testTwo依赖于testOne。这就是测试运行时显示的内容:

There was 1 failure:

1) testOne(DependencyFailureTest)
Failed asserting that <boolean:false> is true.
/home/sb/DependencyFailureTest.php:6

There was 1 skipped test:

1) testTwo(DependencyFailureTest)
This test depends on "DependencyFailureTest::testOne" to pass.

FAILURES!
Tests: 2, Assertions: 1, Failures: 1, Skipped: 1.

说明:

  

为了快速定位缺陷,我们希望我们的注意力集中在   相关的失败测试。这就是PHPUnit跳过执行的原因   当依赖测试失败时进行测试。

答案 1 :(得分:0)

打开文件是读取文件的先决条件,因此可以在测试中包含该文件。如果文件无法打开,您可以在代码中抛出异常。然后,测试中的错误消息将清楚地说明测试失败的原因。

我还建议您考虑在测试中创建文件以删除对现有文件的任何依赖性。这样您就可以确保始终有一个有效的文件来引用。

答案 2 :(得分:0)

一般来说,你不会发现自己测试你所建议的单元测试场景能否从文件中读取,因为你通常最终会使用某种文件操作库,并且通常可以安全地假设所述库的维护者已经有适当的单元测试(例如,我非常有信心可以在.NET中使用File类而不用担心)。

话虽如此,一个条件妨碍测试第二个条件的想法当然是有效的。这就是创建mock frameworks的原因,以便您可以轻松设置一个模拟对象,该对象将始终以定义的方式运行,然后可以替换初始依赖项。这使您可以专注于单元测试第二个对象/条件/等。在测试场景中。