通过Google测试,我想指定一个测试fixture用于不同的测试用例。fixture应该分配和释放类TheClass
和它的数据管理类TheClassData
的对象,其中数据管理类需要一个数据文件的名称。
对于不同的测试,文件名应有所不同。
我定义了以下夹具:
class TheClassTest : public ::testing::Test {
protected:
TheClassTest(std::string filename) : datafile(filename) {}
virtual ~TheClassTest() {}
virtual void SetUp() {
data = new TheClassData(datafile);
tc = new TheClass(data);
}
virtual void TearDown() {
delete tc;
delete data;
}
std::string datafile;
TheClassData* data;
TheClass* tc;
};
现在,不同的测试应该使用不同文件名的fixture。
**问题:**如何从测试中指定文件名,即如何调用fixture的非默认构造函数?
我发现了像::testing::TestWithParam<T>
和TEST_P
这样的东西,这没有帮助,因为我不想用不同的值运行一个测试,而是用一个fixture运行不同的测试。
6条答案
按热度按时间kx5bkwkv1#
正如另一位用户所建议的,使用非默认构造函数示例化fixture并不能达到你想要的效果。然而,还有其他方法。只需重载
SetUp
函数,并在测试中显式调用该版本:现在在测试中只需使用这个重载来设置文件名:
无参数
TearDown
将在测试完成时自动清除。dfuffjeb2#
使用当前类作为设备的基类:
对于每个特定的文件名-使用派生的fixture:
然而,这是每个参数集所需要的额外步骤-所以你可以尝试使用模板或宏来完成它,以更少的努力。
然后,对每组参数执行以下操作:
然而,在您的具体情况下,我也会尝试GoogleTest:类型参数化测试。
h7appiyu3#
另一个处理这个问题的好方法是扩展你的fixture,并在扩展的类中提供一个新的默认构造函数,它使用你需要的参数调用旧的构造函数。例如:
xzlaal3s4#
如果您依照建议的here多载
SetUp
方法,而且您想要确定记得使用多载的SetUp
,您可以在TearDown
方法中使用判断提示。wfauudbj5#
使用模板的另一种方式:
mrwjdhj36#
对于这一具体情况,我觉得完全摆脱测试fixture要容易得多。
SetUp
函数可以替换为一个helper函数,该函数用所需的文件名示例化类。这允许使用TEST
而不是TEST_P
或TEST_F
。现在,每个测试用例都是一个独立的测试,它使用helper函数或直接在测试用例的主体中创建自己的测试类示例。例如: