我应该在BDD中使用正面和负面断言吗?

时间:2013-10-18 20:34:38

标签: php phpunit bdd phpspec

其中哪一个更好:

function it_should_return_number_of_string_provided()
{
    $this->add(1)->shouldReturn(1);
    $this->add(1)->shouldNotReturn(2);
}

function it_should_return_number_of_string_provided()
{
    $this->add(1)->shouldReturn(1);
}

即。我应该测试正面和负面结果吗?

3 个答案:

答案 0 :(得分:1)

在测试时,您应该测试边缘情况,失败案例和成功案例。

例如,假设我正在测试一个函数,该值对值1 - 10返回true,否则为false。我可能会运行以下测试,以确保我覆盖了所有基础。

OneToTenOrBust(1)    == true
OneToTenOrBust(5)    == true
OneToTenOrBust(10)   == true
OneToTenOrBust(0)    == false
OneToTenOrBust(11)   == false
OneToTenOrBust(-100) == false
OneToTenOrBust(100)  == false

测试0,1正在测试我的下界边缘情况。 10,11正在测试我的上界边缘情况。 5只是范围内的数字是真的。 -100测试负数。 100次测试正数超出范围。

对于像PHP这样的动态类型语言,您还要检查如果您的函数只能处理整数,那么您的函数也可以拒绝“错误类型”。

答案 1 :(得分:1)

每项测试只应断言一个期望。所以你可以写一下:

function When_add_one_number_should_return_one()
{
    $this->add(1)->shouldReturn(1);
}

function When_add_two_numbers_should_not_return_two()
{
    $this->add(1);
    $this->add(1)->shouldNotReturn(2);
}

测试函数名称现在更具表现力,即您可以从函数名称中推断出正在测试的内容。

另请注意,第二种方法现在只声明结果“shouldNotReturn(2)”。没有必要在前一行断言“shouldReturn(1)”,因为在上一次测试中已经断言了这个期望。

答案 2 :(得分:0)

您的测试应适用于不同的数字,以便您可以通过这种方式进行测试。

function it_should_return_number_of_string_provided()
{
    $randomValue = rand(1, 1000);
    $this->add($randomValue)->shouldReturn($randomValue);
}