问题标签 [catch-unit-test]

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.

0 投票
1 回答
136 浏览

c++ - kill syscommand 在 Catch2 测试用例中产生失败

我正在使用Catch2在 C++ 中进行测试。我的测试用例派生了一个子进程,并且在某些时候父进程向它发送一个kill(pid, SIGTERM)以清理它。

但是,我从 Catch2 收到以下错误。

当然,我是故意进行这个系统调用的,所以我不认为它是测试失败。如何让 Catch2 忽略此故障条件?

谢谢!

0 投票
1 回答
6453 浏览

unit-testing - 在 Visual Studio 中使用 Catch2 进行单元测试的最佳实践

我是 C++ 单元测试的新手,想就此获得一些建议。我使用 Visual Studio 2019 进行开发,我选择了 Catch2 作为我的测试库,我还安装了 Catch2 的测试适配器。

我在 GitHub 上阅读了 Catch2 和 Catch2 测试适配器的文档,但我仍然无法找到在 Visual Studio 中使用单元测试的正确方法。

假设我已经有一个项目,其中包含一些类,并且我想测试这些类。我应该将带有测试代码的文件放在同一个项目中,还是应该在解决方案中创建新的测试项目?

当我尝试第一种方法时,除非我注释掉项目的 main() 函数,否则测试资源管理器不会发现测试。使用第二种方法,尽管我为头文件设置了正确的相对路径并从测试项目中引用了主项目,但我得到了一堆未解决的类方法的外部符号错误:

如果有人向我展示在 VS 中使用 Catch2 进行单元测试的正确方法,我将不胜感激。

0 投票
1 回答
192 浏览

c++ - 在运行时检测 Catch2 中的特定标签匹配

我的Catch2项目中有集成测试,这些测试依赖于设置的一些昂贵的全局状态。我只想在测试运行器实际测试依赖它的系统时初始化该全局状态。

我所看到的似乎有效,但它有点可怕......这取决于 Catch 配置中相当多的实现细节。

这是我的主要内容:

然后我的测试文件就是:

请注意,由于有多个部分(在我的实际项目中,还有多个测试用例)依赖于全局设置,所以我不能只将初始化移动到TEST_CASE.

有没有更好的办法?

0 投票
1 回答
571 浏览

c++ - Catch2 - 为不同的测试文件使用不同的模拟数据填充单例

我在我的 C++ 项目中使用 Catch2 进行单元测试。我有一个单例类,它正在不同的测试文件中使用。例如,一个文件可能正在测试单例本身,而另一个文件可能正在测试单例与另一个组件之间的交互。因此,我想知道是否有一种方法可以为每个测试文件使用不同的模拟数据集填充单例类。

据我所知,我似乎有两种方法可以走。

  1. 使用测试用例和部分

测试A.cpp

测试B.cpp

然而,这意味着设置函数将在每个测试文件中运行两次,这不是必需的,我希望避免这种情况。我也不想将我的所有测试归为一个 SECTION/TEST_CASE。

  1. 用于Listeners

我知道我可以创建和注册自己的Listener类并覆盖testCaseStartingandtestCaseEnded方法,这似乎适用于所有 TEST_CASE,但我希望为 TestA 和 TestB 设置不同的设置。

因此,有没有更好的方法可以在每个测试文件中以不同方式设置我的单例类,以便类似于在每个测试文件的开头和结尾运行设置和拆卸功能?

0 投票
2 回答
2636 浏览

c++ - 如何比较catch2中的浮点数

我正在使用 Catch v2.13.1

比较浮点值的正确方法是什么。我认为下面会失败,但都通过了。

然而,这如预期的那样失败

我不明白为什么前两个语句不起作用

0 投票
1 回答
92 浏览

c++ - 添加结构时 catch2 抛出和错误

这是我项目的根源。我认为我缺少一个基本概念,因为当我将find()函数包装在结构中时会发生错误。

CMakeLists.txt

bst.cpp

bst.hpp

bst-test.cpp

这是尝试编译时的错误。

0 投票
0 回答
153 浏览

c++ - 如何使 catch2 运行驻留在静态库中的测试?

我通常使用catch2的工作流程是拥有一个包含所有测试用例和测试“运行程序”的控制台应用程序。

例如:

file1.cpp, file2.cpp 包含测试:

单个文件 main.cpp 将包含运行器代码:

为了减少编译时间,我尝试将所有包含测试的文件(file1、file2 等)移动到单独的静态库项目(Visual Studio)中。

但是这样做之后,catch 找不到任何测试用例:

我尝试将运行器代码放在驻留在静态库中的函数中,但这没有帮助。

问题:

  • catch 究竟是如何找到它的测试用例的?
  • 为什么会失败?
  • 我该如何解决?
0 投票
1 回答
193 浏览

c++ - Catch2 GENERATE 宏在内部是如何工作的?

最近我了解了GENERATECatch2 中的宏(来自此视频)。现在我很好奇它是如何在内部工作的。

天真地认为,对于带有生成器的测试用例k(通过生成器,我的意思是一个GENERATE调用站点),Catch2 只运行每个测试用例n1 * n2 * ... * nk时间,其中nii第 -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之前的更改yx = GENERATE(0, 1)最后一次调用的生成器)

然而,这不是 catch实际所做的,这是现实中发生的:

8行输出,也就是前四行重复了两次。

所以我的问题是,GENERATECatch2 究竟是如何实现的?我并不是特别在寻找详细的代码,而是一个可以解释我在前面的示例中看到的内容的高级描述。

0 投票
0 回答
93 浏览

cmake - 在 CMakeLists.txt 中定义命令行选项

我创建了使用 catch2 测试框架的小项目。我在终端中将名为--use-colour的特定命令行选项设置为yes ,如下所示:

如何在 CMakeLists.txt 文件而不是终端中定义此命令行选项

这是我的 CMakeLists.txt 文件:

0 投票
0 回答
28 浏览

catch2 - catch2:如何在测试用例中执行另一个进程?

我正在尝试在 catch2 中实现一个测试用例,用于测试进程之间 fifo 的使用。为了测试它,我想运行另一个创建并写入fifo的进程,而我的测试(使用catch2)将从这个fifo中读取。有没有办法使用 catch2 运行进程,或者我只是使用常规系统 API 来执行另一个 exe 文件(进程)作为测试的一部分?

谢谢