我的任务是管理用vc ++ 6.0编写的大型代码库,我需要开始构建部分代码的单元测试。我已经设置了CPPUnit,它适用于我的项目DLL,我面临的问题如下。遗留应用程序由10个静态库和一个包含99%代码的巨大可执行MFC应用程序组成。我的单元测试框架在同一工作区内的另一个项目中运行,并将测试10个库没有问题,所有包含和引用都可以,当我尝试对大型MFC应用程序执行相同操作时,我得到链接器错误,因为我没有应用程序的DLL。有没有办法对应用程序进行单元测试,而无需将测试代码直接放在应用程序中。
答案 0 :(得分:1)
我对单元测试的经验通常恰恰相反。为您的测试创建一个项目,然后从其他项目中导入代码。
您可能无法链接到MFC应用程序,因为您的功能未导出。它们存在,但与DLL不同,无意与其他应用程序通信。
答案 1 :(得分:1)
你应该继续:
将代码从主应用程序移动到现有库中,或者最好将代码移动到新库中。然后,您的测试应用程序可以访问更多代码而无需引用该应用程序。
当你完成应用程序的源包含一个定义main()
的模块和库中由测试应用程序测试的所有其他内容时,你就知道了。
答案 2 :(得分:0)
我知道无法链接可执行文件。通过将业务逻辑移动到DLL并将应用程序保留为"前端"来重构代码。将是最明显的解决方案。但是,由于它是遗留代码,因此为了单元测试而简单地复制代码可能更合适。这并不理想,因为它是一个MFC应用程序可能并不容易。
答案 3 :(得分:0)
要测试您的主应用程序,您可以设置一个测试项目,其中包含您要测试的源文件 - 不确定使用VC6实现它是多么容易,但是没有它,但是在VS2005及更高版本中这是非常直截了当。
因此,在您的解决方案中,您最终得到的结构如下:
MyLegacySystem.sln
MyApplication.proj
Main.cpp
BusinessRules.cpp
MyApplicationUnitTests.proj
UnitTestsMain.cpp
BusinessRules.cpp
BusinessRulesTests.cpp
如果出于某种原因无法在2个项目中包含源文件,可以通过调用预处理器魔法将源代码放入测试项目中:
BusinessRulesStub.cpp:
#include "..\src\BusinessRules.cpp"
但是,这实际上是一个临时修复。正如已经建议的那样,最终应将大部分代码提取到单独的库中。
答案 4 :(得分:0)
如果您无法重构项目以将业务逻辑移动到新的静态库中,请尝试将测试项目与项目的中间对象文件链接,您可以在BigProject \ debug或BigProject \ debug \ obj中找到它们。您无法链接到您发现的.EXE。
这与Chad建议的复制过程实现了相同的结果,同时避免了源代码的实际重复,这将是一件非常糟糕的事情。