代码之家  ›  专栏  ›  技术社区  ›  ratkok

如何通过在运行时选择单元测试来运行CPPUnit中的单元测试子集?

  •  6
  • ratkok  · 技术社区  · 14 年前

    我使用CppUnit作为单元测试框架。是否可以选择测试用例的子集在运行时执行?

    3 回复  |  直到 14 年前
        1
  •  5
  •   John Deters    6 年前

    您可能在main()中调用的TestRunner::run()方法实际上有可选参数:run(std::string testName=“”,bool doWait=false,bool doprintreult=true,bool doPrintProgress=true)。testName必须是测试的特定名称。如果需要,您可以按名称请求特定的测试。还可以对特定测试调用runTest(Test*),或者调用runTestByName(testName)。

    但听起来你想变得更成熟。假设您使用CPPUNIT\u TEST\u SUITE\u REGISTRATION()宏注册了所有测试,静态TestFactoryRegistry::makeTest()方法将返回所有已注册测试的TestSuite。

    TestSuite对象通过getTests()方法生成一个向量。您可以遍历它们,将它们的名称与regexp(或按索引号或您想要的方式)匹配,而不是像大多数人那样在整个套件上调用TestRunner::addTest(registry.makeTest()),只需添加您请求的特定测试。

    您必须编写一些东西来迭代测试并进行匹配,但除此之外,它应该非常简单。可能有十几行代码,加上解析命令行参数。使用regex让你自己更简单。

        2
  •  1
  •   Ando SylviA    14 年前

    如果您正在使用 GUI test runner 对于cppunit,您只需检查要运行的测试。

    如果您不能使用GUI测试运行程序,请检查 this

        3
  •  0
  •   amasmiller    6 年前

    另一种方法:

    // find the unit test as specified by the one argument to this program
    CPPUNIT_NS::Test *suite = CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest();
    int iTestIndex = 0;
    for (; iTestIndex < suite->getChildTestCount(); ++iTestIndex)
    {
        fprintf(stderr, "INFO: Looking for a match between '%s' and '%s'\n",
                suite->getChildTestAt(iTestIndex)->getName().c_str(),
                argv[1]);
        if (suite->getChildTestAt(iTestIndex)->getName() == std::string(argv[1]))
        {
            fprintf(stderr, "INFO: Found a match for '%s' and '%s'\n",
                    suite->getChildTestAt(iTestIndex)->getName().c_str(),
                    argv[1]);
            break;
        }
    }
    if (iTestIndex >= suite->getChildTestCount())
    {
        fprintf(stderr, "ERROR: Did NOT find test '%s'!\n", argv[1]);
        return -1;
    }