【发布时间】:2016-06-21 15:49:33
【问题描述】:
我正在使用 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*/);
}
}
}
(这不是一个完整的工作示例,但你明白了。)
这是我的困境。我想独立测试模块,这样如果一个模块失败,它将继续测试其他模块而不是中止测试。但是,CATCH 的工作方式是,如果单个REQUIRE 失败,它将中止整个测试用例。出于这个原因,我想为每个模块创建一个单独的测试用例,而不仅仅是一个单独的部分。我尝试将我的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*/);
}
}
}
writing my ownmain() 或许可以做到这一点,但我不知道如何做到这一点。 (我可以将我的TEST_CASE 代码直接放入main() 吗?如果我想将我的TEST_CASE 代码保存在不同的文件中怎么办?另外,它会影响我的其他更标准的测试用例吗?)
我也可以使用CHECK 宏而不是REQUIRE 宏来避免在模块失败时中止测试用例,但是我遇到了相反的问题:它试图继续对应该失败的模块进行测试早期。如果我可以将每个模块放在自己的测试用例中,那应该会给我理想的行为。
有没有一种简单的方法可以在 CATCH 中动态创建测试用例?如果是这样,你能给我一个如何做的例子吗?我通读了 CATCH 文档并在线搜索,但找不到任何有关如何执行此操作的指示。
【问题讨论】:
标签: c++ unit-testing catch-unit-test