我最近发现了这种设置(clang& gtest)和重复名称(在下面的例子中演示)有些奇怪。没有生成编译器警告/错误,但在运行时似乎发生了某种“类型交换”。我可能正在以一种产生“未定义行为”的方式进行编程。
示例:
main.cpp:
#include "gtest/gtest.h"
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
test_a.cpp
#include <boost/optional.hpp>
#include "gtest/gtest.h"
namespace test {
class TestA : public ::testing::Test {
};
struct Param {
boost::optional<int> x_;
boost::optional<int> y_;
int sum_;
};
class TestAWithParam :
public TestA,
public ::testing::WithParamInterface<Param> {};
TEST_P(TestAWithParam, Param) {
const auto p = GetParam();
ASSERT_TRUE(p.x_ && p.y_);
EXPECT_EQ(p.sum_, *p.x_ + *p.y_);
}
INSTANTIATE_TEST_CASE_P(
All,
TestAWithParam,
::testing::Values(
Param{1, 2, 3},
Param{2, 3, 5},
Param{3, 4, 7}));
} // namespace test
test_b.cpp
#include "gtest/gtest.h"
namespace test {
class TestB : public ::testing::Test {};
struct Param {
int x_;
int y_;
};
class TestBWithParam :
public TestB,
public ::testing::WithParamInterface<Param> {};
TEST_P(TestBWithParam, Param) {
const auto p = GetParam();
EXPECT_EQ(p.x_, p.y_);
}
INSTANTIATE_TEST_CASE_P(
All,
TestBWithParam,
::testing::Values(
Param{1, 1},
Param{2, 2},
Param{3, 3}));
} // namespace test
我减少了间距以缩短代码 - 所以不要压力,我实际上并没有像这样编写代码:P
测试应用程序因分段错误而失败。
如果我重命名其中一个Param结构(这样重复的命名不再存在),测试程序运行正常,没有失败的测试。
请注意,我经历了类似的UB和'非参数化'测试 - 所以我不会说这是一个TEST_P问题。
非常感谢任何帮助:)
感谢。