我有一个Visual Studio2005 C++项目,它是一个控制台应用程序。
我想开始在测试工具下获得一些代码,但我遇到了一些我不知道如何最好地处理的问题。
我不希望我的大部分测试代码在生产环境中以普通的.exe结束,所以我认为最好为我的测试创建一个单独的项目。第一个问题,这个新项目将如何调用其余的代码?我应该让我的遗留代码成为只有一个入口点的.lib或.dll,并创建一个单独的项目来调用我的遗留代码的main吗?
我是否应该尝试一个丑陋的技巧,将我所有的测试放在完全是#ifdef TESTING的文件中,这样代码就不会在我的生产.exe中结束?如果是这样,我应该如何有条件地加载我的测试框架?使用单独的属性配置进行测试?
我基本上是在寻找任何关于如何在Visual C++中获得遗留.exe项目的测试工具的建议
发布于 2009-07-21 01:26:31
首先,我强烈推荐Michael Feather的书"Working Effectively with Legacy Code"。这一切都是关于如何将自动化单元测试添加到没有测试的遗留应用程序中。如果你想知道“我如何开始测试这堆代码”,那么这本书就是为你准备的。
Michael也是CppUnit的作者,这是一个类似于C++代码的开源NUnit测试框架。你可以在这里找到它:http://sourceforge.net/projects/cppunit/。
添加测试的一种快捷方法是将UnitTest配置添加到解决方案中。这种配置将编译您的代码,但是不是将它链接到您的main.CPP,而是将您的main.cpp从构建中排除,并包含UnitTestMain.cpp,您将在其中发出调用以执行单元测试。我们很久以前就开始这样做了,当时我们并不知道更好的方法。但是,您最终会花费大量时间,包括和排除各种配置的各种testMyCode.cpp模块,一段时间后,它会变得很累。我们发现开发人员不太喜欢这种方法。
一种更好的方法是将单元测试项目添加到解决方案中,并在实际项目上建立生成依赖项。如果项目名为Foo.vcproj,则将其命名为Foo_test.vcproj。这个项目只包含您的测试代码,它#包含您的Foo头文件,并且它链接到您已编译的fooCode.obj模块。添加一个调用来执行Foo_test.exe作为Foo_test构建的构建后步骤,它会在构建期间自动运行单元测试。如果任何单元测试失败,构建就会失败。如果您在构建服务器上配置了门控签入,则没有人可以签入破坏现有测试的更改。
发布于 2009-07-21 01:18:13
我认为将大多数被测试的代码放在库中是最好的,但不一定在所有情况下都是实用的。
一种解决方案是有一个单独的项目配置(例如,Debug、Release和Test),并将测试代码放在单独的文件中,这些文件在Debug和Release配置下被标记为“从构建中排除”。您可以使用简单的代码在#ifdef中启动测试,也可以使用包含在非测试构建中的测试运行器的存根版本。
另一种选择(尽管有点黑客风格)是让您的测试代码从WinMain运行,而您的生产代码从常规的旧main运行。当您使用"Windows“子系统构建时,您的测试将运行,而当您为Console子系统构建时,您的生产代码将运行。不过,我不知道链接器是否会从生产版本中删除未调用的测试函数。
https://stackoverflow.com/questions/1156816
复制相似问题