C++和正确的TDD

7

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

我认为这非常棒,因为(与C#配合使用),这种方法允许在编码、投影和重构时放松。我怀疑所有这些TDD的东西实际上简化了编码过程,并且,它使我(最终)用更少的大脑细胞得到了相同的结果。

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

有些时候,我不得不花费大量时间思考我的测试,构建适当的模拟,重新构建它们并在我的显示器前发誓。

显然,我不能问像“我做错了什么?”或“我的方法有什么问题?”这样的问题,因为我不知道该如何描述。但是,如果有任何习惯于在C++(和可能是C#)中使用TDD的人,请指导我如何正确地做到这一点。

如果您有TDD & C++方面的经验,请给出框架建议、架构方法、简单的编程建议-请回复。


你能描述一下你用于C#的设置和C++&gmoc&gtest的设置之间最令人讨厌的区别吗?我已经在C++中使用了gmock+gtest进行TDD,我看不出这些工具有任何缺陷,但是我没有在C#中使用过xunit+moq(天哪,我在C#中编程并不多),所以我可能不知道我错过了什么。 - chalup
我认为jalf实际上表达了我的观点。我无法用比他更好的措辞来解释这一点,但是当你在C#中编写所有接口内容时,它看起来非常“本地化”。当你尝试在C++中做同样的事情时,它开始看起来像是你在强迫自己使用一些非常奇怪的东西。也许这只是关于经验和习惯以正确的方式思考。 - M. Williams
4个回答

4
TDD是一种需要实践才能掌握的技能,不论在哪个平台上。有些人似乎没有意识到,问题的本质会对如何轻松地将TDD应用于解决方案产生很大影响。过去我曾遇到过这样的问题:我知道我想要达成的解决方案,但是很难找到一种方法来分解问题,使其符合TDD模型。现在出现这种情况的原因有很多,而且无法确定处理这种情况的“正确”方式是什么。
在遇到这种问题时,我的第一反应是重新审视我对问题的最初假设。我是否让它变得比必要的复杂?我是否试图编写测试以达到我已经决定的设计,而不是让测试引导设计?它只是一个奇怪的问题,我需要接受典型的TDD方法在这种情况下行不通吗?

如果你对此有兴趣,可以查看 Uncle Bob Martin 的this blog post,其中他谈到 Ron Jeffries 尝试使用 TDD create a Sudoku Solver using TDD 的经历,但并没有真正起作用。现在,这个尝试没有产生好的解决方案,并不意味着 TDD 是无用的,只是意味着被解决的问题更加复杂,并且不适合于 TDD 的紧急设计方法。


4
我认为在C++中进行TDD比在C#中更加困难。缺乏反射机制,以及普遍(并且通常有充分理由)不愿意依赖动态多态性(接口和继承)相比静态多态性确实使得模拟许多类更加困难。
对于C++来说,有一些非常聪明的单元测试框架,但它们之所以聪明,主要是因为它们试图规避语言限制。
TDD最适用于动态语言。在Python中,这是一种很好的工作方式。在C#中也可以做到(虽然不是动态的,但具有全面的反射功能)。
在C ++中,这通常会带来问题。这并不意味着不能或不应该这样做,但当你这样做时,请期望需要更加努力地工作。有时候,您可能最好使用完全不同的方法。

2

1

我发现始终正确地进行测试驱动开发非常困难;有时测试很顺利,有时需要跳过一些步骤。为了保持速度,我经常放弃TDD方法。这对我来说不是问题,因为我为我完成的所有代码维护了完整的单元测试集(允许在编写新代码和重构时放松)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接