说我有以下方法:
public function setDeliveryDay(int $deliveryDay)
{
$this->deliveryDay = $deliveryDay;
}
我想编写一个测试,以确保此设置器仅允许ISO-8601值(因此1
到7
(,我将如何实现?
看来,唯一真正的方法是分别测试下方或以上1和7以下的每个可能的整数?
当然这是不明智的,尤其是如果您期望抛出异常。
首先我测试了下限:
$this->expectException(InvalidArgumentException::class);
$obj->setDeliveryDay(0);
在另一个测试中,上限(因为expectException
仅支持每个测试的一个例外(:
$this->expectException(InvalidArgumentException::class);
$obj->setDeliveryDay(8);
当然,这不会阻止某人将其设置为-1或-842或9或3835等。
我在这里缺少某种主张,还是接受测试界限的最佳实践?
我要做的就是为工作日创建一个简单的值对象,它不会揭露数字并使用静态出厂方法来设置该值。这样,您可以通过类型提示该对象的类型传递正确的值。
通过通过int
测试代码时,我不必担心捕获所有不可能的值。您仅测试预期的滥用,因此我只能测试0
,但是如果您想表示上限,也可以对8
进行测试。如果不容易识别哪些数字可能有效,哪些数字仍然不应将测试用例限制在最合理的情况下,然后仅测试进一步的案例,例如对于3835,当您由于这个数字而遇到错误时,为了安全起见,它将不会重新出现。
如果您想捕获这些案例,则可能需要研究突变测试。或者,您可以通过随机测试值,例如使用rand(8, PHP_INT_MAX)
,但我不建议这样做,因为它会导致片状测试,并且很难跟踪使用的值以及为什么。
,除非您要转向" QuickCheck",否则您无法做太多。QuickCheck是一种测试方法,最初是从Haskell World出来的,但似乎也有PHP库。他们都是关于"基于属性的测试"的:
生成测试,也称为基于属性的测试,是关于在所有可能输入的属性方面描述系统的行为。
换句话说:这种框架的想法是确保有效的输入通过;任何不良输入失败。
如果您不想走那条路...我会这样做:
- 编写一个测试循环中几个有效值的测试柜
- 为边界编写其他两个测试柜
- 编写另一个循环并尝试一堆无效值(例如基于随机数( 的测试柜
最终单词:当您选择"随机"值时,请确保在某处使用 seed 来记录 - 以确保您可以在以后重现失败测试。
<</p>