gpt4 book ai didi

c++ - Google 使用全局 vector 测试 ValuesIn

转载 作者:行者123 更新时间:2023-11-30 02:37:16 25 4
gpt4 key购买 nike

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

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));

当我运行它时,它显示正在运行 0 个测试,即使 vector 说它的大小是 2。为什么没有运行这些参数化测试?

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

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

    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)
));

最佳答案

我花了最后一个小时试图解决这个问题,然后我一发布就想出了解决方案。我会把它留在这里,因为它可能会在将来帮助某人:

与其尝试在 main 中创建文件列表,不如将 ValuesIn 传递给加载文件并返回 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 之前执行。

关于c++ - Google 使用全局 vector 测试 ValuesIn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31837284/

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