有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java单元测试的意义是什么?

我最近加入了一个大量使用单元测试的团队。没有人能向我解释为什么这种形式的测试如此重要,但他们把它当作法律对待

我知道自动化测试的想法是为了防止回归,但我不认为这会是一个问题。模块化的、面向对象的、简洁的、注释良好的代码在回归方面没有问题。如果你第一次就把它做对了,并且为将来不可避免的特性退化而设计,你就永远不需要测试了

而且,这不是优雅的错误处理和日志记录应该完成的吗?既然可以确保所有的外部依赖项都要先仔细检查它们的可用性,为什么还要花上几周的时间来分析断言语句和单元测试呢

我是否傲慢地得出这样的结论:单元测试是“坏”代码库的支柱,这些代码库有缺陷,构建得很差

这是一个严肃的问题。我在任何地方都找不到任何好的答案,如果我质疑自动化测试的目的,我问的每个人似乎都认为我是个恶棍

编辑:谢谢你的回答,我想我现在明白了。我看到一些人投票赞成删除,但我要感谢那些回答的人;真的很有帮助


共 (2) 个答案

  1. # 1 楼答案

    没有人是完美的——你最终会犯错。单元测试旨在捕捉并精确定位错误的位置,以便:

    • 提高对所编写代码正确性的信心
    • 增加对重构正确性的信心
    • 使跟踪测试阶段引入的错误变得更简单

    错误处理和日志记录只在错误被触发时有用单元测试是在测试中而不是在生产中触发bug的原因


    考虑以下几点

    你有一个包含3个不同部分的软件,每个部分有2个不同的选项

         A      C      E
        / \    / \    / \
    in-<   >--<   >--<   >-out
        \ /    \ /    \ /
         B      D      F
    

    你可以通过手动输入并检查输出来测试这一点——首先你输入一些触发A,C,E的输入;然后你会加入一些A,C,F,等等,直到你覆盖了B,d,F的所有内容

    但请记住,B、D和F都有各自需要测试的参数和流——我们可以说每个参数可能有10种变化。所以你至少需要检查10*10*10 = 1000不同的输入,只是对于A,C,E的情况。在这6个组件中有8种不同的可能流,所以这就是8000需要检查的不同输入组合,以确保您点击了所有不同的可能输入

    另一方面,可以进行单元测试。如果您清楚地定义了每个组件的单元边界,那么您可以为A编写10个单元测试,为B编写10个单元测试,以此类推,测试这些边界。这就为组件提供了总共60个单元测试,再加上一些(比如每个流5个,那么40个)集成测试,以确保所有组件正确地连接在一起。总共有100个测试有效地实现了相同的功能覆盖率

    通过使用单元测试,您已经将获得同等覆盖率所需的测试量减少了大约80x!这是一个相对简单的系统。现在考虑更复杂的软件,其中组件的数量几乎肯定大于6,并且这些组件处理的可能情况的数量几乎肯定大于10。您从单元测试而不仅仅是集成测试中获得的节省会不断增加

  2. # 2 楼答案

    I understand that the idea of automated testing is to prevent regression, but i don't see how that could be a problem in the first place.

    除了已经给出的好建议之外,我还要补充一点,回归是不可避免的。即使在这个行业工作很短的时间——好吧,时间足够长,可以经历多个发布周期——你也会意识到,由于很多不同的原因,旧的bug往往会再次出现

    一个特别的原因是:程序员往往会一次又一次地犯同样的简单错误。例如:当你的一个开发人员重新分解日期处理代码时,他会继续做出错误的假设,例如2月总是有29天,甚至更糟的是,所有月份的长度都是相同的

    回归测试是针对这种事情的唯一防御措施