2014-03-12 65 views
0

我正在研究一个已存在10多年的Visual C++项目。我们刚刚决定开始添加单元测试。 Out小组正在讨论两种基本的方法,以允许单元测试针对给定的类进行编写。要么我们可以派生一个类并在派生类中添加我们需要的单元测试,或者我们可以创建一个基类并将我们需要的仅移动到基类,从中派生出我们现有的类。将单元测试添加到现有的Visual C++项目

选项1:
类CExistingClass
类CDerivedClass:CExistingClass

选项2:
类CBaseClass
类CExistingClass:CBaseClass

选项1的优点是,它不需要任何对现有类的更改 - 单元测试所需的任何内容都将严格添加到单元类项目中,并且不会向我们现有的库添加任何内容。不足之处在于,当它尝试链接时,这是一场完全灾难。为了让它适用于我们的一个库,我们必须添加一个单独的后期构建步骤来执行库的静态链接版本以及将各个OBJ文件添加到其他依赖项。

选项2的优点是链接不是一个问题 - 您只能拾取基类并测试其中的项目。不足之处在于这意味着修改现有的代码,并且通常会降低软件的可读性(在10年以上的版本中,这已经太低了)。它也打开了多重继承问题的大门,我很想避免这些问题。

我一直无法找到其他任何人通过这个决策过程的讨论,并且有兴趣看看其他地方已经决定了什么,并且获得任何经验教训,或者更好,然后听到一个选项3,考虑。

回答

3

我会建议您的应用程序分为具有明确定义的接口静态库。清晰的界面边界是关键。您可以将静态库直接链接到测试DLL中。考虑每个库有一个测试DLL。

您可以将导入库直接链接到测试DLL中。这使得您可以轻松访问您的测试功能。对于非导入库,您仍然可以使用GetProcAddress FreeLibrary路由来获取在测试中直接调用的DLL导出。

或者,如果你从EXE建设有OBJ文件,添加后生成作用的OBJ文件组合成一个静态库,你可能然后在您的测试项目。

如果事情是杂乱:拔出的最小片的可单独测试代码。

必须阅读:与传统代码一起高效工作,也由Michael Feathers,Prentice Hall,2004提供。

1

也许我不完全理解你的问题,你会测试现有的代码还是重构现有的代码以用于测试目的?

从技术上讲,你不必改变你的代码,但只测试你的类的公共接口,如果问题是如何更好地解耦测试目的,我认为第二选择更好,新的基类将是抽象的,但也许我已经错过了话题

相关问题