需要更好的jUnit测试覆盖率

时间:2010-10-22 00:03:11

标签: unit-testing junit

大家晚上好

假设您的代码包含以下语句:

if (string ends with char 'y') {
  if ((char before last is not 'e') || (char before last is not 'a')) {
    return (something awesome);
  }
}

所以我认为这很简单......

测试1: input =“xy”(最后一个字符是y,最后一个字符不是e或a)

结果 - 部分覆盖率......

我缺少哪些其他测试?如果这是和&&而不是||,我认为测试会更容易,但是||我有点困惑。

你能建议Test2,3,n?

谢谢

3 个答案:

答案 0 :(得分:2)

你也可以编写测试以确保你不会返回一些很棒的东西

Test2: input = "ez" does not return something awesome
Test3: input = "af" does not return something awesome

测试应证明您的预期行为。 不同长度的琴弦怎么样?

(empty, '1', '2 ', '3  ')

您可能希望将其转换为方法或函数,并将其命名为适当的名称。 然后为这个简单的方法编写测试(在TDD中你会先编写它们)。

答案 1 :(得分:2)

您希望使用输入“ey”和“ay”来测试预期的行为。

你可能会发现你的方法没有做到你想象的那样。我认为||确实让你感到困惑。

答案 2 :(得分:1)

有不同类型的报道:

  • 方法级别覆盖(C ++编译器过去做的事情)
  • 行级别覆盖率
  • 符号级别覆盖(大多数C#覆盖工具提供此功能)
  • 分支级别覆盖(许多Java覆盖工具提供此功能)

我认为你的困惑正在发挥作用,因为你正在考虑符号覆盖,而你的工具正在为你提供分支覆盖。这是区别:

符号覆盖率将衡量您是否已到达每个符号(即一串代码,直到';'字符)。以下行包含两个符号:

int i = 0; int j = 3;

分支覆盖率测量真值和假值中的每个条件。在您的示例中,列出了4个不同的条件,每个条件都有一个真分支和一个假分支。为了完全测试每个分支,您需要对以下每个条件进行测试:

  • 字符串以char y结尾,char结尾为e
  • 字符串以char y结尾,char之前是
  • 字符串以char y结尾,char在last之前既不是a也不是e
  • 字符串不以char y结尾

使用您编写的代码,您可能会遇到意想不到的事情。如果字符串以y结尾,无论如何都会得到一些东西。如果字符串以'ey'结尾,那么它不会以'ay'结尾。如果这些条件中的任何一个都是真的,那么你会得到很棒的东西写下测试并亲自看看。

相关问题