gpt4 book ai didi

c++ - 使用 CppUnit 链接测试库

转载 作者:IT王子 更新时间:2023-10-29 00:59:26 24 4
gpt4 key购买 nike

我正在使用 CppUnit 设置一堆单元测试,但我遇到了没有运行任何测试的问题。该项目分为几个小库,我计划以相同的方式划分单元测试类,然后将它们全部链接到一个测试程序中。问题是,测试类在它们自己的库中,除非我明确调用它们,否则它们不会链接到主测试程序中,即我必须放入

runner.addTest( TestClass::suite() );

单独针对每个测试类,不能使用 TestFactoryRegistry 的 makeTests() 方法来获取测试列表。如果我只是将它们全部编译在顶层目录中,makeTests() 方法可以正常工作,但如果可以的话,我不想将所有测试类放在一个位置。

CppUnit 文档给出了以下小提示

Linking problem when using Helper macros ?

When you create a project and write its unit test suites, the work is made easier through the use of the so-called helper macros : CPPUNIT_TEST_SUITE_NAMED_REGISTRATION, CPPUNIT_REGISTRY_ADD and CPPUNIT_REGISTRY_ADD_TO_DEFAULT. The problem is that if you use those macros in the source code file of a TestFixture class (say MyTest as an example), and if you use a line like this one

runner.addTest( CppUnit::TestFactoryRegistry::getRegistry().makeTest()

);

in your main() function in file main.cpp, there will have no test run at all !

The reason is simply that the link stage, one of the step of the build process, do not insert the object files (.obj or .o files) in the final executable if there is no undefined symbol in your main.cpp.

That way, the object code which contains the AutoRegister static variables instantiation is not part of the final executable and is not able to insert oneself into the runner in the main() function.

You have to create an undefined symbol in main.cpp so that the mytest.o file is integrated with main.o into the final executable.

Trick committed by Michel Nolard

但没有说明如何进行这项工作,我只是够密集,无法自己弄清楚或在网上找到一个例子。

现在我可以为每个库做一个单独的可执行测试,最后我可能会这样做,但我想先尝试让它工作,所以我只需要运行一个测试程序来测试整个事物。关于如何让它发挥作用的任何想法/示例?

最佳答案

通过向 main 添加一个 undefined symbol ,他只是意味着创建任何随机外部符号以强制链接器搜索包含测试代码的外部库。

例如,假设有两个测试库 fred 和 barney,您只需在 fredTestLib.cpp 中添加以下行:

int fredDummyInt = 0; // declare a unique symbol for the linker to resolve

在 barneyTestLib.cpp 中,您将添加类似的行:

int barneyDummyInt = 0; // a different unique symbol for the linker to resolve

您可以在不同的步骤中分别编译每个库。在主测试程序中,您然后强制链接器解析它们。所以将这些行添加到 main.cpp 中:

extern int fredDummyInt;
extern int barneyDummyInt;
...
main () {
...
fredDummyInt++; // give the linker some symbols to resolve
barneyDummyInt++;
...

这个想法(根据上面技巧的作者所说)是因为链接器已经在 fredTest.lib 中搜索 fredDummyInt,它还会找到并解析您自动注册的测试。

注意:我还没有试过这个,看它是否有效!我只是在回答你关于外部的问题。

要考虑的另一种方法是在 DLL 中创建测试,并使用 LoadLibrary() 显式地让它们运行。对于矫枉过正,如果你使用 MfcUi::TestRunner,你可能会构建一个小的下拉 GUI 东西,让你选择要加载的库,加载它,然后显示要在该库中运行的测试,然后运行它们。

关于c++ - 使用 CppUnit 链接测试库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1016197/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com