如何确定单元测试的测试用例?

时间:2008-11-20 19:55:17

标签: unit-testing

我刚刚进入单元测试,并编写了一些简短的测试来检查名为isPrime()的函数是否正常工作。

我有一个测试,检查该函数是否有效,并以某些数字和预期返回值的形式提供一些测试数据。

我应该测试多少?我如何决定测试哪个?这里最好的做法是什么?

一种方法是生成1000个素数,然后循环遍历所有素数,另一种方法是选择4或5并测试它们。什么是正确的做法?

8 个答案:

答案 0 :(得分:10)

我也被告知每次发现错误时,都应该编写一个测试来验证它是否已修复。无论如何,这对我来说似乎是合理的。

答案 1 :(得分:8)

您想检查边缘情况。你的方法能够处理的素数有多大?这取决于您使用的表示(类型)。如果你只对小数(真正的相对术语,当用于数论)素数感兴趣时,你可能使用int或long。在您选择的表示中测试一些最大的素数。一定要检查一些非素数。 (这些更容易独立验证。)

当然,您还需要测试一些小数字(素数和非素数)以及一些中间范围内的数字。少数几个应该是充足的。另外,请确保针对超出有效输入范围的数字抛出异常(或返回错误代码,无论您的偏好)。

答案 2 :(得分:1)

问问自己。我还想测试什么。并且测试最重要的。测试以确保它基本上完成了您在预期情况下所期望的操作。

测试所有那些空值和边缘情况 - 我 - 不认为是真实的,太耗时而且有人需要稍后维护它! 并且......您的测试代码应该足够简单,以便您不需要测试测试代码!

如果你想检查你的函数是否正确地应用了算法并且一般是有效的 - 可能足够一些素数。

如果你想证明寻找素数的方法是正确的 - 100000素数是不够的:) 但是你不想测试后者(可能)......

只有你知道你想测试什么! :)

PS我在单元测试中使用循环并不总是错误的,但在这之前我会三思而后行。测试代码应该非常简单。如果出现问题并且测试中有错误怎么办? :) 但是,您应该尽量避免将测试代码重复作为常规代码重复。有人必须维护测试代码。

人们请您注意,为什么您认为这两个人有两个下降:)

答案 3 :(得分:1)

一般情况下,测试尽可能多的情况,让您感到舒适/自信

一般来说,测试基数/零的情况,最大的情况,以及至少一个中间/中间的情况

还测试预期例外情况(如果适用)

如果你不确定你的素数算法,那么一定要用前1000个素数来测试它,以获得信心

答案 4 :(得分:1)

“谨防错误。我已经证明上述算法是正确的,但还没有测试过。”

有些人不理解上面引用的内容(释义?),但是当你想到它时,这是完全合理的。测试永远不会证明算法是正确的,它们只能帮助表明你是否正确编码。编写您期望可能出现的错误的测试以及边界条件以实现良好的代码覆盖率。不要只是挑选价值观以确定它们是否有效,因为这可能会导致大量测试,所有测试都完全相同。

对于您的示例,只需手动选择一些素数和非素数来测试实现中的特定条件。

答案 5 :(得分:0)

一些问题,答案可能会告知您的决定:

  • 此代码的正确运行有多重要?
  • 将来可能会更改此代码的实施吗? (如果是这样,测试更多以支持未来的变化)
  • 此代码的公共合同是否可能在未来发生变化? (如果是这样,请少测试 - 减少丢失测试代码的数量)
  • 代码覆盖范围是如何访问所有分支?
  • 即使代码没有分支,是否测试了边界因素?
  • 测试运行得很快吗?

编辑:嗯,所以在你的具体情况下提出建议。自从您昨天开始编写单元测试以来,您可能没有经验来决定所有这些因素。我来帮助你:

  • 这段代码可能不太重要(没有人死,没有人参战,没有人被起诉),所以一些测试就没问题了。
  • 实现可能不会改变(素数技术众所周知),因此我们不需要测试来支持这一点。如果实现确实发生了变化,则可能是由于观察到的失败值。这可以在更改时添加为新测试。
  • 此公共合同不会改变。
  • 获得100%的代码覆盖率。在这种情况下,没有理由编写测试不访问的代码。您应该可以通过少量测试来完成此任务。
  • 如果您关心调用零时代码的作用,请测试。
  • 少量测试应该很快进行。这将允许它们经常运行(由开发人员和自动化运行)。

我会测试1,2,3,21,23,一个“大”素数(5位),一个“大”非素数和0,如果你关心这对0的作用。

答案 6 :(得分:0)

要确定,你将不得不对它们进行全面测试。 : - )

严重的是,对于这种功能,您可能正在使用已建立且经过验证的算法。您需要做的主要是验证您的代码是否正确实现了算法。

另一件事是确保你理解你的数字表示的限制,无论是什么。至少,这会对您可以测试的数量的大小设置上限。例如,如果您使用32位无符号整数,则您将永远无法测试大于4G的值。可能您的限制将低于此限制,具体取决于您的实施细节。

就像一个实现可能出错的例子: 用于测试素数的简单算法是尝试将候选者除以所有已知素数直到候选者的平方根。平方根函数不一定会给出精确的结果,所以为了安全起见,你应该稍微超过它。过去将在多大程度上取决于具体如何实现平方根函数以及它可以关闭多少。

关于测试的另一个注意事项:除了测试已知质数以查看您的函数是否正确地将它们标识为素数之外,还要测试已知的复合数以确保您没有得到“误报”。为了确保你的方形函数正确,选择一些复合数字,其中素数因子尽可能接近它们的平方根。

另外,请考虑如何“生成”用于测试的素数列表。你能相信这个清单是否正确?这些数字是如何测试的,由谁测试?

您可以考虑对两个函数进行编码并相互测试。一个可能是一个简单但速度慢的算法,你可以更确定正确编码,另一个是你真正想要在你的应用程序中使用的更快但更复杂的算法,但更可能有编码错误。

答案 7 :(得分:0)

“如果值得建设,值得测试” “如果不值得测试,你为什么要浪费时间去做呢?”

我猜你没有先订阅测试,在编写代码之前你在哪里编写测试? 不用担心,我相信你并不孤单 如上所述,测试边缘,开始的好地方。还必须测试不良情况,如果你只测试你知道的工作,你可以确定在最糟糕的时候生产中会出现坏情况。

哦,“我刚刚发现了最后一个错误” - 哈哈。