【问题标题】:.NET... How to TDD with flat files [closed].NET ...如何使用平面文件进行 TDD [关闭]
【发布时间】:2010-07-20 09:37:19
【问题描述】:

我有一个项目,其中大部分挑战是确保软件能够正确处理多个外部系统输出的纯文本文件。

管理层决定引入敏捷和 TDD 作为一种特殊的实现方式。

我发现从平面文件模拟输入没有意义,因为要解决的主要问题是完全正确地处理这些特定文件。

例如如果外部系统中的输出发生变化,则单元测试必须失败。

对从文件中抽象出来的代码进行单元测试几乎没有意义,并且创造的业务价值也很少(因为抽象的代码需要很长时间才能被抽象出来,实际上会产生一百行方法)。

只是想重申一下 - 挑战在于密切关注能够处理平面文件的软件,而 TDD 是要使其随时可验证。

会有什么建议?如何组织、定义和实施?

【问题讨论】:

  • 如果我缩小问题范围可能会更容易。是否有任何自动化软件可用于处理平面文件作为单元测试的输入/输出。我们将使用 VS2010 单元测试和 Moq 进行模拟。

标签: c# .net tdd agile


【解决方案1】:

在您的测试项目中包含示例文件,并使用这些文件进行测试。我倾向于将文件构建到测试程序集中并使用Assembly.GetManifestResourceStream 将其传递到代码中。在 API 中使用 StreamTextReader 还意味着您可以使用 MemoryStreamStringReader 对测试代码本身中的数据进行非常小的测试。 (除非您需要担心检测编码,否则使用TextReader 可能比Stream 更合适。)

您可以使用StringReader 完成全部,但根据我的经验,如果您最终得到几行测试数据,它可能会变得相当混乱 - 单独的文件可以更容易地查看数据参与。

请注意,此检查外部系统的输出是否未更改 - 正如 Pontus 所说,这将涉及系统/集成测试。但是,根据我的经验,您不想大部分在该级别进行测试。您应该混合不同级别的测试,但测试级别越高,运行所需的时间可能越长 - 设置起来可能就越困难。

可能想要测试外部系统的测试:有一段您希望从外部系统接收的样本数据,并有一个单元测试您的代码测试它的行为是否适当,以及一个“外部”测试调用外部系统并检查它们是否生成了准确的文件。这样一来,您就可以非常快速地判断故障是由于您的代码更改还是外部系统更改造成的。

【讨论】:

  • 这是个有趣的建议。谢谢乔恩
【解决方案2】:

这听起来根本不像测试驱动开发或单元测试:您所描述的是外部系统的集成监控和/或system testing。您是在描述生产环境还是开发环境场景?如果文本文件发生变化,谁应该适应(您的消费者或生产系统)?

无论您做什么,请确保您有一个明确定义的合同,指定形成系统与外部系统接口的文本文件的格式和内容。如果可能,在生产环境中实施监控功能,如果源系统偏离合同,则会触发警告。

【讨论】:

  • 开发人员甚至高级人员对此都没有发言权。并且在环境中无法定义任何东西。所以是的,它是集成,但必须实施以产生类似 TDD 的结果......不幸的是,我无法改变它......而且 - 消费者总是必须改变。
  • 好的,你的管理层不知道他们在说什么。那很糟。而且并不少见。 OTOH,他们会知道你实际做什么吗?无论他们说什么想要,你能找到一种方法来做他们真正需要的吗?
  • 那是不同的。必须实现的目标始终是已知的。但这取决于BA而不是经理。 BA 对哪种方式不感兴趣(TDD 或 casio 计算器或废纸)。
【解决方案3】:

平面文件的格式有规范吗?

如果是这样,您应该包含具有规范每个功能的示例文件,并为每个功能编写测试。

如果平面文件不符合规范,您就不能真正对它们执行 TDD - 您可能总是有一个新文件,其中包含未知内容。在这种情况下,您必须编写自己的规范(基于观察/研究)和针对该规范的 TDD。但是您仍然会对破坏您的代码的未知数据持开放态度。

道德?确保您至少有一份工作实践规范。

【讨论】:

  • 我们没有工作实践规范。老实说,这就是我想要创造的。所谓的组长根本不知道他在说什么。他希望我们实施一切,他只会向最高经理报告。简单。
【解决方案4】:

从 .NET 的角度来看,平面文件本质上是字符串,所以我会围绕测试输入和输出字符串来设计我的大部分 API。

如果这些字符串太大,您可以将它们嵌入到单独的文件中,但最好的测试实践是将每个测试用例减少到重现/执行某个功能所需的最低限度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多