PHPUnit如何测试两个条件

时间:2013-06-22 22:52:09

标签: php unit-testing phpunit

我是使用PHPUnit的新手,我发现使用assertEquals函数测试是否需要给定值很容易,但我不确定如何测试具有多个条件的值,例如:

function myFunction($foo, $bar, $baz)      
{
    if (($foo != 3) AND ($foo != 5)) {
       // something
    }

    if (($bar < 1) OR ($bar > 10)) {
      // something
    }

    if ( (strlen($baz) === 0) OR (strlen($baz) > 10) ) {
      // something
    }
}

有人可以帮忙解决如何为这些条件编写单元测试吗? 感谢您的帮助

2 个答案:

答案 0 :(得分:4)

您应该为应用程序中每个方法/函数的每个可能路径创建一个测试用例。在您的示例中,第一个条件有两种可能的情况,当$ foo不同于3且不同于5且$ foo等于3或5.因此,首先应创建两个测试用例:

<?php
class YourClassTest extends PHPUnit_Framework_Testcase
{
    public function test_when_foo_is_different_to_three_or_five()
    {
        $this->assertEquals('expected result when foo is different from 3 or 5', myfunction(1));
    }

    public function test_when_foo_is_equal_to_three_or_five()
    {
        $expected = 'expected result when foo=3 or foo=5';
        $this->assertEquals($expected, myfunction(3));
        $this->assertEquals($expected, myfunction(5));
    }
}

现在你应该对其余的条件和排列做同样的事情。然而你通过意识到myfunction()方法做了太多事情并且很难测试和理解你做了一个很好的发现所以你应该将所有条件移动到不同的方法并单独测试它们,然后使用myfunciton()来调用它们如果你绝对需要,那就是所需的订单请考虑以下方法:

function myFunction($foo, $bar, $baz)      
{
    doSomethingWithFoo($foo);    
    doSomethingWithBar($bar);
    doSomethingWithBaz($baz);
}

function doSomethingWithFoo($foo)
{
    if (($foo != 3) AND ($foo != 5)) {
       // something
    }
}

function doSomethingWithBar($bar)
{
    if (($bar < 1) OR ($bar > 10)) {
      // something
    }
}

function doSomethingWithBaz($baz)
{
    if ( (strlen($baz) === 0) OR (strlen($baz) > 10) ) {
      // something
    }
}

通过这种重构,测试将对您有所帮助。希望这有助于您澄清一点。

答案 1 :(得分:3)

assertThat方式

获取战利品