2010-05-25 36 views
5

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

我真的觉得这很棒,因为(当与C#配对时)这种方法允许在编码时放松,在重构时放松和放松。我怀疑所有这些东西实际上简化了编码过程,并且它允许(最终,对我来说)以较少的脑细胞工作获得相同的结果。

之后当我尝试使用TDD搭配C++(我用Google TestGoogle Mock库),而且,我也不知道为什么,但我倒认为TDD这里是退后一步,在快速应用开发方面。

我有些时候不得不花费大量时间思考我的测试,建立适当的嘲笑,重建它们并在我的显示器上发誓。

而且,我显然不能问“我做错了什么?或者“我的方法出了什么问题?”,因为我不知道要描述什么。但是,如果有人已经习惯TDDC++(也可能是C#),你能否告诉我如何正确地做到这一点。

框架建议,架构方法,普通的编码建议 - 如果您有TDD & C++的经验,请回复。

+0

你能描述一下你用于C#的设置和C++&gmoc&gtest的设置之间最恼人的区别是什么?我在C++中使用了gdock + gtest for TDD,但是我看不到这个工具有任何缺陷,但是我没有在C#中使用xunit + moq(地狱,我没有用C#编写这么多),所以我可能不知道我错过了什么。 – chalup 2010-05-25 15:47:04

+0

嗯,我认为'jalf'实际上写了我的意见。我不能用比他更好的语言来解释这些,但是当你用C#编写代码并编写所有界面的东西等等时,它看起来很“天生”。当你试图在C++中做同样的事情时,它开始看起来像你试图强迫自己使用一些非常古怪的东西。也许这只是关于经验,并习惯以正确的方式思考。 – 2010-05-25 19:55:44

回答

3

我认为TDD在C++中比C#更难做。缺乏反思以及与静态多态性相比,常见(并且常常充分证明)不情愿依赖动态多态性(接口和遗漏)确实使得难以剔除许多类。

C++有一些非常聪明的单元测试框架,但对他们来说太聪明的事情主要是他们试图绕过语言限制。

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

在C++中,它通常是有问题的。这并不意味着它不能或不应该完成,但是当你这样做的时候,期望不得不对它做更多的努力。有时候,你可能会更好地使用另一种方法。

4

无论平台如何,TDD都需要一些练习才能获得正确的结果。有些人似乎没有意识到,你试图解决的问题的性质可能会对你如何轻松地将TDD应用于解决方案产生重大影响。过去我遇到了一些问题,我知道我想要走的解决方案,但要弄清楚如何以似乎符合TDD模型的方式解决问题非常困难。现在有几个原因可能会发生,而且不可能说出处理这种情况的“正确”方法。

在这一点上,我遇到这种问题的第一反应是重新检查我对这个问题的原始假设。我是否比它所需要的更复杂?我是否试图编写测试来达成我已经决定的设计,而不是让测试指导设计?这只是一个时髦的问题,我需要接受典型的TDD方法在这种情况下不起作用吗?

对于这一个有趣的讨论,你可以看看this blog post从Bob大叔马丁,他谈到由罗恩杰弗里斯企图create a Sudoku Solver using TDD,它并没有真正的工作。现在因为这种尝试没有产生好的解决方案并不意味着TDD没有用处,而只是意味着解决的问题更加复杂,并不适用于TDD的紧急设计方法。

1

我觉得测试驱动开发很难做到正确,有时测试只是流动,有时需要一些跳跃。为了保持速度,我经常离开TDD方法。这对我来说不是问题,因为我为所有已完成的代码维护了一套完整的单元测试(允许在编码新比特和重构时放松)。