TDD:从哪里开始第一次测试

标签 tdd agile

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

3年前关闭。




Improve this question




所以我已经完成了一些单元测试,并且有编写测试的经验,但我还没有完全接受 TDD 作为设计工具。

我当前的项目是重新设计一个现有系统,该系统生成序列号作为公司组装过程的一部分。由于查看了现有系统,我了解了当前的流程和工作流程。我还有一个新需求列表以及它们将如何修改工作流程。

我觉得我已经准备好开始编写程序了,我决定强制自己最终从头到尾做 TDD。

但现在我不知道从哪里开始。 (我也想知道我是否因为已经对用户的程序流程有了一个概念而欺骗了 TDD 过程。)

用户流程实际上是连续的,只是一系列步骤。例如,第一步是:

  • 用户提交制造订单编号并收到该订单 Material list 的可序列化零件编号列表

  • 当用户选择其中一个部件号时,下一步开始。

    所以我想我可以用这第一步作为起点。我知道我想要一段代码,它接受一个制造订单号并返回一个零件号列表。
    // This isn't what I'd want my code to end up looking like
    // but it is the simplest statement of what I want
    IList<string> partNumbers = GetPartNumbersForMfgOrder(string mfgOrder);
    

    阅读 Kent Becks 示例书,他谈到了选择小测试。这似乎是一个相当大的黑匣子。它需要一个制造订单存储库,我必须爬取一个产品结构树来找到这个制造订单的所有适用部件号,我什至没有在代码中定义我的域模型。

    所以一方面,这似乎是一个糟糕的开始——一个非常普遍的高级功能。另一方面,我觉得如果我从较低的级别开始,我真的只是在猜测我可能需要什么,这似乎是反 TDD 的。

    作为旁注……这是您使用故事的方式吗?

    作为一个组装者
    我想获得制造订单上的零件编号列表
    这样我就可以选择要序列化的

    说实话,装配工永远不会这么说。汇编程序只需要完成按制造顺序的操作:

    作为汇编
    我想用序列号标记零件
    这样我就可以完成对mfg订单的操作

    最佳答案

    这是我将如何开始。假设您完全没有此应用程序的代码。

  • 定义用户故事及其带来的业务值(value):“作为用户,我想提交制造订单编号和该订单的零件编号列表,以便我可以将列表发送到库存系统”
  • 从用户界面开始。创建一个非常简单的页面(假设它是一个 Web 应用程序),其中包含三个字段:标签、列表和按钮。这已经足够好了,不是吗?用户可以复制列表并发送到 inv 系统。
  • 使用模式作为设计的基础,例如 MVC。
  • 为从 UI 调用的 Controller 方法定义测试。您在此处测试 Controller 是否正常工作,而不是数据是否正确:Assert.AreSame(3, controller.RetrieveParts(mfgOrder).Count)
  • 编写 Controller 的简单实现以确保返回某些内容:return new List<MfgOrder>{new MfgOrder(), new MfgOrder(), new MfgOrder()};例如,您还需要为 MfgOrder 实现类。
  • 现在您的用户界面正在运行!工作不正确,但工作正常。因此,让我们期待 Controller 从服务或 DAO 获取数据。在测试用例中创建一个 Mock DAO 对象,并添加调用方法“partsDao.GetPartsInMfgOrder()”的期望。
  • 使用该方法创建 DAO 类。从 Controller 调用该方法。您的 Controller 现已完成。
  • 创建一个单独的测试来测试 DAO,最后确保它从数据库返回正确的数据。
  • 不断迭代,直到完成所有工作。过一会儿,你就会习惯了。

  • 这里的要点是将应用程序分成非常小的部分,并单独测试这些小部分。

    关于TDD:从哪里开始第一次测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/935349/

    相关文章:

    php - TDD与封装优先级冲突

    ruby - 准备调用一个封闭的数据库 rails rspec

    project-management - 敏捷 - 任务分解 - 估计与否?

    java - 面向对象设计和数据库设计过程

    javascript - 如何在不启动任何 Jasmine 测试的情况下运行 Karma 服务器

    .net - 当数据库中数据不可用时测试 SQL Server 存储过程的任何工具。

    architecture - 测试驱动开发是否将重点放在设计上?

    frontend - 软件开发/项目中 "backend"和 "frontend"的定义/区别是什么?

    agile - 小团队的项目方法

    ruby-on-rails - Ruby on Rails 应用程序中的 Rspec 应该测试什么测试