【问题标题】:SpecFlow/BDD for Unit Tests?用于单元测试的 SpecFlow/BDD?
【发布时间】:2011-05-08 08:50:47
【问题描述】:

似乎互联网没有明确的答案,也没有一套原则来帮助我回答这个问题。所以我求助于 SO 上的伟大人物来帮助我找到答案或指导思想:)

SpecFlow 对于 .NET 中的 BDD 非常有用。但是当我们谈论 BDD 时,我们只是在谈论集成/验收测试,还是我们也在谈论单元测试——完全替代 TDD?

我只在小型项目中使用过它,但我发现即使对于我的单元测试,SpecFlow 也改进了代码文档和语言方面的思考。 Converseley,我无法在一个地方看到完整的测试代码 - 因为这些步骤是零散的。

现在给你…………

编辑:我忘了提到我在 RoR 社区中看到 RSpec,它使用 BDD 样式的语法进行单元测试。

【问题讨论】:

  • 在计算每种测试的数量时,您应该想到一个三角形。底部是单元,中间是集成,顶部是 UI 测试。 Int & UI 测试是肯定的,但是你希望编写的单元测试的绝对数量应该使 SpecFlow 对于单元测试不切实际。

标签: bdd specflow


【解决方案1】:

我最近开始使用 SpecFlow 进行 BDD 测试,但我仍然使用单元和集成测试。

基本上,我将测试分成单独的项目:

  • 规格
  • 集成
  • 单位

我的单元测试用于测试单个方法,不执行任何数据库调用或任何外部引用。我对与外部资源(例如数据库或 Web 服务等)交互的单个方法调用(有时可能是两个)使用集成测试。

我使用 BDD 来描述模仿项目业务/领域需求的测试。例如,我会有项目发票生成功能的规范;或使用购物篮。这些测试遵循

作为用户,我想,为了

语义类型。

我的建议是根据您的需要拆分测试。避免尝试使用 SpecFlow 执行单元测试。

【讨论】:

  • 这正是我们所做的。你确定我们不在同一家公司工作??它运作良好。我们还让我们的 QA 编写一些 BDD 测试。
  • 我同意,它对我也很有效。刚开始时,我曾经在同一个项目中进行所有测试 - 重大错误!
  • 是的,我也是这样做的。老实说,我没有区分规格和单位。但是哲学是存在的,我们都同意我们可以使用 BDD(在这种情况下为 SpecFlow)进行单元测试。客户甚至不关心单元测试,但我们仍然使用 Cucumber 语法进行仅限开发人员的测试。
  • 其实我看错了你的评论。看起来您不认为使用 BDD 进行单元测试是个好主意。
  • 你知道,我一直在思考这个问题,总的来说我仍然不会使用 BDD 进行单元测试。我发现自己使用上下文/规范方法,例如 MSpec 或 NSpec 进行单元测试。这种方法仍然允许描述性的测试命名,并提供关于“单元”如何工作的清晰文档。对于项目的实际功能,我仍然会使用 BDD。
【解决方案2】:

我们甚至已经开始使用 Specflow 进行单元测试。

这样做的主要原因(和好处)是我们发现它会迫使您从行为的角度编写测试,这反过来又会迫使您以更加与实现无关的方式进行编写,这最终会导致测试它们不那么脆弱,对重构更友好。

当然,这也可以使用标准单元测试框架来完成,但您不会像我们发现使用 specflow 和 gherkin 语法那样容易地指导您。

为 specflow 设置一些开销,但我们发现当您进行大量测试(由于您可以通过 specflow 获得重要的步骤可重用性)或您需要重构您的实现时,这很快就会得到回报。

此外,您还可以获得易于团队新人理解的可读性很好的规范。

【讨论】:

    【解决方案3】:

    鉴于:

    • 单元测试是对(小)“代码单元”的测试
    • 大多数“代码单元”的客户是其他程序员。
    • 进行单元测试的部分原因是提供如何调用代码的示例。

    因此:

    • 显然,单元测试通常应该用“代码单元”的用户调用它的编程语言编写。

    但是:

    • 有时需要数据表来设置单元测试运行的条件。
    • 大多数单元测试框架都不擅长使用数据表。

    因此:

    • Specflow 可能是某些单元测试的最佳选择,但不应该是您的默认选择。

    【讨论】:

      【解决方案4】:

      我将其视为一种集成测试,这意味着它不会取代作为 TDD 流程的一部分编写的单元测试用例。对此会有不同的看法。恕我直言,单元测试用例只测试方法/功能,所有依赖项都应该被模拟和注入。在进行集成测试时,您将注入真正的依赖项而不是模拟的依赖项。您可以使用任何单元测试框架进行相同的集成测试,但 BDD 为您提供了一种更简洁的方式来解释使用纯英语(或任何本地化语言)的领域特定语言的集成测试用例。

      塔,
      Rajeesh

      【讨论】:

      • 感谢您的贡献。它突出了我在使用 BDD 进行单元测试时是如何分心的。
      【解决方案5】:

      我使用 specflow 在两个不同大小的应用程序上进行 BDD 测试。一旦我们解决了句子命名约定的问题,结果就很好了。 BA 和 QA,甚至实习生都可以为应用程序编写 BDD 测试。

      不过,我也将它用于单元测试。异端!我能听到你们中的一些人尖叫。然而,这有很好的理由。该系统负责根据许多不同的数据进行许多计算或确定。由于许多单元测试需要输入所有这些数据以用于测试目的,因此通过 specflow 提供的表格格式管理用于单元测试的数据变得更加容易。以表格形式有效地模拟数据存储库,允许对不同的组件进行积极测试。

      我不知道我是否会在所有情况下都这样做,但在我使用它的情况下,它使得执行单元测试所需的大量数据的布局变得更加容易和清晰。

      【讨论】:

        【解决方案6】:

        最后,我们试图向客户提供客户想要的东西,因此我真的不认为除了 SpecFlow 之外还需要编写单元测试。毕竟,它使用相同的代码库。我对BDD/ATDD/TDD 还很陌生,但除了“完整”和严格遵守 TDD 之外,我发现没有必要编写更多的单元测试。

        现在我想如果团队分散并且开发人员无法运行整个应用程序,那么单独的单元测试将是必要的,但开发人员可以访问整个代码库并能够运行应用程序,那为什么还要写更多的测试呢。

        【讨论】:

        • 假设您的应用程序需要一个自定义集合,那不需要一组单元测试来覆盖所有代码路径吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-20
        • 2011-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-24
        • 1970-01-01
        相关资源
        最近更新 更多