我可以在C++中使用 TableDrivenTests 概念吗?

Can I use the TableDrivenTests concept in C++?

本文关键字:TableDrivenTests C++ 我可以      更新时间:2023-10-16

我知道在Go中,它通常用于所谓的TableDrivenTests来实现测试用例,例如:

func TestMyFunc(t *testing.T) {
var tTable = []struct {
input  []float64
result float64
}{
{[]float64{1, 2, 3, 4, 5, 6, 7, 8, 9}, 102.896},
{[]float64{1, 1, 1, 1, 1, 1, 1, 1, 1}, 576.0},
{[]float64{9, 9, 9, 9, 9, 9, 9, 9, 9}, 0.0},
}
for _, pair := range tTable {
result := MyFunc(pair.input)
assert.Equal(t, pair.result, result)
}
}

给定一个测试用例表,实际测试只是遍历 所有表条目和每个条目执行必要的测试。

我真的很喜欢这种用于实现测试的Go风格。所以我想知道,是否可以在C++中使用类似的东西?如果可能的话,你能给我举个例子吗?

编辑:我正在使用Qt Creator,并且我创建了一个类来执行单元测试。我真正想知道的是,是否可以创建一个包含输入输出的结构,并循环访问条目以执行每个测试。由于我使用的是Qt,它不需要是"标准C++结构",它可以是Qt提供的另一种数据结构。

以下是对C++的几乎 1:1 的翻译:

#include <vector>
#include <iostream>
// Testable function.
double MyFunc(const std::vector<double> &input)
{
static double results[] = { 102.896, 576.0, 0.0 };
static int i = 0;
return results[i++]; // return different results
}
// Our test. Returns true if passes.
bool TestMyFunc()
{
struct
{
std::vector<double> input;
double result;
} tTable[] =
{
{{1, 2, 3, 4, 5, 6, 7, 8, 9}, 102.896},
{{1, 1, 1, 1, 1, 1, 1, 1, 1}, 576.0},
{{9, 9, 9, 9, 9, 9, 9, 9, 9}, 0.0},
};
for ( const auto &pair : tTable ) {
auto result = MyFunc(pair.input);
if ( result != pair.result )
return false; // return false if test fails
}
return true; // all test cases passed
}
int main() {
std::cout << TestMyFunc() << std::endl;
return 0;
}

但我建议使用现有的单元测试框架,例如 gtest 有一个值参数化测试的概念,这大约是你想要的。