与称为功能测试的功能测试相比,正确的功能测试有什么明显的优势?


9

我正在研究的项目中有很多遗留测试,没有正确模拟出来。因此,它具有的唯一依赖性是EasyMock,它不支持静态变量,带有参数的构造函数等。测试而是依靠数据库连接,从而“运行”测试。由于需要升级现有项目以支持它,因此添加powermock来处理这些情况由于成本过高而被拒绝(另一讨论)。

我的问题是,我可以用来推销正确的单元测试的真实世界有哪些实际好处?有吗 我是在说不好的单元测试(即使它们可以工作)是不好的吗?代码覆盖范围是否同样有效?


3
也许您正在编写的代码可以从结构上的更改中受益,使其更具可测试性。我们在没有模拟框架的情况下在我们的工厂中广泛采用了单元测试,这似乎对我们来说效果很好。
罗伯特·哈维

哇,我很想知道您如何通过第三方JAR集成来管理此问题。您有任何示例或链接吗?
Jackie

1
我们不使用第三方JAR集成。:)但是,我们会根据需要创建存根;模拟框架只是实现相同目的的便利。但是,如果该过程过于繁琐,我们将重新考虑编码方法。
罗伯特·哈维

Answers:


8
  • 资源资源

    您需要一个测试数据库来运行测试。运行数据库的硬件比使用powermock昂贵。释放用于数据库的单元测试的资源意味着该公司不需要立即升级服务器。

  • 可靠性

    测试可能会失败,因为数据库已关闭或处于不一致状态。猜猜是什么,您的构建失败了,因为DBA在一天之内关闭了开发服务器以进行一些升级(现在,开发人员正在尝试找出代码中出了什么问题-而不是代码)。

  • 额外维护

    测试可以以任何顺序运行。添加或删除测试不应导致测试套件失败。针对数据库运行意味着在某处(数据库中)存在某种状态。通常,这些测试需要额外的维护,以确保数据库维护适当的状态,以便下次测试运行。

  • 并发

    两名开发人员同时运行单元测试。拥有数据库意味着测试可能会在数据库上发生冲突。解决方案是为运行的每个测试克隆数据库,这在实际数据库中是不允许的。这导致需要考虑另一种选择。

还考虑将HSQLDB与正在使用的数据库方言一起使用。这样,可以为每个测试创建一个内存数据库。单元测试运行,构建必要的数据库,加载数据,代码中的数据库连接连接到HSQLDB并针对测试数据运行。


4

我的问题是,我可以用来推销正确的单元测试的真实世界有哪些实际好处?

良好的单元测试如下(根据“清洁代码”及其他):

  • 快速
  • 独立
  • 可重复的
  • 自我验证
  • 及时

没有真正的单元测试会违反前三个(通常是最后一个)。这导致一些非常重要的问题:

  1. 您的测试很慢。缓慢的测试很少运行。没有运行的测试几乎没有用。
  2. 由于与您要测试的代码无关的原因,您的测试可能会失败。这使得找出为什么测试失败,浪费时间并导致人们将环境归咎于环境而不是代码变得更加困难。
  3. 随着数据库的更改,您的结果也会更改。使数据库处于已知的良好一致,可维护的状态以进行测试是乏味,烦人且容易出错的。

通常,单元测试中缺乏隔离性会导致更糟糕的测试,这些测试花费更长的时间编写,花费更多的时间,并且对代码库的信任度降低。反过来,这导致人们编写更少的测试或更多地忽略测试,这是混乱的下降螺旋。


2

单元测试只是用来帮助开发人员交付可靠代码的工具。如果您像老板的想法那样思考,您将能够说服他,如果您提出的建议有意义。但是,如果将其作为旅行车上的布道者展示,则不会获得分配的资源。您将需要向他解释,通过花费时间和资源为您的旧应用程序改造单元测试,他将如何受益。

您提到了遗留测试-这意味着遗留代码。不幸的是,使单元测试适合未设计为要进行单元测试的代码是一个困难,耗时且昂贵的过程。如果您有提供有用结果的测试,则业务案例会变得更加困难,而您要做的就是(根据业务案例POV)提供相同结果的替代测试。您将需要关注节省的成本(时间).....

我的猜测是,由于没有人,您将无法向您的老板介绍一个稳健的业务案例。


我绝对可以看到您来自哪里,但是,我更多地是在寻找如何制作此业务案例的机会。不仅担心边际质量会导致成本过高。
Jackie

1

从您的描述看来,您似乎不喜欢测试框架A,而是想要切换到测试框架B,两者都可以工作。吸纳并使用现有的和有效的工具,不要浪费更多精力重新设计轮子,以便可以使用首选的测试框架。

使用最新的月度框架来证明扔掉现有的工作代码并花费大量时间和金钱为用户带来几乎零的收益是不仅仅需要的。


这些不完全不是框架的内容,更不是允许测试访问其他资源的内容。从而使它们实质上成为功能测试,而不是单元测试。“框架”都是JUnit和EasyMock(尽管是旧版本)。我确实建议添加一个新的依赖框架。
Jackie

1

好的单元测试可以提供本地化。功能测试可能会告诉您“添加用户功能已损坏”,但是良好的单元测试将告诉您它已损坏,因为有人将数据库中的USER.LAST_NAME字段更改为非空。还可以直接测试较小的更改,而不需要复杂的测试环境(对于某些测试,可能需要重新初始化或清除该环境)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.