就自动测试而言,您如何对 C++ 程序进行自动测试?是否有任何可用于进行单元测试和集成测试的自动测试框架?
5 回答
你说的是 Autotest ala Ruby Autotest吗?如果是这样,也许Watchr会为你工作。是的,你需要在你的开发机器上安装 Ruby 运行时,但是当文件系统发生变化时,它看起来几乎可以触发任何可以在命令行上完成的事情。例如,如果您希望 Watchr 在源代码树中的 .c/.cpp/.h/.hpp 文件发生更改时构建并运行您的 C++ 测试,您可以执行以下操作:
watch('src/(.*)\.[h|cpp|hpp|c]') {system "build/buildAndRunTests.bat"}
这个特定的命令显然对你的构建过程的设置方式做了一些假设(显然你在 Windows 上),但这应该是它的要点。我们的团队使用构建后事件配置我们的单元测试项目,该事件会自动运行构建的单元测试二进制文件,因此我们可以在buildAndRunTests.bat
脚本中触发构建过程的这一部分,并将结果打印到命令行。这可能需要一些调整,但看起来 Watchr 可能是一个不错的选择。当我试一试时(希望下周初),我会更新这个回复。
更新:我刚刚在我的一个 C# 项目中尝试过这个并让它在那里工作。所以我理论上它也应该适用于 C++ 项目。
autotest.watchr:
watch('./.*/.*\.cs$') {system "cd build && buildAndRunTests.bat && cd ..\\"}
注意正则表达式末尾的$ 。这很重要,因为在构建时源树中生成了很多工件,如果其中任何一个与字符串.cs匹配,它将触发另一个运行,从而有效地导致无限循环。可以想象,如果您在构建时生成/修改任何源文件,也会发生同样的事情,因此您可能必须找到一种补偿方法。
buildAndRunTests.bat:
pushd ..\
rem Build test project
"C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\devenv.com" Tests.Unit\Tests.Unit.csproj /rebuild Release
popd
rem Navigate to the directory containing the built files
pushd ..\Tests.Unit\bin\Release
rem Run the tests through nunit-console
..\..\..\Dependencies\NUnit-2.5.5-bin\net-2.0\nunit-console.exe Tests.Unit.dll /run=Tests.Unit
popd
然后,在一个单独的控制台窗口中,只需导航到您的项目目录并运行以下命令(假设autotest.watchr位于项目树的顶部,见下文):
watchr autotest.watchr
现在,当源代码树中的任何 .cs 文件发生更改时,它将自动运行buildAndRunTests.bat脚本。这只是我本地机器的一个示例,因此它可能无法在您的机器上逐字运行,但您应该能够根据需要对其进行调整。
这是供参考的目录结构:
/Project
/build
buildAndRunTests.bat
/Tests.Unit
/Dependencies
/NUnit-2.5.5-bin
/net-2.0
nunit-console.exe
autotest.watchr
我希望这有帮助。
xUnit 系列可用于单元测试。它适用于纯 C++ 代码 (CPPUNIT) 和 .Net 代码 (NUnit)。
Boost 有一个测试库,你可以看看周围的许多其他库。
您可以使用 NUnit 来实现这一点,但可能有更好的方法。使用 NUnit,您可以在托管 C++/CLI 中编写测试类,该类调用您的 C++ 代码,该代码可能以非托管方式运行。因此,对于此选项,您的一些 C++ 代码现在以托管方式运行,只是为了使用 NUnit。人们可能会争论这种方法的“纯度”。另一个问题是将调试器附加到 NUnit(当然同时启用托管/本机)并尝试以合理的方式逐步通过托管 C++/CLI 位。尽管如此,我们的办公室已经使用 NUnit 进行 C++ 单元和集成测试有一段时间了。
刚刚看到@Patrick 对 CPPUnit 的回答,我将不得不看一下。
上次我在 Qt 中做一些工作时,我使用 Qt 的 QTestLib 进行单元测试。它确实很好地满足了我的低保真需求。http://doc.qt.nokia.com/4.6/qtestlib-manual.html