我正在从事已存在10年以上的Visual C ++项目。我们刚刚决定开始添加单元测试。 Out小组正在讨论两种基本方法,以允许针对给定的类编写单元测试。我们可以派生一个类并在派生类中添加我们需要的单元测试,或者我们可以创建一个基类并将我们需要的东西移动到基类中,从中派生我们现有的类。
选项1:
CExistingClass类
class CDerivedClass:CExistingClass
选项2:
CBaseClass类
class CExistingClass:CBaseClass
选项1的优点是它不需要对现有类进行任何更改 - 单元测试所需的任何内容都严格地添加到单元类项目中,并且不会向现有库添加任何内容。缺点:当尝试链接时,这是一场彻底的灾难。为了让它适用于我们的一个库,我们必须添加一个单独的post构建步骤来执行库的静态链接版本,以及将单个OBJ文件添加到Additional Dependencies。
选项2的优点是链接不是问题 - 您只选择基类并测试其中的项目。缺点是这意味着修改现有代码并且通常会降低软件的可读性(在10年以上之后,软件的可读性已经太低了)。它还打开了多重继承问题的大门,我真的想避免这种问题。
我还没有能够找到其他人经历这个决策过程的讨论,并且有兴趣看看在其他地方已经做出的决定并获得任何经验教训,或者更好,并且听到我们避开的选项3 #39; t考虑。
答案 0 :(得分:3)
我建议将应用程序拆分为具有明确定义接口的静态库。清晰的界面边界是关键。您可以将静态库直接链接到测试DLL。考虑每个库有一个测试DLL。
您可以将导入库直接链接到测试DLL。这样可以轻松访问您的功能以进行测试。对于非导入库,您仍然可以访问GetProcAddress& LoadLibrary& FreeLibrary路由获取在测试中直接调用的DLL导出。
或者,如果您有来自EXE构建的OBJ文件,请添加一个构建后操作以将OBJ文件组装到静态库中,然后您可以将其包含在测试项目中。
如果事情变得混乱:拿出可以单独测试的最小代码。
必须阅读:有效地使用遗产代码,同样由Michael Feathers,Prentice Hall,2004年。
答案 1 :(得分:1)
也许我完全不了解您的问题,您是否会测试现有代码或重构现有代码以进行测试?
从技术上讲,您不必更改代码,但只测试类的公共接口,如果问题是如何更好地解析测试目的,我认为第二选择更好,新基类将在哪里是抽象的,但也许我错过了这个话题