jUnit基本问题

墓志铭:

我正在测试String乘法器类,其multiply()方法是将2个数字作为输入(如String)并返回结果数字(如String

public String multiply(String num1, String num2);      

我已经完成了实现,并创建了一个包含以下测试用例的测试类,其中涉及输入String参数,如下所示:

  1. 有效数字
  2. 人物
  3. 特殊符号
  4. 空字符串
  5. 空值
  6. 0
  7. 负数
  8. 浮动
  9. 边界值
  10. 有效数字,但其产品超出范围
  11. 数字将加号(+23)

现在我的问题是:

  1. 我想知道“每一个” assertEquals()是否应包含在它自己的测试方法中?或者,我是否可以将类似的测试用例(如testInvalidArguments())组合在一起,以包含所有涉及无效字符的断言,因为它们中的所有抛出相同的NumberFormatException?

  2. 如果测试字符(“ a”)之类的输入值,是否需要包括所有方案的测试用例?“ a”作为第一个参数“ a”作为第二个参数“ a”,“ b”作为2个参数

  3. 根据我的理解,这些单元测试的好处是找出用户输入可能失败并导致异常的情况。然后,我们可以向用户提供有意义的消息(要求他们提供有效的输入),而不是异常。正确吗?而且,这是唯一的好处吗?

  4. 上述11个测试用例是否足够?我错过了什么?我有过分吗?什么时候足够?

  5. 从上述观点出发,我是否已经成功测试了乘法()方法?

斯蒂芬·C:

1)在测试的粒度(因此易于诊断)与单元测试代码的详细程度之间需要权衡。我个人很乐意选择相对粗粒度的测试方法,尤其是在测试和测试代码稳定之后。粒度问题仅在测试失败时才相关。(如果我在多断言测试用例中失败,那么我将修复第一个失败并重复一次,或者根据需要临时修改该测试用例,以找出发生的情况。)

2)运用常识。根据您对代码编写方式的理解,设计测试以使用所有性质上不同的子案例。认识到除了最琐碎的情况以外,不可能测试所有可能的输入。

3)单元测试的重点是提供一定程度的保证,以确保被测方法能够完成所需的工作。这意味着什么取决于所测试的代码。例如,如果我正在对一种sort方法进行单元测试,则用户输入的验证无关紧要。

4)覆盖范围似乎合理。但是,如果没有详细说明您的班级需要做什么,以及没有检查实际的单元测试,就不可能说您是否涵盖了所有内容。例如,您的方法是否应该处理前导/尾随空格字符,带小数点的数字,诸如“ 123,456”的数字,使用非拉丁数字表示的数字,以42为底的数字?

5)定义“成功测试”。如果您的意思是,我的测试是否证明代码没有错误,那么答案是肯定的“否”。除非单元测试枚举每个可能的输入,否则它们不能构成正确性的证明。(在某些情况下,甚至不测试所有输入就足够了。)

除了最琐碎的情况之外,在所有情况下,测试都无法证明没有错误。它唯一可以证明的是存在错误。如果您需要证明程序没有错误,则需要诉诸“正式方法”。即在您的程序中应用形式定理证明技术。

而且,正如另一个答案指出的那样,您需要将其提供给真实用户,以查看他们可能会以意外输入的方式想到什么。换句话说,...陈述的或推断的用户要求实际上是完整且有效的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章