如何使用Google测试在Main()函数中的特定位置调用特定的测试功能
How can I use Google Test to call specific test functions at specific places in the main() function?
我正在使用TDD和Google Test进行涉及数值模拟的项目。数据状态在main
函数的循环中更改,但是每次更改后都需要满足一些要求。如果满足测试案例的所有要求,则通过了接受测试:
while(simulation)
modify simulation data
FIRST_TEST()
some other simulation operations
SECOND_TEST()
gtest底漆通常调用了run_all_tests()。高级指南通过从run_all_tests过滤测试来显示如何运行子测试。但是,我想知道如何单独调用测试。
否则,每次我需要在上面的pseudocode片段中进行新的测试和第二个测试时,我都需要编写一个新的接受测试应用程序。
更多背景:我正在为计算流体动力学使用OpenFOAM框架,因此在main
之外创建全局固定装置不是一个选择。模拟应用程序需要一个目录和配置文件要运行,并且主体中的全局对象是相关的(需要彼此以进行初始化)。这样的应用程序的一个示例是OpenFOAM-2.2.x。
更多注释
我采用了接受的答案,以及关于如何使用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转换正在发生;这只是为了展示如何拾取Args。
我的猜测是您有点误解了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++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 尽管测试成功,CppUnit测试核心仍被丢弃.为什么
- 数据成员SFINAE的C++17测试:gcc vs clang
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么二进制搜索在我的测试中不起作用
- 从父数组测试用例构造二叉树失败
- 试图对缓存进行跨步测试,但程序并没有结束
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- OpenGL在启用深度测试时不会丢弃我的碎片
- 为测试目标创建具有不同源文件夹的文件
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- VC++本机单元测试,找不到调试符号
- 换位表导致测试失败(但在游戏中运行良好)
- 用于交叉编译和CMake的预处理器宏的单元测试
- 谷歌测试中的期望值存储在哪里
- 如何在for循环中包含两个索引值的测试条件
- 重新定位图像时如何前进到下一个内存块
- 在cygwin中测试新的boost安装时出现cpp错误
- 使用rdtsc进行基准测试的缺点是什么