我正在使用 CATCH v1.1 build 14 对我的 C++ 代码进行单元测试。
作为测试的一部分,我想检查我的代码中几个模块的输出。没有固定数量的模块;可以随时添加更多模块。但是,测试每个模块的代码是相同的。因此,我认为将测试代码放在for
循环中是理想的。事实上,使用catch.hpp
,我已经验证我可以在测试用例中动态创建部分,其中每个部分对应一个模块。我可以通过将SECTION
宏包含在 for 循环中来做到这一点,例如:
#include "catch.hpp"
#include <vector>
#include <string>
#include "myHeader.h"
TEST_CASE("Module testing", "[module]") {
myNamespace::myManagerClass manager;
std::vector<std::string> modList;
size_t n;
modList = manager.getModules();
for (n = 0; n < modList.size(); n++) {
SECTION(modList[n].c_str()) {
REQUIRE(/*insert testing code here*/);
}
}
}
(这不是一个完整的工作示例,但您明白了。)
这是我的困境。我想独立测试模块,这样如果一个模块失败,它将继续测试其他模块而不是中止测试。REQUIRE
但是,CATCH 的工作方式是,如果单个测试用例失败,它将中止整个测试用例。出于这个原因,我想为每个模块创建一个单独的测试用例,而不仅仅是一个单独的部分。我尝试将for
循环放在TEST_CASE
宏之外,但是这段代码无法编译(如我所料):
#include "catch.hpp"
#include <vector>
#include <string>
#include "myHeader.h"
myNamespace::myManagerClass manager;
std::vector<std::string> modList;
size_t n;
modList = manager.getModules();
for (n = 0; n < modList.size(); n++) {
TEST_CASE("Module testing", "[module]") {
SECTION(modList[n].c_str()) {
REQUIRE(/*insert testing code here*/);
}
}
}
通过编写我自己的 可能可以做到这一点main()
,但我不知道如何准确地做到这一点。TEST_CASE
(我会直接把我的代码放到main()
.TEST_CASE
我也可以使用CHECK
宏而不是REQUIRE
宏来避免在模块失败时中止测试用例,但是我遇到了相反的问题:它试图继续对早该失败的模块进行测试。如果我可以将每个模块放在自己的测试用例中,那应该会给我理想的行为。
有没有一种简单的方法可以在 CATCH 中动态创建测试用例?如果是这样,你能给我一个如何做的例子吗?我通读了 CATCH 文档并在线搜索,但找不到任何有关如何执行此操作的指示。