Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 如何在不测试所有可能的64位输入值的情况下安全地对函数进行单元测试?_Unit Testing - Fatal编程技术网

Unit testing 如何在不测试所有可能的64位输入值的情况下安全地对函数进行单元测试?

Unit testing 如何在不测试所有可能的64位输入值的情况下安全地对函数进行单元测试?,unit-testing,Unit Testing,我有一个检查64位字奇偶校验的函数。不幸的是,输入值实际上可能是任何值,因此我无法将测试偏向于覆盖已知的值子集,而且我显然无法测试每个可能的64位值 我考虑使用随机数,以便每次运行测试时,函数获得更多的覆盖率,但是单元测试应该是一致的 忽略我的具体应用程序,是否有一种合理的方法来确保合理的覆盖率,这很可能会暴露将来引入的错误,虽然没有用10亿年中最好的时间运行?以下论证假设您已经编写/访问了源代码并进行了白盒测试 根据您需要的置信水平,您可以考虑证明算法是正确的,可能是使用自动编译器。但是,假设

我有一个检查64位字奇偶校验的函数。不幸的是,输入值实际上可能是任何值,因此我无法将测试偏向于覆盖已知的值子集,而且我显然无法测试每个可能的64位值

我考虑使用随机数,以便每次运行测试时,函数获得更多的覆盖率,但是单元测试应该是一致的


忽略我的具体应用程序,是否有一种合理的方法来确保合理的覆盖率,这很可能会暴露将来引入的错误,虽然没有用10亿年中最好的时间运行?

以下论证假设您已经编写/访问了源代码并进行了白盒测试

根据您需要的置信水平,您可以考虑证明算法是正确的,可能是使用自动编译器。但是,假设您的代码不是需要这种置信度的应用程序的一部分,那么您可能可以通过相对较小的单元测试集获得足够的置信度

让我们假设您的算法以某种方式在64位上循环(或者,打算这样做,因为您仍然需要测试它)。这意味着,64位将以非常常规的方式处理。现在,代码中可能有一个bug,在循环体中,不是使用64位输入中的相应位,而是错误地使用了值0。这个错误意味着您总是得到0的奇偶校验。任何导致预期奇偶校验为1的输入值都可以发现这个特定的错误

从这个例子中,我们可以得出结论,对于实际发生的每个bug,您都需要一个相应的测试用例来找到那个bug。因此,如果您查看您的算法并思考可能存在哪些bug,您可能会发现,比如说,x个bug。然后,您将不需要超过x个测试用例就可以找到这些bug。(您的一些测试用例可能会发现不止一个bug。)

这一主要考虑因素导致了许多派生测试用例的策略,如等价划分或边界测试。例如,对于边界测试,您将特别关注位0和63,它们位于循环索引的边界。这样你就可以一个接一个地抓住许多经典错误

现在,算法在未来发生变化的情况如何(如您所问的未来引入的错误)?与在64位上循环不同,奇偶校验可以通过各种方式使用异或来计算。例如,为了提高速度,您可以先
xor
将高32位与低32位相加,然后获取结果,然后
xor
将高16位与低16位相加,依此类推

此替代算法将有一组不同的可能错误。作为测试用例的未来证明,您还必须考虑这样的替代算法和相应的错误。然而,最有可能的是,第一个算法的测试用例也会发现这些bug的很大一部分——因此测试的数量可能不会增加太多。然而,分析变得更加复杂

在实践中,我会关注当前选择的算法,而不是在算法发生根本性变化的情况下采用重新设计测试套件的方法


抱歉,如果这个答案太笼统。但是,正如应该清楚的那样,一个更具体的答案需要更多关于您选择的算法的细节。

谢谢您,最后我确实像您建议的那样围绕边缘情况做了一些测试,但我也播种了我的RNG,并运行了1000000个测试值以防万一。