【问题标题】:C++ & proper TDDC++ 和适当的 TDD
【发布时间】:2011-02-23 18:18:04
【问题描述】:

嗨!我最近尝试在C# 开发一个小型项目,在整个项目过程中,我们的团队使用了测试驱动开发(TDD)技术(xunit, moq)。

我真的认为这很棒,因为(与C# 搭配使用时)这种方法允许在编码时放松,在投影时放松,在重构时放松。我怀疑所有这些TDD-stuff 实际上简化了编码过程,而且,它允许(最终,对我来说)在更少的脑细胞工作的情况下获得相同的结果。

在那之后,我尝试使用 TDDC++ 配对(我使用了 Google TestGoogle Mock 库),而且,我不知道为什么,但我实际上认为这里的 TDD 是退一步快速应用程序开发方面的术语。

有时我不得不花费大量时间思考我的测试、构建适当的模拟、重建它们并对我的显示器发誓。

而且,我显然不能问诸如“我做错了什么?”之类的问题。或“我的方法出了什么问题?”,因为我不知道该描述什么。但是,如果有任何人习惯于TDDC++(可能还有C#),请您告诉我如何正确执行此操作。

框架建议、架构方法、简单编码建议 - 如果您对 TDD & C++ 有经验,请回复。

【问题讨论】:

  • 您能否描述一下您用于 C# 的设置与 C++ & gmoc & gtest 的设置之间最烦人的区别是什么?我在 C++ 中使用 gmock+gtest 进行 TDD,我看不出这个工具有任何缺陷,但是我没有在 C# 中使用 xunit + moq(见鬼,我没有在 C# 中编写那么多程序),所以我可能不知道我错过了什么。
  • 嗯,我认为jalf 实际上写了我的意见。我无法比他更好地用语言来解释这一点,但是当你用 C# 编写代码并编写所有接口等内容时,它看起来很漂亮native。当你尝试在 C++ 中做同样的事情时,它开始看起来像是在试图强迫自己使用一些非常古怪的东西。也许这只是关于经验和习惯以正确的方式思考。

标签: c# c++ performance tdd


【解决方案1】:

我认为 TDD 在 C++ 中比在 C# 中更难实现。与静态多态性相比,缺乏反射以及通常(并且通常是有充分理由的)不愿依赖动态多态性(接口和继承)确实使得模拟许多类变得更加困难。

有一些非常聪明的 C++ 单元测试框架,但它们的聪明之处主要在于它们试图绕过语言限制。

TDD 在动态语言中效果最好。这是在 Python 中工作的好方法。它在 C# 中是可行的(不是动态的,但具有全面的反射能力)

在 C++ 中,这通常是有问题的。这并不意味着它不能或不应该完成,但是当你这样做时,预计必须更加努力地工作。有时,完全使用另一种方法可能会更好。

【讨论】:

    【解决方案2】:

    无论平台如何,TDD 都需要一些练习才能正确。有些人似乎没有意识到,您尝试解决的问题的性质会对您将 TDD 应用于解决方案的难易程度产生重大影响。过去我遇到过一些问题,我知道我想要采取的解决方案,但是很难弄清楚如何以似乎适合 TDD 模型的方式分解问题。现在有几个原因导致这种情况发生,并且不可能说处理这种情况的“正确”方法是什么。

    此时,我遇到此类问题的第一反应是重新审视我对问题的最初假设。我是否让它变得比需要的更复杂?我是否正在尝试编写测试以达到我已经决定的设计,而不是让测试指导设计?这只是一个时髦的问题吗?我需要接受典型的 TDD 方法在这种情况下不起作用?

    有关此问题的有趣讨论,您可以查看 Bob Martin 叔叔的 this blog post,他在其中谈到了 Ron Jeffries 对 create a Sudoku Solver using TDD 的尝试,但它并没有真正起作用。现在因为这种尝试没有产生好的解决方案并不意味着TDD没有用,只是意味着要解决的问题更复杂,不适合TDD的紧急设计方法。

    【讨论】:

      【解决方案3】:

      尝试最简单的方法 - CxxTest

      【讨论】:

        【解决方案4】:

        我发现测试驱动开发一直很难正确进行;有时测试只是流畅,有时需要一点跳跃。为了保持速度,我经常远离 TDD 方法。这对我来说不是问题,因为我为我“完成”的所有代码维护了一整套单元测试(在编码新位和重构时允许放松)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-24
          • 1970-01-01
          • 1970-01-01
          • 2011-06-08
          • 1970-01-01
          • 1970-01-01
          • 2011-06-10
          • 2011-12-24
          相关资源
          最近更新 更多