【问题标题】:How to write tests first in Java?如何在 Java 中首先编写测试?
【发布时间】:2019-07-02 09:47:56
【问题描述】:

我读过很多关于测试驱动设计的文章。我的项目正在使用测试,但目前它们是在编写代码之后编写的,我不清楚如何在另一个方向上进行。

简单示例:我有一个班级Rectangle。它有private 字段widthheight 以及相应的getter 和setter。常见的Java。现在,我想添加一个函数getArea(),它返回两者的乘积,但我想先编写测试。

当然,我可以写一个单元测试。但它不是失败的情况,而是它甚至没有编译,因为还没有getArea()函数。这是否意味着编写测试总是涉及更改生产代码以引入没有功能的假人?还是我必须以使用自省的方式编写测试?我不喜欢后一种方法,因为它降低了代码的可读性,以后用工具重构不会发现它并破坏测试,而且我知道我们重构了很多。此外,添加“虚拟对象”可能包括很多更改,即如果我需要额外的字段,则必须更改数据库以使 Hibernate 继续工作,……这对我来说似乎是在“仅编写测试”时进行大量高效代码更改的方式。我想要的是这样一种情况,我实际上只能在src/test/ 内部编写代码,根本不接触src/main,但没有自省。

有没有办法做到这一点?

【问题讨论】:

    标签: java testing tdd


    【解决方案1】:

    嗯,TDD 并不意味着在编写测试之前您不能在生产代码中包含任何内容。

    例如:

    1. 你把你的方法,例如getArea(param1, param2) 在您的生产代码中,正文为空。
    2. 然后您使用有效输入和预期结果编写测试。
    3. 您运行测试,它会失败。
    4. 然后您更改生产代码并再次运行测试。

      • 如果仍然失败:返回上一步。
      • 如果通过,则编写下一个测试。

    可以在这里找到快速介绍,例如:codeutopia -> 5-step-method-to-make-test-driven-development-and-unit-testing-easy

    【讨论】:

      【解决方案2】:

      我想要的是一种情况,我实际上只能在 src/test/ 中编写代码,根本不接触 src/main,但没有自省。

      据我所知,没有一种方法可以编写依赖于 API 新部分的测试,并且无需先扩展测试对象的 API 即可立即编译该测试。

      要么自省,要么什么都没有。

      但也不是失败,而是连编译都没有,因为还没有getArea()函数

      从历史上看,编写无法编译的代码是 TDD 节奏的一部分。写一点测试代码,写一点生产代码,写一点测试代码,写一点生产代码,等等。

      罗伯特·马丁将其描述为nano-cycle of TDD

      ...目标始终是提升我在很久以前与 Kent 合作时所经历的逐行粒度。

      我在自己的工作中放弃了纳米循环的限制。也许我没有欣赏它,因为我从未与 Kent 配对过。

      但是我非常乐意编写不编译的测试,然后在测试处于令人满意的状态时回填我需要的生产代码。这对我来说很有效,因为我通常在一个开发环境中工作,只需几个按键即可生成生产实现。

      另一种可能性是考虑像TDD as if you meant it 这样的学科,它在将代码移动到生产层次结构之前在测试源层次结构中做更多的实际工作。

      【讨论】:

        【解决方案3】:

        我有时从事 Android 开发工作,但从未在 Android 中完全采用 TDD。但是,我最近尝试使用完整的 TDD 开发我的新应用程序。所以这是我的看法..

        这是否意味着编写测试总是涉及更改生产代码以引入没有功能的虚拟对象?

        我认为是的。据我了解,每个测试都等同于我在软件上的每个规范/用例。因此,首先编写失败测试是关于尝试使用测试代码填写需求规范。然后,当我试图填写生产代码以通过刚刚编写的 TC 时,我真的试图让它工作。这样做了一段时间后,我很惊讶我的高效代码大小非常小,但它能够满足多少需求。

        就我个人而言,我在生产代码之前编写的所有失败 TC,实际上都来自问题列表,我就需求集思广益,有时我用它来探索需求的边缘案例。

        所以基本的工作流程是 Red - Green - Refactor,这是我从 Bryan Breecham 的演讲中得到的 - https://www.infoq.com/presentations/tdd-lego/

        关于,

        我想要的是这样一种情况,我实际上只能在 src/test/ 中编写代码,根本不接触 src/main,但没有自省。

        对我来说,我认为这是可能的,当您首先编写所有生产逻辑时,UT 扮演满足要求的角色。这只是另一种方式。所以总的来说,我认为 TDD 是一种方法,但人们可能会出于不同目的使用单元测试,例如减少测试时间等。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-08
          相关资源
          最近更新 更多