您可以在Phpunit中测试参数的边界吗?



说我有以下方法:

public function setDeliveryDay(int $deliveryDay)
{
    $this->deliveryDay = $deliveryDay;
}

我想编写一个测试,以确保此设置器仅允许ISO-8601值(因此17(,我将如何实现?

看来,唯一真正的方法是分别测试下方或以上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>

最新更新