2017-04-04 350 views
1

我们如何测试我们编写的junit测试用例?我认为手动测试,即创建测试数据,断言预期和实际值没问题。但是最近我遇到了junit测试通过的情况,但是在UI测试期间特定的SUT代码失败了(这意味着junit测试无法防范bug)。如何测试junit测试

+1

[测试驱动开发(https://开头en.wikipedia.org/wiki/Test-driven_development)。事后并没有什么帮助,但是在编写生产代码之前编写测试可以确保测试正在测试你认为他们正在测试的内容。 –

+3

如果您发现需要测试您的测试,某些事情已经绝望地错误。 – Makoto

+4

测试软件的第一条规则:测试只能显示出现错误,而不是缺少错误。测试软件的第二条规则是:除非软件执行简单的逻辑操作,否则详尽的测试实际上是不可行的.http://www.testingexcellence.com/seven-principles-of-software-testing/ – jrook

回答

-1

我遇到了一个情况,即junit测试通过但 特定的SUT代码失败。

您的单元测试不应该忽略任何方法的功能或其副作用的覆盖范围。这就是代码覆盖率工具如Cobertura发挥作用的地方,并不是测试通过,但我们需要确保每个方法及其副作用都经过了单元测试/正确覆盖。

不,代码覆盖率和安慰剂一样糟糕。你可以有100%的线路覆盖率,但仍然与OP在同一个修复程序中?

像Cobertura这样的工具至少可以找到我们正在做的代码覆盖率有多少百分比,但是如果您不关心测试覆盖率,您会得到更多的错误。

重点是这些覆盖工具不会告诉您您的内部业务需求是否真正达到。

+5

不,代码覆盖率只是这是一个坏的安慰剂。你可以有100%的线路覆盖率,但仍然与OP在同一个修复程序中。 – Makoto

+0

我同意你的意见,但是,如果你不关心覆盖范围,你会得到更多的错误 – developer

+1

我不一定同意哲学。代码覆盖作为拐杖表示冗长而复杂的代码。意图和设计更简单的代码没有很多行或分支代码。 – Makoto

3

如果你的测试都通过,但实际代码这些测试被用来支付是失败,那么两种情况之一发生:

  • 测试套件已不适应覆盖该具体用例,或
  • 为覆盖该特定用例而编写的测试不足。

无论如何,你需要重写你的测试。有一个不允许你防止特定异常行为的测试套件会使你的测试套件毫无价值。

你也提到它在UI测试期间显式失败。这可能是由于用户界面和后端测试之间断开了期望。在这种情况下,可以将后端测试与UI的实际输入进行对齐,或者考虑实施涵盖UI工作流程的集成测试。

+0

不应该得到一个downvote,但upvote。 – davidxxx

1

我们如何测试我们编写的junit测试用例?

您不应该。
单元测试不是绝对可靠的,但测试测试没有意义。

您应该将自动测试视为可执行规范。
一般来说,如果你的规格有误,你会被卡住。 对于自动测试,它是完全一样的东西。

为了避免这种问题,或至少减少它,我喜欢:代码

  • 审查,并与开发团队的同行测试代码。

  • 完成由业务团队验证的集成和业务测试的单元测试。

  • 自动测试的持续改进。

    很简单:只要在UI手动测试中检测到一个洞,应该更新自动测试,如果测试存在但缺少一些检查,或者如果缺少测试应该创建新测试。

+0

@Makoto对不起,我还没有完成。 – davidxxx

+0

不够公平,但是你可以不使用HTML换行符吗?有点扔掉东西。 – Makoto

1

要验证的单元测试的质量,我个人使用以下技术:

  1. 覆盖度量。拥有良好的线路和分支机构覆盖率是个好主意。但通常不可能有100%的线路覆盖率,而覆盖本身并不能保证代码实际上被测试,而只是从测试类中调用。

  2. 测试代码审查。我个人更喜欢用清晰的结构“设置 - 运行 - 断言”编写测试。如果缺少“运行”或“断言”步骤,则测试出现问题。

  3. Mutation testing。有一些框架允许你以一种简单的方式修改你的生产代码(在代码上应用mutators),然后在修改的代码上运行你的单元测试,如果没有测试失败,这个代码没有被测试或测试不好。对于Java我使用PIT Mutation Testing

此外,有时是有意义的应用不仅仅是单元测试,但也有一些其他的测试技术 - 手动测试,集成测试,负载测试等