【问题标题】:TDD assignment for beginners?初学者的TDD作业?
【发布时间】:2011-03-16 04:53:26
【问题描述】:

我想向我的初级 Java 程序员介绍测试驱动开发原则,他们以前从未听说过这个术语。我计划在上半场进行一次会议,解释 TDD 的基础知识和好处,然后在下半场进行实践作业。

那么,对于 TDD 新手来说,什么是一个好的、基于 Java 的作业呢?不应该那么小事让人失去兴趣,也不应该那么困难以至于失去信心。我在网上看到了一些,也想考虑一下你的建议。非常感谢任何指针/链接。

【问题讨论】:

  • 你不会比Test-Driven Development by Example中的例子做得更好
  • 在 .Net 中,我最近不得不编写一个应用程序,对两个模式进行 Xml 序列化,并使用转换/等于运算符在新模式上的对象之间进行差异。这是生产测试代码,所以肯定不是“微不足道的”。单元测试最终发现了很多错误,但很容易以 TDD 风格编写(我们知道所有的对象属性,以及来自参考 XML 的模式更改)。这一切都很容易写,但也很容易写出细微的错误,所以单元测试会发现很多错误。不像光线追踪器那样迷人:),但它是真实世界的,也是一个很好的 TDD 示例。

标签: java tdd


【解决方案1】:

这是一个重要的 TDD 教程,主题是编写俄罗斯方块。完成它可能需要10多个小时。大约 30 个最初的测试已经预先编写好,之后提供了一些关于接下来要编写哪些测试的提示。

https://github.com/orfjackal/tdd-tetris-tutorial

【讨论】:

    【解决方案2】:

    我喜欢在演示 TDD 时使用的一个示例是密码强度验证器:编写一些代码来检查字符串是否是足够强的密码。我喜欢它,因为:

    • 每个人都明白这个问题,它不是特定于语言的
    • 您可以从一两个易于测试的规则开始(不是“密码”,超过 8 个字符...)来掌握 TDD 节奏
    • 当您拥有 2 条或更多规则时,您很快就会遇到有趣的问题。测试变得困难并导致重新设计/重构,将规则与验证器分开,并获得既干净又易于测试的代码。

    【讨论】:

      【解决方案3】:

      我喜欢 Range - 只是一个整数范围。写入包括(int),重叠(范围)和任何类似的方法;你可以弄清楚它是全开、全封闭还是半开(最好的答案,大多数情况下),然后让测试带你去那里。

      Natural Sort 也不错。实用、有用和试驾它可以为您带来意想不到的解决方案。

      【讨论】:

        【解决方案4】:

        我喜欢给John Conway's Game of Life写引擎。

        非常简单的规则。它们可以写在一个(略显凌乱的)类中,但真正的乐趣是当你开始考虑类的职责,然后模拟出这些职责——例如,邻域计算器、规则等。

        您还可以通过一些额外的规则来推出更好的设计:

        • 网格可以在运行时从有界网格(没有任何东西可以生存)到无限网格或包裹网格(滑翔机从另一侧返回)来回切换。
        • 单元格根据它们的年龄改变颜色(或字符串表示)(将设计从值对象移动到实体)。
        • 规则可以从 Conway 更改为 High Life。

        如果您也以图形方式工作,您会获得更多乐趣。开发人员可以使用测试或场景来讨论边缘案例(各种故事之间的交互变得复杂):

        • 单元格的大小会根据邻居的数量而变化
        • 有一个“返回”按钮
        • 有一个操纵杆可让您在环绕或无限网格中导航
        • 板可以(重新)设置为预定义的场景
        • 板子可以改变大小。

        这是 Corey Haines 在他的 Code Retreats 中经常使用的内容。多年来,我一直用它来教授 TDD / 单元级 BDD。您可以很快看到一些进展,然后随着它的发展变得更加棘手。

        【讨论】:

          【解决方案5】:

          我在不止一堂课中使用了incremental search,效果很好。人们通过手机知道这种情况;通讯录通常以这种方式工作(您输入姓名的开头,它会显示所有以这些字母开头的姓名)。

          一个优点是这个问题可以真正递增。当你已经在做的时候,你就会知道细节。您还可以添加额外内容,例如:

          • 最近使用的行为(最先出现的搜索名称):这需要增量搜索对象来存储状态
          • 字母排序
          • 考虑任何位置的字母(例如,搜索“JSm”会找到“John Smith”)

          但是,如果您在课堂上进行,我建议您有大约 3 小时的空闲时间。这不是一个简单的例子。而且它处理了很多列表,因此最好确保您的学生熟悉它们,包括 Arrays.asList。

          【讨论】:

            【解决方案6】:

            井字游戏。让玩家先走,电脑再走。

            您可以从计算机始终处于中间位置开始,但随后您需要进行测试以确保计算机不会选择已被占用的位置。然后,您可以慢慢进行测试,以确保计算机始终覆盖其漏洞。

            【讨论】:

              【解决方案7】:

              (不是答案,只是评论。请忽略。)

              测试不应成为编程的中心。尤其是对年轻学生。只要有可能,我们首先应该高度关注实现的逻辑和推理。我们应该练习我们的技能,确信我们知道代码是正确的,仅仅因为我们编写了它。

              这是一个不可能的目标吗?许多人实际上可以非常接近它。不过就算是太遥不可及的人,至少在他还是学生的时候也应该这样修炼。不会痛的。

              在 TDD 中,它似乎鼓励学生做得足够好以通过考试。您实际上不必仔细考虑您的算法。只需调整它直到它通过测试,这很容易。

              一切不好的事情都会从中产生。

              我并不是说测试不重要。但它不应该是正确性的第一道防线。

              在另一个相关话题中,有人认为 TDD 有利于设计:如果代码易于测试,那么它很可能是一个好的设计。这也很令人费解——什么时候不能直接专注于好的设计?

              【讨论】:

              • TDD 实际上并不是关于测试——它是关于设计、行为和责任。它不可能是关于测试的,因为你没有从任何代码开始测试。如果您将每个“测试”视为对代码为何有价值的描述以及如何使用它的示例,那么这可能更有意义。因此,BDD 的开发开始时主要是为了避免那个误导性的词:dannorth.net/introducing-bdd
              • “我们应该首先关注实现的逻辑和推理”:这就是 TDD 很棒的原因,它迫使您在编写代码之前仔细思考并编写代码的可执行规范.这也是一个实时规范:如果您开始以破坏系统其他部分的方式更改代码,您会立即知道。
              猜你喜欢
              • 2011-12-14
              • 1970-01-01
              • 2015-04-27
              • 2021-09-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-03-06
              相关资源
              最近更新 更多