5

我试图掌握整个 TDD 方法,因此,我真的不知道如何将其作为一个简洁的问题提出,所以这里是冗长的版本。我似乎正在经历保龄球 (Martin)、金钱 (Feathers) 和其他类似游戏/简单示例与功能齐全的企业应用程序之间的差距。

我试图弄清楚我是否遗漏了诸如功能概念之类的东西,据我所知,它可以增加业务价值,或者在进行 TDD 时如何正确分离关注点,以及每个关注点如何应用于另一个。如果对特性的定义是硬性规则,那么日志记录和错误报告之类的东西就不是特性。这是否意味着 TDD 不提供记录和通知的方法?

不想挑起任何战争,我很确定情况并非如此,所以我告诉自己,“商业价值”必须将中间应用程序从客户的商业价值转变为企业(应用程序的创建者)的商业价值。

所以我然后尝试像这个常见的例子一样切换它来自:作为一个数学白痴当我输入 2 时,按 add,输入 2,然后按 = 我要返回 4。

致:作为监控系统的系统分析师当用户输入导致未处理错误的函数时,我想要应用程序的当前状态、抛出的异常和堆栈跟踪进入日志,并向系统分析师分发列表发送电子邮件.

然后:作为业务分析师,确保所有客户的订单都得到处理当用户提交电子订单并且路由或会计信息未验证时,我希望将无效的会计和路由信息输入日志并通过电子邮件与附加的订单文件一起发送到业务分析师用户组。除非问题是由于网络问题而无法访问数据库以查找客户信息 在日志中输入“由于网络问题而无法访问数据库以查找客户信息”并将包含错误消息的电子邮件发送到系统分析师分发列表。

然后它开始扩展到我认为完全不能接受的东西:作为电子订单完成检查收到订单时,我想检查 x12 文件是否已翻译成平面文件,如果验证或翻译日志失败并通过电子邮件发送错误,则提取订单信息和状态并将其加载到平面数据库文件被发送到队列到 as400 并且状态被更新到数据库 as400 发送确认他们收到订单并且状态被更新到数据库 as400 发送平面文件确认并且状态被更新到数据库确认被转换为 x12 并且状态被更新到数据库 x12 确认被适当地路由并且状态被更新到数据库 确认被发送到如果 x12 包含无效数据,则将状态更新到数据库中可能的错误场景。

即使您将每个功能分解为自己的“功能”,您仍然会遇到日志记录问题,通知系统分析师应用程序引发异常或发生网络错误或找不到数据库等或业务组无法识别帐号的订单是遇到等。将其中任何一个添加到类中,作为方法、属性等似乎违反了单一责任原则。大约在那个时候事情开始旋转,我头晕,呼吸急促和心悸

因此,由于这对我来说非常混乱,以至于我什至不知道如何将其作为一个清晰的问题提出来,所以我将尝试这样总结。

你如何确定何时/何地以及如何分解这些东西并将它们分开?很容易说将它们分解成提供商业价值的最小部分,但是当你不能在没有许多其他部分的情况下拥有一个部分时,“真正”的答案是什么?所有这些都不适合一个粘性。

我愿意接受包括更多书籍、教程、视频在内的答案,但我认为是否有一些现实世界的应用程序可以解释这些类型的事情,这些事情遵守敏捷和 TDD 原则,可能会提供最大的价值?诚然,我对此相对较新,但我已经阅读了 Martin/Feathers/Osherove 的书籍,我在井字游戏、保龄球、素数等方面看到了许多 katas,但没有记录,没有错误报告那种“现实世界”的东西。


让我试试别的。

我通过 ftp 从大型机获取一个文件,列出要向我们的供应商下的订单,这个文件称为摘要文件。我每 5 分钟检查一次此文件。当有文件时,我会对其进行解析,然后检查以确保我们通过 MQ 收到了此摘要文件中列出的每个订单。作为双重检查,我还会检查订单是否存在,因为如果未能收到摘要文件,我们无法确保我们收到了所有订单。话虽如此,以下似乎我正朝着正确的方向前进?

Feature: Check for the presence of a summary file
  In order to verify all orders were sent through MQ from the mainframe
  a summary file must be found to determine the expected orders.

  Scenario: A summary file has not been sent
    Given a summary file does not exist
    When I check for the existence of a file
    Then I should sleep for 5 minutes

  Scenario: A summary file has been sent
    Given a summary file does exist
    When I check for the existence of a file
    Then I should validate the summary file

Feature: Validate the summary file
  In order to process a summary file
  summary file must be valid

  Scenario: A valid summary file exists
    Given a valid summary file
    When I validate the summary file
    Then I should upload the order details to the order details DB.

  Scenario: An invalid summary file exists
    Given a invalid summary file
    When I validate the summary file
    Then I should log the errors encountered
    And email the erroneous file to the analyst email group

再次重复,用订单替换摘要。这就是我想出的。

4

3 回答 3

6

您会这​​样想:“……如果没有许多其他作品,您就无法拥有一件作品……”

故事拆分是一种技能。这需要练习,而且很难变得擅长。此页面解释了这个概念并提供了有关故事拆分的资源的链接。

以下是您在分手时遇到困难的一个想法:

作为确保所有客户订单得到处理的业务分析师当用户提交电子订单并且路由或会计信息未验证时,我希望将无效的会计和路由信息输入日志并通过电子邮件与业务分析师用户附加的订单文件一起发送团体。除非问题是由于网络问题无法访问数据库以查找客户信息 在日志中输入“由于网络问题无法访问数据库以查找客户信息”并将包含错误消息的电子邮件发送到系统分析师分发列表。

我在该段中至少看到 4 个故事:

  1. 作为一名 BA,由于帐户和路由信息无效导致订单输入失败,我希望将帐户和路由信息与订单文件一起通过电子邮件发送给 BA 组,以便有人知道获取正确的信息并重新输入订单。

  2. 作为一个BA,在由于无效账户和路由信息导致订单输入失败时,我希望将账户和路由信息输入日志,以便永久记录无效信息。

  3. 作为 BA,在由于“无法访问数据库”导致订单输入失败期间,我希望将错误消息“由于网络问题无法访问数据库以查找客户信息”通过电子邮件发送到 SA 列表,以便数据库/网络问题可以分析和改进。

  4. 作为 BA,由于“无法访问数据库”导致订单输入失败,我希望将错误消息“由于网络问题无法访问数据库以查找客户信息”写入日志,以便我们永久记录数据库/网络问题。

如果您的团队在 TDD 方面做得很好,那么分别实施这些故事应该不会太难。您的代码将受到测试的保护,因此如果有人在卡 4 上工作破坏了卡 1 的功能,希望测试能够捕获它。

于 2010-06-18T20:14:14.790 回答
3

您绝对不能直接跳到最高级的故事(x12 文件翻译,哎呀) - 当您处理不成熟的系统时,您必须将巨大的复杂功能分解为可理解的故事,您可以在迭代中估计和交付。

我将从您的第二个用户故事开始,我希望这已经足够了:

作为监控系统的系统分析师 当用户输入导致未处理错误的函数时,我想要应用程序的当前状态、抛出的异常和堆栈跟踪输入日志并发送电子邮件到系统分析师分发列表。

我首先将其进一步分解为两个用户故事:

1)作为监控系统的系统分析师,当用户输入导致未处理错误的函数时,我想要应用程序的当前状态,抛出的异常和堆栈跟踪输入日志,以便我可以诊断发生了什么并得到纠正问题的良好开端。

2) 作为监控系统的系统分析师,每当出现未处理的错误时,我希望通过电子邮件收到通知,以便我更有可能及时解决问题。

您甚至可能不需要将第一个作为用户故事单独阐述,因为现代开发平台(及其开源社区)使日志记录变得微不足道。

假设您让企业签署第二个用户故事。如果您没有使用库为您处理电子邮件,您可以立即开始练习测试驱动开发,只需考虑您想要在全局错误处理程序中做什么(它已经记录了未处理的异常)。它需要:

  • 为收件人列表获取一个或多个电子邮件地址。
  • 获取主题行。
  • 获取任何其他内容。
  • 通过您使用的任何机制发送邮件。

开始考虑将做这些事情的类,存根接口,并编写一些测试。

您对要求的进一步阐述都是附加功能。您的下一个要求将需要将不同类型的信息写入日志。之后,您需要能够向电子邮件添加附件。然后继续。每个故事可能涉及多个类,因此单一责任原则不应成为障碍。

于 2010-06-18T19:27:50.877 回答
2

我已经为此做了一些工作,所以这里有一些我写的可能会有所帮助的东西:

将愿景分解为功能、故事、场景和代码:

http://www.infoq.com/articles/pulling-power

拆分故事:

http://lizkeogh.com/2008/09/11/splitting-up-stories/

处理技术故事(记录等):

http://lizkeogh.com/2008/09/10/feature-injection-and-handling-technical-stories/

欢迎所有反馈。

于 2010-06-23T10:30:10.533 回答