1

我的任务是管理用 vc++ 6.0 编写的大型代码库,我需要开始为部分代码构建单元测试。我已经设置了 CPPUnit,它适用于我的项目 DLL,我面临的问题如下。遗留应用程序由 10 个静态库和一个包含 99% 代码的巨大可执行 MFC 应用程序组成。我的单元测试框架在同一个工作空间内的另一个项目中运行,并将测试 10 个库没问题,所有包含和引用都可以,当我尝试对大型 MFC 应用程序执行相同操作时,我收到链接器错误,因为我没有应用程序的 dll。有什么方法可以对应用程序进行单元测试,而无需将测试代码直接放在应用程序中。

4

5 回答 5

1

我的单元测试经验通常是相反的。为您的测试创建一个项目,然后从您的其他项目中导入代码。

您无法链接到 MFC 应用程序可能是因为您的函数未导出。它们存在,但与 DLL 不同,它们无法与其他应用程序进行通信。

于 2011-07-21T15:00:41.553 回答
1

你应该照原样继续:

  1. 您有一个引用库的测试应用程序。
  2. 您有一个也引用这些库的主应用程序。

将代码从主应用程序移到现有库中,或者最好将代码移到新库中。然后,您的测试应用程序可以访问更多代码,而无需引用该应用程序。

main()当应用程序的源代码由一个定义的模块和由测试应用程序测试的库中的所有其他内容组成时,您就知道何时完成。

于 2011-07-21T15:26:50.357 回答
0

我知道无法链接到可执行文件。通过将业务逻辑移动到 DLL 并将应用程序保留为“前端”来重构代码将是最明显的解决方案。但是,由于它是遗留代码,因此出于单元测试的目的简单地复制代码可能更合适。这并不理想,而且因为它是一个 MFC 应用程序,可能并不容易。

于 2011-07-21T14:59:10.833 回答
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"

但是,这本质上是一个临时修复。正如已经建议的那样,最后大部分代码应该被提取到单独的库中。

于 2011-08-03T12:09:09.333 回答
0

如果您无法重构项目以将业务逻辑移动到新的静态库中,请尝试将您的测试项目与项目的中间对象文件链接起来,您可能可以在 BigProject\debug 或 BigProject\debug\obj 中找到这些文件。您无法链接到已发现的 .EXE。

这实现了与 Chad 建议的复制过程相同的结果,同时避免了源代码的实际复制,这将是一件非常糟糕的事情。

于 2011-09-15T21:53:24.013 回答