gpt4 book ai didi

c++ - 我如何使用 Google Test 在 main() 函数的特定位置调用特定的测试函数?

转载 作者:行者123 更新时间:2023-11-30 01:54:55 28 4
gpt4 key购买 nike

我在一个涉及数值模拟的项目中使用 TDD 和 Google Test。数据的状态在 main 函数的循环中发生变化,但每次变化后都需要满足一些要求。如果满足测试用例的所有要求,则验收测试通过:

while(simulation)
modify simulation data
FIRST_TEST()
some other simulation operations
SECOND_TEST()

GTest primer声明通常调用 RUN_ALL_TESTS()。 Advanced Guide显示如何通过从 RUN_ALL_TESTS 中过滤掉测试 来运行子测试。但是,我想知道如何单独调用测试。

否则,每次我需要像上面伪代码片段中的 FIRST_ 和 SECOND_ 这样的新测试时,我都需要编写一个新的验收测试应用程序。

更多背景知识:我正在使用计算流体动力学的 OpenFOAM 框架,因此在 main 之外创建全局固定装置不是一种选择。模拟应用程序需要一个目录和配置文件才能运行,main中的全局对象是相互关联的(初始化时相互需要)。此类应用程序的一个示例是 OpenFOAM-2.2.x .

补充说明

我接受了接受的答案以及关于如何在 another question on Stack Overflow 上找到的测试中使用 argc 和 argv 作为全局变量的答案。我将其总结为这个可编译的小模型,也许有人会觉得它有用:

#include <gtest/gtest.h>
#include <iostream>

class Type
{
int value_ = 0;
int times_ = 1;

public:

Type(int x) : value_(x) {};

void operator()(){
if (times_ < 10) {
++times_;
value_ *= times_;
}
}

int value () const { return value_; }
};

class mySeparatedTests : public ::testing::Test
{
protected:

template<typename Type>
void TEST_ONE(Type const &t)
{
ASSERT_TRUE((t.value() % 2) == 0);
}

template<typename Type>
void TEST_TWO(Type const & t)
{
ASSERT_TRUE((t.value() - 5) > 0);
}
};

TEST_F(mySeparatedTests, testName)
{
extern char** globalArgv;
char** argv = globalArgv;

// Simulation parameters and objects requiring argc and argv for initialization.
int simulationEndTime;

*argv[1] >> simulationEndTime;

Type typeObject(*argv[2]);

TEST_ONE(typeObject);

// Simulation loop.
for (int i = 0; i < simulationEndTime; ++i)
{
typeObject();

TEST_TWO(typeObject);
}
}

int globalArgc;
char** globalArgv;

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

globalArgc = argc;
globalArgv = argv;

return RUN_ALL_TESTS();

return 0;
}

这种方法,如已接受的答案中所述,将模拟代码从 main 移植到 TEST_F,并使用 mySeparatedTests 类函数来定义单独的测试,然后可以在任何地方被调用。这是编译的:

g++ -std=c++11 -l gtest main.cpp  -o main

并根据解析的参数对测试失败/通过;

这失败了:

./main 1 1 

这成功了:

./main 2 2 

注意:我知道正在发生 char/int 转换;这只是为了展示如何获取参数。

最佳答案

我的猜测是您稍微误解了 googletest 的作用。测试序列的控制由测试运行器控制。你可以做的是用你的 while 循环定义一个测试,不同之处在于你的 FIRST_TEST 等是夹具的函数,带有一些断言。例如:

代替:

int main(...) { ... while (...) PERFORM_TEST("A"); ... }
TEST(A,some_test) {}

您可以使用标准的 googletest runner main 并定义:

// fixture
class MyTest : public ::testing::Test {
protected:
bool simulation() {
///...
}

void TEST_A() {
ASSERT_EQ(...);
//...
}

void TEST_B() {
ASSERT_EQ(...);
//...
}
///
};

// the test "runner"
TEST_F(MyTest, main_test) {
while (simulation()) {
// modify simulation data
TEST_A();
// some other simulation operations
TEST_B();
}
}

关于c++ - 我如何使用 Google Test 在 main() 函数的特定位置调用特定的测试函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21310067/

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