TDD - 如何测试简单的获取列表

时间:2012-01-28 02:48:50

标签: tdd

我真的很困惑。假设我的用户故事看起来像这样。

“用户必须能够查看联盟中每位球员的统计数据,以便他能够进行侦察 适当“。

也许用户故事很糟糕,但我仍然应该怎么做TDD呢?我应该对我期待的财产进行测试吗?我真的迷失在这里,并希望你的观点。

编辑:我对TDD很新,但是我得到了基础知识并做了一些katas

3 个答案:

答案 0 :(得分:3)

你所描述的内容对代码中的TDD来说并不是很精细,但你可以将其分解。

首先,他们将如何获得进行搜索所需的信息?他们会看到所有统计数据吗?搜索播放器?搜索特定的统计数据?这为您提供了更细粒度的行为,现在您可以开始考虑用户将使用的界面。想想用户所做的事情的一个例子 - 可能正在搜索一个玩家,也许正在访问第一页,等等。让它变得有趣而简单。

一旦你知道UI的这一部分是什么样的,你就可以编写它。 (你可以 TDD它,但通常界面变化很大,UI自动化很难,所以大多数人没有TDD UI。)

用户界面希望从某个地方获取一些信息,然后传回一些信息。您会发现自己正在考虑一个协作类 - 可能是控制器或演示者 - 这将有助于UI。反过来,该控制器将希望控制其他一些类之间的交互 ​​- UI本身,玩家统计信息的存储库,安全性,验证等。这是您将为其编写测试的第一个类。

您现在可以开始为控制器编写测试。您已经知道UI将如何使用它。只需编写一个示例,说明另一个类如何能够以相同的方式使用控制器,控制器需要什么样的信息,以及使用它时得到的结果。

当然,您还没有其他类,控制器可能需要它们。使用接口来处理这些类将扮演的角色,依赖注入它们,并在测试中模拟或存根它们。

在某些时候,控制器将准备好做某事,但是你仍然无法运行应用程序,因为你还没有完成对协作类的编码 - 它们仍然只是接口。为他们做同样的事情 - 假装你是控制者,使用它们,如果他们需要任何其他类,嘲笑或剔除它们。

最终,您将没有任何类来模拟或存根,并且将运行用户界面中的第一个场景。如果您想获得更快的反馈,您可以随时对某些数据进行硬编码,以便UI运行,您可以看到它的外观。

这样做叫做 outside-in ,与BDD有关,这是一种略微不同的思考TDD的方式。我希望this page可以帮助你。

答案 1 :(得分:2)

你基本上是正确的。您没有说明您是否具有单元测试或TDD的先前经验,因此我不知道接下来会有多少内容将成为您的翻版。

您首先编写一个您知道将要失败的测试。在您提供的示例中,假设您的Player类没有Stats字段。因此,您编写测试以确保您可以访问Stats字段。它会失败;它可能甚至没有构建,因为你引用的是一个尚不存在的字段。然后添加该字段。测试通过。然后循环再次开始。

假设您有一个基于其他统计数据计算的特定统计数据。在编写逻辑以进行计算之前,您会编写一个失败的测试来检查该stat的存在。它会失败。您实现逻辑以生成stat。测试通过。重复。

尝试查看Roy Osherove的这些TDD kata,他写了一本精彩的书 The Unit of Unit Testing

我希望这有帮助!

答案 2 :(得分:2)

从这里开始,您需要创建更好地描述实际步骤的任务。每项任务通常不需要花费12小时才能完成。例如,任务可以是“向列表播放器页面添加RPI到列”。从这里开始,你就可以开始编写测试了。

假设您使用了一些MVC框架,您可以编写一个测试来检查您的模型是否可以报告RPI。然后,您可以编写测试以确保您的控制器正在向视图提供RPI。最后,您可以编写测试以确保视图在提供时显示RPI。

在Rails中,我会在实际测试运行之前将已知RPI添加到已知播放器上的测试数据库中。然后,我可以编写一个如下所示的单元测试:

known_player.rpi.should == 0.6902

所有这些测试都将失败。然后,当您开始实现每个实际功能时,您应该再次运行测试并在它们开始通过时观察。