Google使用整体向量测试ValuesIn [英] Google Tests ValuesIn with a global vector

查看:321
本文介绍了Google使用整体向量测试ValuesIn的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试根据目录中的配置文件运行一堆Google测试.这样,我可以添加一个新文件并运行测试,而不必将其添加到我的参数化测试中并重新编译.这是我的代码:

I'm trying to run a bunch of google tests based off configuration files in a directory. This way I can just add a new file and run the tests without having to add it to my parametrized test and recompile. Here is my code:

typedef std::pair<QString, int> TestParam;

QString generatedLogic;

std::vector<TestParam> badExpressionTests;

class LogicBuilderTest : public ::testing::TestWithParam<TestParam> {};

GTEST_API_ int main(int argc, char **argv) {
    testing::InitGoogleTest(&argc, argv);

    ::generatedLogic = "/home/mitydsp/trunk/System/logicExecutionEngine/engine/include/GeneratedLogic.h";

    QString dir = "/home/mitydsp/trunk/System/logicExecutionEngine/unittest/expressions/bad/";
    QDirIterator it(dir, QStringList() << "*.txt", QDir::Files, QDirIterator::Subdirectories);

    while (it.hasNext()) {
        QString path = it.next();
        QStringList nameParts = it.fileName().split("_");
        int exitCode = nameParts[0].toInt();
        ::badExpressionTests.push_back(TestParam(path, exitCode));
    }

    std::cout << "Size of vector: " << badExpressionTests.size() << std::endl;

    return RUN_ALL_TESTS();
}

/**
 * Run parameterized test
 */
TEST_P(LogicBuilderTest, TestExitWithCode)
{    
    ::testing::FLAGS_gtest_death_test_style = "threadsafe";

    // Simulate fake main()
    char  arg0[] = "logicTest";
    char* argv[] = { &arg0[0], NULL };
    int argc = (int)(sizeof(argv) / sizeof(argv[0])) - 1;

    EXPECT_EXIT({
        // Need to run Qt Application because logic builder uses async QTimer::singleShot()
        QCoreApplication app(argc, argv);

        // Create a logic builder instance
        LogicBuilder logicBuilder(
            (int) ParameterStoreInterface::DEFAULT_PARAM_STORE_VALUES_KEY,
            (int) ParameterStoreInterface::DEFAULT_PARAM_STORE_NAMES_KEY,
            (int) ParameterStoreInterface::DEFAULT_PARAM_STORE_LOCK_KEY,
            QString(GetParam().first),
            QStringList(""),
            QStringList(generatedLogic),
            QString(LogicBuilder::DEFAULT_INTERMEDIATE_DIR),
            QString(LogicBuilder::DEFAULT_OUTPUT_SRC),
            QString(LogicBuilder::DEFAULT_OUTPUT_LIB),
            true );

        app.exec();
    }, ::testing::ExitedWithCode(GetParam().second), "");
} 

INSTANTIATE_TEST_CASE_P(TestBadExpressions, LogicBuilderTest,
                        ::testing::ValuesIn(::badExpressionTests));

当我运行它时,它表明即使矢量说它的大小为2,也正在运行0个测试.这些参数化测试为什么不运行?

When I run this, it shows that 0 tests are being ran even though the vector says its size is two. How come these parametrized tests are not being ran?

Size of vector: 2
[==========] Running 0 tests from 0 test cases.
[==========] 0 tests from 0 test cases ran. (0 ms total)
[  PASSED  ] 0 tests.

最初,我是通过手动定义配置文件来运行测试的,但我不喜欢这样:

Originally I was running the tests by manually defining the configuration files but I don't like this:

    INSTANTIATE_TEST_CASE_P(TestBadExpressions, LogicBuilderTest,
                        ::testing::Values(
                            TestParam("unittest/expressions/bad/17_no_lhs.txt", LogicBuilder::LB_VARIABLE_NO_LHS),
                            TestParam("unittest/expressions/bad/25_incomplete_rhs.txt", LogicBuilder::LB_PARSE_ERROR)
                        ));

推荐答案

我花了最后一个小时试图解决这个问题,然后在发布后立即提出解决方案.我将其留在此处,因为它可能会在将来对某人有所帮助:

I've spent the last hour trying to figure this out and then as soon as I post I come up with the solution. I'll leave this here because it may help someone in the future:

通过在ValuesIn函数中加载文件并返回向量,而不是尝试在main中创建文件列表.

Instead of trying to create the list of files in main, pass the ValuesIn a function which loads the files and returns a vector.

std::vector<TestParam> GetFilesInDir() 
{
    std::vector<TestParam> values;
    QString dir = "/home/mitydsp/trunk/System/logicExecutionEngine/unittest/expressions/bad/";
    QDirIterator it(dir, QStringList() << "*.txt", QDir::Files, QDirIterator::Subdirectories);

    while (it.hasNext()) {
        QString path = it.next();
        QStringList nameParts = it.fileName().split("_");
        int exitCode = nameParts[0].toInt();
        values.push_back(TestParam(path, exitCode));
    }

    return values;
}

INSTANTIATE_TEST_CASE_P(TestBadExpressions, LogicBuilderTest,
                        ::testing::ValuesIn(GetFilesInDir()));

感谢Maksim Solovjov提醒我,INSTANTIATE_TEST_CASE_P宏是在main之前执行的.

Thanks to Maksim Solovjov for reminding me that INSTANTIATE_TEST_CASE_P macro was being executed before main.

这篇关于Google使用整体向量测试ValuesIn的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆