不要在 Catch2 测试用例中组合生成器
Do not combine generators in Catch2 test case
我想在一个 Catch2
测试用例中使用多个生成器。我的问题是,当有两个以上的生成器时,它们是 "combined"。所以如果我这样写:
TEST_CASE("Test legal moves on empty 2x1 board") {
Board board(2, 1);
auto startPos = GENERATE(Position(0, 0), Position(1, 0));
auto expectedMoves = GENERATE(Position(1, 0), Position(0, 0));
auto legalMoves = board.getLegalMoves(startPos);
REQUIRE(legalMoves[0] == expectedMoves);
}
这将产生四个测试用例:
(startPos[0] vs expectedMoves[0]
, startPos[0] vs expectedMoves[1]
, startPos[1] vs expectedMoves[0]
, startPos[1] vs startPos[1]
).
但是我只想要两个:(startPos[0] vs expectedMoves[0]
, startPos[1] vs startPos[1]
).
有没有一种优雅易读的方法?我想避免这样的事情:
TEST_CASE("Test legal moves on empty 2x1 board") {
Board board(2, 1);
auto dump = GENERATE(vector<Position>{ Position(0, 0), Position(1, 0) },
vector<Position>{ Position(1, 0), Position(0, 0) });
auto expectedMoves = dump[1];
auto legalMoves = board.getLegalMoves(dump[0]);
REQUIRE(legalMoves[0] == expectedMoves);
}
因为维护这样的怪物很麻烦。
编辑:我不太喜欢这个解决方案:
https://github.com/catchorg/Catch2/blob/ce42deb72fab2be85a862f559984580c24cb76c4/projects/SelfTest/UsageTests/Generators.tests.cpp#L199
您应该将 input/output 测试数据包装在某种结构中,而不是使用多个生成器,该结构将同时定义 startPos
和 expectedMove
。然后你可以使用单个生成器来生成数据集。您的数据将被命名,因此您不必通过索引引用它。您的 TEST_CASE
可能如下所示:
struct TestData
{
Position startPos;
Position expectedMove;
};
TEST_CASE("Test legal moves on empty 2x1 board")
{
Board board {2, 1};
auto testData = GENERATE(TestData {{0, 0}, {1, 0}}, TestData {{1, 0}, {0, 0}});
auto lagalMoves = board.getLegalMoves(testData.startPos);
REQUIRE(lagalMoves[0] == testData.expectedMove);
}
我想在一个 Catch2
测试用例中使用多个生成器。我的问题是,当有两个以上的生成器时,它们是 "combined"。所以如果我这样写:
TEST_CASE("Test legal moves on empty 2x1 board") {
Board board(2, 1);
auto startPos = GENERATE(Position(0, 0), Position(1, 0));
auto expectedMoves = GENERATE(Position(1, 0), Position(0, 0));
auto legalMoves = board.getLegalMoves(startPos);
REQUIRE(legalMoves[0] == expectedMoves);
}
这将产生四个测试用例:
(startPos[0] vs expectedMoves[0]
, startPos[0] vs expectedMoves[1]
, startPos[1] vs expectedMoves[0]
, startPos[1] vs startPos[1]
).
但是我只想要两个:(startPos[0] vs expectedMoves[0]
, startPos[1] vs startPos[1]
).
有没有一种优雅易读的方法?我想避免这样的事情:
TEST_CASE("Test legal moves on empty 2x1 board") {
Board board(2, 1);
auto dump = GENERATE(vector<Position>{ Position(0, 0), Position(1, 0) },
vector<Position>{ Position(1, 0), Position(0, 0) });
auto expectedMoves = dump[1];
auto legalMoves = board.getLegalMoves(dump[0]);
REQUIRE(legalMoves[0] == expectedMoves);
}
因为维护这样的怪物很麻烦。
编辑:我不太喜欢这个解决方案: https://github.com/catchorg/Catch2/blob/ce42deb72fab2be85a862f559984580c24cb76c4/projects/SelfTest/UsageTests/Generators.tests.cpp#L199
您应该将 input/output 测试数据包装在某种结构中,而不是使用多个生成器,该结构将同时定义 startPos
和 expectedMove
。然后你可以使用单个生成器来生成数据集。您的数据将被命名,因此您不必通过索引引用它。您的 TEST_CASE
可能如下所示:
struct TestData
{
Position startPos;
Position expectedMove;
};
TEST_CASE("Test legal moves on empty 2x1 board")
{
Board board {2, 1};
auto testData = GENERATE(TestData {{0, 0}, {1, 0}}, TestData {{1, 0}, {0, 0}});
auto lagalMoves = board.getLegalMoves(testData.startPos);
REQUIRE(lagalMoves[0] == testData.expectedMove);
}