65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 TDD Katas 学习测试驱动开发

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.69/5 (9投票s)

2015年3月14日

CPOL

8分钟阅读

viewsIcon

82132

downloadIcon

331

在本文中,我们将讨论 TDD Katas 以及如何通过实践来掌握测试驱动开发 (TDD)。

目录

引言

如今,测试驱动开发 (TDD) 是技术领域发展最快的领域之一。我们大多数人都遵循敏捷开发方法,希望在代码内部进行测试。

在本文中,我们将讨论 TDD Katas 以及如何通过实践来掌握测试驱动开发 (TDD)。

Katas

为什么我们需要学习 TDD?

这是基于真实场景的问题。最近,我在印度诺伊达的一所工程学院发表演讲,被问了无数类似的问题。许多人阅读书籍、博客和一些伟大作者的精彩文章,但他们仍然不确定为什么我们应该进行测试驱动开发?有些人将 TDD 与他们的单元测试进行比较,这促使我一一解答。在这里,我将分享我的观点,以及我与那些人谈论的内容?

  • 首先,不要混淆单元测试和 TDD。
  • TDD 就像你同时编写和测试你的代码。
  • 它有点像在代码内部测试代码。
  • TDD 确保编写的代码经过测试和重构。

现在,问题来了,我们为什么要进行或学习 TDD?为此,请设想这样一个场景:一名开发人员完成了单元测试,质量保证人员也完成了他们的工作,并将交付的产品标记为可用于生产。如果另一名开发人员的代码/更改破坏了第一名开发人员的代码,会发生什么?现在,我们可以考虑 TDD。正如其字面意思,测试驱动开发意味着我们所写的,我们都在测试。这样,如果有人破坏了你的代码,你的测试就会失败,你就可以检查被破坏的区域。这只是一个方面,TDD 是一个巨大的概念。

所以,答案很简单,如果你想让你的代码变得更好,请遵循 TDD。

什么是 TDD Kata?

Kata 是一个日本词,意思是“形式”和详细的“编排”的身体动作模式。

在武术中,他们通过练习和重复动作来磨练技能和模式。同样,在软件开发中,这个想法最初是由Dave Thomas提出的。这个想法的动机是一样的,进行练习,重复任务,使你的技能更加完美。

从哪里和何时开始?

你可以随时开始,不需要任何额外的技能,只需要你能写代码即可 : )。

学习现象

我将分享一些学习步骤,以使你的 TDD 学习更加扎实和快速。

每天做 Katas

我建议每天都做 Katas,特别是当你刚开始学习 Katas 的时候。这个时间应该超出你正常的编程时间。

选择一个安静的时间来做你的 Katas。我通常在一天开始时做,每天早上花 30 分钟做一个 Kata。除非你认为你已经准备好在你的项目中使用 Katas,否则请避免在工作场所做 Katas。

让它成为你的习惯

虽然我不是每天都做 Katas,但我一直都在做 Katas。现在,我通过 Katas 来学习新技术。我在日常生活中通过做 Katas 学到了很多好的技术。

有哪些可供开始的 Katas?

有很多 Katas 可供开始

字符串计算器 Kata (Roy Osherove 提供)

  • 创建一个简单的 String 计算器,其中有一个方法 int Add(string numbers)。该方法可以接受 0, 1 或 2 个数字,并返回它们的总和(对于空 string,它将返回 0)。例如 "" 或 "1" 或 "1,2"。
    • 从最简单的测试用例开始,即空 string,然后是 1 个数字和 2 个数字。
    • 记住要尽可能简单地解决问题,这样你就会强迫自己编写你没有想到的测试。
    • 记住在每个测试通过后进行重构。
  • 允许 Add 方法处理任意数量的数字。
  • 允许 Add 方法处理数字之间的换行符(而不是逗号)。
    • 以下输入是有效的: "1\n2,3" (结果为 6)
    • 以下输入是无效的: "1,\n" (无需证明 - 仅供说明)
  • 支持不同的分隔符。要更改分隔符,string 的开头将包含一个单独的行,如下所示:[分隔符]\n[数字...],例如 ;\n1;2 应该返回三,默认分隔符是 ;。
    • 第一行是可选的。所有现有场景仍应受支持。
  • 调用 Add 并传入负数将抛出异常“不允许负数”——并显示传入的负数。
    • 如果存在多个负数,则在异常消息中显示所有负数。

保龄球游戏 Kata (Uncle Bob 提供)

  • 创建一个新项目或在现有项目中开始,添加 Game.cs TestGame
  • 创建两个 public 方法
  • 为上述方法创建测试方法
  • 这被称为“RED”测试,因为它将失败
  • 修复了测试和类方法
  • 编写新测试
  • 这被称为“Green”测试,因为它将通过
  • 修复了 TestMethods 以满足总共 20 帧的击球
  • 修复了测试以接受多帧和多球
  • 测试 3 是一个“Red”测试
  • 测试 4 和 5 是“Green
  • 所有测试均通过
  • 仍然有重构的空间

FizzBuzz Kata

打印从 1 到 100 的数字。但对于三的倍数,打印 “Fizz” 而不是数字;对于五的倍数,打印 “Buzz”。对于既是三又是五的倍数的数字,打印 “FizzBuzz”

这里还有很多:练习 Katas

和我一起开始做 Katas

你还在等什么,让我们从这里开始做 Katas 吧,因为我们已经讨论了测试驱动开发。

什么是 TDD?

根据维基百科,TDD 定义为

“测试驱动开发 (TDD) 是一种软件开发过程,它依赖于一个非常短的开发周期的重复:首先,开发人员编写一个(最初失败的)自动化测试用例,该用例定义了一个期望的改进或新功能,然后生成最少的代码来通过该测试,最后将新代码重构到可接受的标准”

TDD

TDD 有三个阶段,称为 Red Green Refactor (RGR)。

  • Red – 首先编写一个失败的测试。
  • Green – 修改/更改代码,以便测试通过。
  • Refactor - 重新编写代码,使其更好。

为了理解,让我们以 FizzBuzz Kata 为例——这是一个非常简单的 Kata。要开始编写这个 Kata,我们需要创建一个单元测试项目,我这里使用的是 NUnit 测试框架,你可以根据自己的选择使用。

  • 启动 Visual Studio
  • 按 Ctrl + Shift + N 创建新项目(C# 类库项目)
  • 根据你的喜好命名,我将其命名为 ‘TDD-Katas-project’
  • 添加两个名为 ‘FizzBuzz.cs’‘TestFizzBuzz’ 的类
  • 为你的项目添加 NUnit 支持:使用 Console Manager 或 Nuget UI Dialog 添加 NUnit 的 nugget 包。

我们已准备好开始。回到我们 Kata 的描述,首先说“编写一个打印从 1 到 100 的数字的程序”。

在第一时间,我们可以编写一个简单的代码片段,它只打印 1-100 之间的数字,所以,将以下代码片段添加到 FizzBuzz.cs

public string PrintNumber()
        {
            var number = string.Empty;
            for (var i = 1; i < 100; i++)
                number += " " + i;

            return number.Trim();
        }

让我们为这个 Kata 编写一个测试,我们需要在数字能被 3 整除时写 Fizz。在 Test FizzBuzz.cs 文件中添加以下测试

[Test]
        public void CanReturnFizzIfNumberDivisibleByThree()
        {
            var actualResult = FizzBuzz.PrintNumber();
            Assert.True(actualResult.Contains("Fizz"));
        }

从 Visual Studio 内部运行上述测试,我使用的是 Resharper,所以,我在 Unit Test 窗口中看到结果如下

Failed Test

在这里,我们的测试失败了,这是 Red 阶段

现在,我们知道测试失败了,并且知道测试失败的原因。纠正代码,使我们的测试能够通过。

修改我们上面的代码片段,它看起来是这样的

public static string PrintNumber()
        {
            var number = string.Empty;
            for (var i = 1; i < 100; i++)
            {
                number += i%3 == 0 ? " " + "Fizz" : " " + i;
            }

            return number.Trim();
        }

现在,再次运行相同的测试,看看它是否会通过或失败。

Passed Test

很高兴看到我们编写了代码,使我们的测试通过了。

我们的测试通过了,所以,这是 Green 阶段

现在,回顾代码片段,看看是否有重构代码的可能性,让我们看看:在上面,我们检查如果一个数字能被 3 整除,那么它应该是 ‘Fizz’,是的,这里我们可以重构我们的代码

创建一个方法,让我们知道一个数字是否是 Fizz

private static bool IsFizz(int i)
        {
            return i % 3 == 0;
        }

并在我们的负责任方法中调用此方法,如下所示

public static string PrintNumber()
        {
            var number = string.Empty;

            for (var i = 1; i < 100; i++)
                number += IsFizz(i) ? " " + "Fizz" : " " + i;

            return number.Trim();
        }

这里,我们重构了代码,所以,我们处于重构阶段。现在,重复所有这些阶段,直到你完成 FizzBuzz Kata 的所有要点。剩余的要点是

  • 对于五的倍数打印 Buzz
  • 对于既是三又是五的倍数的数字,打印 FizzBuzz
  • 否则打印数字本身

附带了完整的源代码,你可以下载并享受 Kata Game :)。

结语

在本文中,我们讨论了测试驱动开发的重要性,并通过 Katas 学习了 TDD。我们还讨论了什么是 TDD Kata,并提供了一个简短的示例。

希望你喜欢这篇文章。我尽量把它写得简单易懂。如果你喜欢这篇文章,请评分并分享,以传播知识。

历史

  • 2015 年 3 月 13 日:初始版本
© . All rights reserved.