如何在 gtest 中参数化测试组?

How to parameterize test group in gtest?

本文关键字:测试 参数 gtest      更新时间:2023-10-16

我写了下面的示例测试:

// g++ t.cpp -I googletest/include -pthread libgtest{,_main}.a
#include <gtest/gtest.h>
class C : public ::testing::TestWithParam<int>
{
public:
void SetUp(){
int n=GetParam();
std::cout<<"SetUp "<<n<<std::endl;
}
static void SetUpTestCase(){
#if 0
// Condition parameter_ != nullptr failed. GetParam() can only be called inside a value-parameterized test -- did you intend to write TEST_P instead of TEST_F?
int n=GetParam();
std::cout<<"SetUpTestCase "<<n<<std::endl;
#endif
std::cout<<"SetUpTestCase"<<std::endl;
}
};
TEST_P(C,T1){
int n=GetParam();
std::cout<<"T1 "<<n<<std::endl;
}
TEST_P(C,T2){
int n=GetParam();
std::cout<<"T2 "<<n<<std::endl;
}
INSTANTIATE_TEST_SUITE_P(S, C, ::testing::Values(1,2));

此测试打印:

Running main() from gtest_main.cc
[==========] Running 4 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 4 tests from S/C
SetUpTestCase
[ RUN      ] S/C.T1/0
SetUp 1
T1 1
[       OK ] S/C.T1/0 (0 ms)
[ RUN      ] S/C.T1/1
SetUp 2
T1 2
[       OK ] S/C.T1/1 (0 ms)
[ RUN      ] S/C.T2/0
SetUp 1
T2 1
[       OK ] S/C.T2/0 (0 ms)
[ RUN      ] S/C.T2/1
SetUp 2
T2 2
[       OK ] S/C.T2/1 (0 ms)
[----------] 4 tests from S/C (0 ms total)
[----------] Global test environment tear-down
[==========] 4 tests from 1 test suite ran. (0 ms total)
[  PASSED  ] 4 tests.

我只想看一次"设置1"。可能吗? 我试图在 SetUpTestCase(( 中调用 GetParam((,但它导致了错误Condition parameter_ != nullptr failed. GetParam() can only be called inside a value-parameterized test -- did you intend to write TEST_P instead of TEST_F?。 实际上,对于每个测试参数,我的实际设置过程最多可能需要 60 秒(并且过程结果可以在测试之间共享(这里是 T1 和 T2((,所以我想将该过程放入 SetUpTestCase((。

解决方法是将资源记录到地图中。

// g++ t.cpp -I googletest/include -pthread libgtest{,_main}.a
#include <gtest/gtest.h>
class C : public ::testing::TestWithParam<int>
{
public:
void SetUp(){
int n=GetParam();
if(sharedResource.find(n)==sharedResource.end()){
std::cout<<"SetUp "<<n<<std::endl;
std::shared_ptr<char> p(new char[10000000]);
sharedResource[n] = p;
}
}
static void TearDownTestCase(){
std::map<int,std::shared_ptr<char>>::iterator it=sharedResource.begin();
for(;it!=sharedResource.end();){
std::cout<<"TearDown "<<it->first<<std::endl;
it = sharedResource.erase(it);
}
}
static std::map<int,std::shared_ptr<char>>sharedResource;
};
std::map<int,std::shared_ptr<char>> C::sharedResource;
TEST_P(C,T1){
int n=GetParam();
std::cout<<"T1 "<<n<<std::endl;
std::shared_ptr<char> p = sharedResource[n];
}
TEST_P(C,T2){
int n=GetParam();
std::cout<<"T2 "<<n<<std::endl;
std::shared_ptr<char> p = sharedResource[n];
}
INSTANTIATE_TEST_SUITE_P(S, C, ::testing::Values(1,2));