单元测试:特定测试和控制流程

问题描述 投票:0回答:2

我对单元测试和一般的测试还很陌生。我正在使用phpUnit进行开发,但是由于我的问题更笼统/是设计问题,因此实际环境不应该太重要。

我认为,写一个尽可能具体的测试用例是一种好习惯。例如(越晚越好):

assertNotEmpty($myObject);              // myObject is not Null 
assertInternalType('array', $myObject); // myObject is an array
assertGreaterThan(0, count($myObject)); // myObject actually has entries

如果正确,这是我的问题

如果要测试的对象的状态取决于外部源(即DB)-甚至一般而言,在测试用例中编写一些流控制是一种可接受的做法吗?

赞:

if (myObject !== null) {
    if (count(myObject) > 0) {
    // assert some Business Logic
    }
    else {
    // assert some different Business Logic  
    }
} 

是在测试用例中允许这种流控制,还是“代码异味”,应予以规避?如果可以的话,这里有什么提示或做法吗?

我对单元测试和一般的测试还很陌生。我正在使用phpUnit进行开发,但是由于我的问题更笼统/是设计问题,所以实际环境不应该太重要。 ...

php unit-testing testing phpunit control-flow
2个回答
3
投票

Paul的答案涉及测试方法的范围和断言,但是您的问题的代码所暗示的一件事是,如果返回的对象具有值X,则将测试A,但是如果其返回值Y,则将测试B。换句话说,您的测试将期望多个值然后根据实际结果测试不同的事物。


2
投票

在您的测试用例中可以有一些控制流是可以的,但是总的来说,请理解,如果单元测试是不相交的,那么它们将是最佳的,也就是说,它们各自针对不同的事物进行测试。效果很好的原因是,当您的测试用例失败时,您可以从失败的测试用例中准确地看到什么是失败,而不是需要深入研究更大的测试用例以了解出了什么问题。通常的度量标准是每个单元测试用例的单个断言。也就是说,每条规则都有例外,这肯定是其中之一。在您的测试用例中有几个断言并不一定没有错,尤其是当测试用例场景的设置/拆卸特别困难时。但是,您要避免的真正的代码味道是您需要一个“测试”来测试所有代码路径的情况。

© www.soinside.com 2019 - 2024. All rights reserved.