问题标签 [catch2]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 如何使用 Catch2 和 CMake 添加单独的测试文件?
在文档中,他们只编译一个test.cpp
可能包含所有测试的文件。我想将我的个人测试与包含的文件分开#define CATCH_CONFIG_MAIN
,就像这样。
如果我有一个test.cpp
包含#define CATCH_CONFIG_MAIN
一个单独的测试文件的文件simple_test.cpp
,我已经设法以simple_test.cpp
这种方式生成一个包含测试的可执行文件:
但是,这是生成可执行文件的可接受方式吗?从不同的教程中,如果我有更多的测试,我应该能够制作一个测试源库并将它们链接test.cpp
到生成可执行文件:
但是当我尝试这个时,我得到了一个 CMake Warning Test executable ... contains no tests!
。
总而言之,我应该制作一个测试库吗?如果是这样,我怎样才能让它包含我的测试。否则,将我的新 test.cpp 文件添加到add_executable
函数中是否正确?
c++ - CMake find_package 用于非标准位置
我正在尝试创建一个自包含库,其依赖项是自包含的。所有安装都安装到 <repo_dir>/libs//build。要在 cmake 构建系统中查找依赖项,我使用 find_package。因为所有安装都在自定义位置,所以我指出我使用 HINTS 来提供帮助 -
我认识到 Catch2 可能不需要这个,因为它只是标题,但是我正在尝试了解 cmake 在做什么。上面的 CMakeLists.txt 打印出来
看起来还需要一个目标文件。我在 Catch2 存储库中找不到。我也在为愚蠢尝试相同的过程,但它对我也不起作用。在模块模式下使用以下 Boost 工作。为什么它有效?
有人可以帮助发现我的问题以及我应该如何使用
- 仅标头库
- 静态库二进制文件
- 自编译库
谁的资源在不寻常的地方?
c++ - 如何使用 CMake 和 Catch2 获得测试覆盖率
我正在尝试在用于测试lcov
的C++
项目上打印覆盖率。Catch2
我能够运行我的测试并获得结果。但是,我无法获得任何报道。这是显示的错误。
我当前的工具链是WSL
. 我正在使用Conan
依赖管理。该解决方案具有以下结构:
每个文件夹都有它的CMakeLists.txt
文件并被标识为目标。我还使用这个 CMake 模块来注册覆盖目标。
我的根CMakeLists.txt
看起来像这样:
为了获得我的报道,我正在使用以下命令(on build/
)。
据我了解,它似乎缺少一些覆盖信息所需的文件,但我不知道如何制作它们。从我在网上查看的内容来看,我拥有所有必要的编译器标志。我看不出这里有什么问题/缺失。
c++ - 如何使 catch2 运行驻留在静态库中的测试?
我通常使用catch2的工作流程是拥有一个包含所有测试用例和测试“运行程序”的控制台应用程序。
例如:
file1.cpp, file2.cpp 包含测试:
单个文件 main.cpp 将包含运行器代码:
为了减少编译时间,我尝试将所有包含测试的文件(file1、file2 等)移动到单独的静态库项目(Visual Studio)中。
但是这样做之后,catch 找不到任何测试用例:
我尝试将运行器代码放在驻留在静态库中的函数中,但这没有帮助。
问题:
- catch 究竟是如何找到它的测试用例的?
- 为什么会失败?
- 我该如何解决?
amazon-web-services - 在另一个 lambda 函数中调用 lambda 函数时捕获错误
我可以使用 aws-sdk invoke() 函数从另一个 lambda 函数调用 lambda 函数。我写了两个 lambda 函数。我调用的 lambda 函数返回 context.fail() 以防发生任何错误。我像这样调用 lambda 函数:
当我通过 API Gateway 调用 lambda 函数时, context.fail() 工作正常,我得到状态码 400,正如我在映射模板中声明的那样。但是当我直接调用 lambda 函数时,我无法在上面的代码中捕获错误并且它总是可以解决。如何在上面的代码中捕获错误?谢谢
c++ - Catch2 GENERATE 宏在内部是如何工作的?
最近我了解了GENERATE
Catch2 中的宏(来自此视频)。现在我很好奇它是如何在内部工作的。
天真地认为,对于带有生成器的测试用例k
(通过生成器,我的意思是一个GENERATE
调用站点),Catch2 只运行每个测试用例n1 * n2 * ... * nk
时间,其中ni
是i
第 -th 生成器中元素的数量,每次指定不同的值组合从那些k
发电机。事实上,这个幼稚的规范似乎适用于一个简单的测试用例:
正如预期的那样,输出是:
这表明测试用例运行了2 * 2 == 4
多次。
但是,catch 似乎并没有天真地实现它,如下例所示:
在上述情况下,实际调用(不是调用点)GENERATE
取决于choice
. 如果逻辑实现得天真,人们会期望有 8 行输出(因为2 * 2 * 2 == 8
):
请注意重复的行:即使未实际调用生成器,天真的置换仍然会置换生成器的值。例如,y = GENERATE(4, 5)
仅在 时调用choice == 1
,但是,即使在 时choice != 1
,实现仍会置换值 4 和 5,即使未使用这些值。
但是,实际输出是:
没有重复的行。这让我怀疑 Catch 在内部使用堆栈来跟踪调用的生成器及其最近调用的顺序。每次测试用例完成一次迭代时,它会以相反的顺序遍历调用的生成器,并推进每个生成器的值。如果这种推进失败(即生成器内的值序列完成),则该生成器将重置为其初始状态(即准备好按顺序发出第一个值);否则(推进成功),遍历退出。
在伪代码中,它看起来像:
这完美地解释了前面的案例。但它并没有解释这个(相当模糊的)一个:
人们会期望它运行4 == 2 * 2
时间,并且输出是:
(x
之前的更改y
是x = GENERATE(0, 1)
最后一次调用的生成器)
然而,这不是 catch实际所做的,这是现实中发生的:
8行输出,也就是前四行重复了两次。
所以我的问题是,GENERATE
Catch2 究竟是如何实现的?我并不是特别在寻找详细的代码,而是一个可以解释我在前面的示例中看到的内容的高级描述。
c++ - 无法使用 catch2 CATCH_CONFIG_MAIN 编译文件
我已经开始学习如何使用 Catch2 来测试我的 C++ 代码,并且正在尝试设置一个简单的测试。
我的文件夹结构由三个文件组成,它们都在同一个文件夹中:
我所写的test.cpp
是:
当我尝试编译时,test.cpp
我收到以下错误,我认为这表明没有main()
找到函数(?):
当我添加一个标称main()
函数时,该文件编译成功,但据我所知,它#define CATCH_CONFIG_MAIN
应该为您创建main()
函数,所以显然有些东西不起作用。
任何人都可以对此有所了解吗?
c++ - 为什么“==”在这里不可接受?
我正在编写单元测试并比较两个对象以确保它们相同但出现错误no operator "==" matches these operands -- operand types are: Item == Item
这是我的代码,有问题的行注释:
Item
并且container
是在别处定义的类。
根据要求,这是Item
该类的定义:
就是这样——在我的队友编写正确的代码之前,它是一个占位符类。
容器背后的代码目前也很有限,但我认为相关部分如下:
我还没有定义方法,Containers
因为我首先编写测试代码。
c++ - Catch2 未定义对 Catch::StringMaker 的引用
我正在使用实际devel
分支中的 Catch2,尝试比较两个时出现链接器错误vector<string_view>
该问题可以重现如下:
我的CMakeLists.txt
:
尝试构建时出现以下链接器错误:
我究竟做错了什么?我错过了一些包括吗?