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

Unit testing 如何确定单元测试的测试用例?,unit-testing,Unit Testing,我刚刚开始单元测试,并编写了一些简短的测试来检查名为isPrime()的函数是否正常工作 我有一个测试,检查函数是否工作,并有一些数字和预期返回值形式的测试数据 我应该测试多少?我如何决定测试哪一个?这里的最佳实践是什么 一种方法是生成1000个素数,然后循环遍历它们,另一种方法是只选择4或5个并测试它们。正确的做法是什么?问问自己。我到底想测试什么。而测试是最重要的。测试以确保它在预期的情况下基本上执行您期望它执行的操作 测试所有这些空值和边缘情况-我不认为是真实的,太耗时了,需要有人在以后维

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

我有一个测试,检查函数是否工作,并有一些数字和预期返回值形式的测试数据

我应该测试多少?我如何决定测试哪一个?这里的最佳实践是什么


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

问问自己。我到底想测试什么。而测试是最重要的。测试以确保它在预期的情况下基本上执行您期望它执行的操作

测试所有这些空值和边缘情况-我不认为是真实的,太耗时了,需要有人在以后维护! 而且…您的测试代码应该足够简单,这样您就不需要测试您的测试代码了

如果您想检查您的函数是否正确地应用了该算法,并且在一般情况下可以正常工作,可能需要足够的素数

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

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

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


人们请评论为什么你认为这值得投两张反对票:)你想检查边缘案例。你的方法应该能处理多大的素数?这将取决于您使用的表示(类型)。如果你只对小素数感兴趣(在数论中使用的是真正的相对项),你可能会使用int或long。在你选择的表示法中测试几个最大的素数。确保你也检查了一些非素数。(独立验证要容易得多。)


当然,你也要测试一些小数字(素数和非素数)和少数在中间的范围。一把就足够了。另外,请确保对超出有效输入范围的数字抛出异常(或返回错误代码,以您喜欢的为准)。

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

  • 此代码的正确运行有多重要
  • 该代码的实现将来是否可能更改?(如果是,请进行更多测试以支持未来的更改)
  • 本规范的公共合同将来可能会发生变化吗?(如果是这样,减少测试-以减少丢弃测试代码的数量)
  • 代码覆盖率如何,是否访问了所有分支机构
  • 即使代码没有分支,是否测试了边界考虑因素
  • 测试运行得快吗
编辑:嗯,在你的特定场景中提供建议。由于您昨天开始编写单元测试,您可能没有经验在所有这些因素中做出决定。我来帮你:

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

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

一般来说,只要你觉得舒服/自信,就可以测试尽可能多的情况

通常,测试基本/零情况、最大情况和至少一个中间/中间情况

如果适用,还要测试预期的异常情况

如果您不确定素数算法,请务必使用前1000个左右的素数对其进行测试,以获得信心

“小心错误。我已证明上述算法正确,但尚未对其进行测试。”

有些人不理解上面的引语(意译?),但当你仔细想想时,它是非常有意义的。测试永远不会证明一个算法是正确的,它们只会帮助指示您是否正确编码。针对可能出现的错误和边界条件编写测试,以实现良好的代码覆盖率。不要只是从蓝色中挑出值来看看它们是否有效,因为这可能会导致很多测试,所有测试都完全相同


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

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

要真正确定,你必须对它们进行测试。:-)

但是,严肃地说,对于这种函数,您可能使用的是一种已建立且经验证的算法。您需要做的主要事情是验证代码是否正确实现了算法

另一件事是确保你理解你的数字表示的极限,不管是什么。至少,这将为您可以测试的数字的大小设置一个上限。例如,如果您使用