问题标签 [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 投票
3 回答
194 浏览

c++ - 如何从 Catch 记者中排除 printf 消息

我正在测试一个监控 USB 记忆棒并允许监听插件/插件事件的库。目标系统运行一个定制的 Linux 版本,调试对这个系统来说很痛苦

因此,为了快速分析正在发生的事情,我经常使用printf消息。

对于库的单元测试,我已经开始使用Catch并使用 JUint 报告器生成测试报告。

问题:如果我插入一条printf消息进行分析,它会被添加到xmlCatch.

我的问题:有没有办法将printf消息和生成的报告分开Catch

谢谢。

更新:我想避免写入文件,因为当出现错误并且程序在文件完全写入之前崩溃时,我遇到了问题。

0 投票
2 回答
2287 浏览

c++ - 如何提高 C++ 中的分支覆盖率

我有一个相当大的C++ 库测试套件,其线路覆盖率接近 100%,但分支覆盖率只有 55.3%。浏览 的结果lcov,似乎大多数遗漏的分支都可以用 C++ 的多种 throw 方法来解释std::bad_alloc,例如,每当std::string构造 an 时。

在此处输入图像描述

我在问自己如何在这种情况下提高分支覆盖率,并认为最好有一个new可以配置为std::bad_alloc在命中我的测试套件中遗漏的每个分支所需的分配后抛出的运算符。

我(天真地)尝试定义一个全局void* operator new (std::size_t)函数,该函数对全局倒计时并在达到时int allowed_allocs抛出。std::bad_alloc0

但这有几个问题:

  • new在“第一个”期望之前,很难获得呼叫次数throw。我可以执行试运行来计算成功所需的调用,但是如果多个调用可能在同一行中失败,例如std::to_string(some_int) + std::to_string(another_int)where each std::to_string、连接 viaoperator+以及初始分配可能失败,这将无济于事。
  • 更糟糕的是,我的测试套件(我正在使用 Catch)new本身使用了很多调用,所以即使我知道我的代码需要多少调用,也很难猜测测试套件需要多少额外的调用。(更糟糕的是,Catch 有几种“冗长”模式,它们会创建大量再次需要内存的输出......)

您知道如何提高分支覆盖率吗?

2017-10-07 更新

同时,我发现https://stackoverflow.com/a/43726240/266378带有指向 Python 脚本的链接,用于过滤由 lcov 输出中的异常创建的一些分支。这使我的分支覆盖率达到了 71.5%,但剩下的未命中分支仍然很奇怪。例如,我有几个这样的 if 语句:

带有未命中分支的 if 语句

有四个(?)分支,其中一个未命中(reference_token是 a std::string)。

有谁知道这些分支的含义以及它们是如何被击中的?

0 投票
1 回答
205 浏览

c++ - mbed OS 5 项目中链接了哪些文件?

我正在编写一个用于 mbed 5 的外部库(一个组件控制器),并计划使其在 mbed 存储库中可用。我想编写测试来确认我的代码是否正常工作,但它们只是常规的普通单元测试,不需要在嵌入式控制器上运行。我将Catch作为我的框架,它为main测试套件提供了一个。

当我使用mbedCLI 或 Eclipse CDT(使用导出的项目)构建项目时,.cpp包含哪些文件,以及哪些.o文件链接到嵌入的图像?图像是否仅包含通过包含从我的main.cpp文件中提取的代码,或者它是否编译并链接所有.cpp可见的文件(可能包括我的测试用例)?如果是后者,是否有一种干净的方法来排除不会与内置 utest 功能冲突的它们?

0 投票
0 回答
52 浏览

c++ - 如何在“API”程序中实现单元测试

我正在执行“API”功能的 C++ 程序中实现单元测试(使用 Catch)。它由一个带有公共方法的大类组成,用户可以使用这些方法与外部设备进行交互。此外,还有提供其他功能的特殊私有“系统”方法。该设备发送响应、它自己的统计数据等。我应该如何正确地将整个班级划分为单元测试?有很多关于简单程序(如 calcs)的信息,但对于更窄的情况没有什么特别之处。我应该将整个类添加到测试中并为每个测试仅使用一种方法,还是应该仅从此类中复制方法并提供预定义的输入参数?

0 投票
3 回答
2600 浏览

c++ - C++ 的 CATCH 单元测试比较 std::array

我喜欢在我的 C++ 单元测试中使用catch。我的目标是比较std::arraystd::vector。我创建了这个失败的例子。

该测试的输出用于检查std::vector

REQUIRE(direction == false_direction) 扩展: { 0.1, 0.3, 0.4 } == { 0.1, 0.0, 0.4 }

并且对于std::array

REQUIRE(direction == false_direction) 扩展: {?} == {?}

我该怎么做才能显示实际值和预期值?我喜欢在as for的违反REQUIRE条件下有相同的显示。std::arraystd::vector

我使用最新版本的 catch (v1.10.0)。

0 投票
0 回答
250 浏览

c++ - Windows 上的 Catch 和 Clang/LLVM 的链接器错误

我对下面的代码有一个链接器问题。它适用于 Visual Studio 2015 编译器,但不适用于 Visual Studio 中的 Clang/LLVM。我尝试了可能不同的变体(下面有一些),一切都很好。它似乎是static constexpr numeric_limits<double>and的特定组合REQUIRE

最后REQUIRE评论的确切错误消息是: Error LNK2019 unresolved external symbol "public: static double const X::min" (?min@X@@2NB) referenced in function "intvoid __cdecl anonymous namespace'::dynamic initializer for 'autoRegistrar11''(void)'::1'::dtor$2" (?dtor$2@?0???__EautoRegistrar11@?A@@YAXXZ@4HA) quicktest ...\quicktest\quicktest.obj 1

幸运的是,解决方法很简单,但我想知道问题的确切原因是什么。实际上,我不知道它是源自 catch 还是源自编译器或其他任何东西。有人知道吗?

0 投票
1 回答
233 浏览

c++ - Catch JUnit 输出中没有测试用例标记

当我使用 运行我的 catch 单元测试时-r junit,输出中省略了成功的测试用例。这会导致我的 Jenkins 构建失败,因为 JUnit 插件需要 JUnit XML 中的测试用例标签。如果它们成功运行,是否有测试用例标签出现在我的 JUnit 输出中?

捕捉测试

-r junit 的输出

0 投票
2 回答
5117 浏览

c++ - 在 Visual C++ 2015 中使用 Catch2

我正在尝试使用 Catch 框架制作一个单元测试项目,但我面临着链接错误。

我已将项目设置如下:

  1. 创建本机单元测试项目
  2. 将 Catch 添加到包含目录
  3. 添加#include <catch.hpp>到 stdafx.h
  4. 编写如下简单的源文件

单元测试.cpp:

0 投票
1 回答
997 浏览

c++ - 重新定义 Catch 单元测试

我正在测试一个巨大的软件,并希望使用 Catch 来完成这项任务。我正在使用“单一包含”版本 1.9,将其集成到 Visual Studio 2012 更新 4 中并使用 C++04 标准。

正如您将在下面看到的,我使用了三个“.cpp”文件。他们每个人都参考:

  • 提供“抽象”宏的包含文件(例如#define Assert(x) REQUIRE(x));
  • 一个实用程序文件,为测试提供...实用程序;
  • 具体的测试目标包含文件;
  • 一些“使用命名空间”语句,所有 cpp 文件“使用”相同的命名空间;
  • 用宏编写的实际测试(例如Assert(2 == getNumber()))。

有关以下文件内容的更多详细信息。

此配置有效,但是其中一个测试文件每天都在变大,我想将它分成 3 个或更多。现在,假设我执行以下操作:

  • 获取测试内容的一部分test.cpp并将其移动到新文件中test2.cpp
  • 添加相同的包含和定义以使其编译;
  • 在我的主文件中包含新文件

当我运行测试时会弹出这个错误:

test2.cpp新文件在哪里。如果我将内容移回test.cpp原样,但处理数千行长的测试几乎比处理项目本身更难,而且维度可能会增长 3 到 4 倍。有没有办法将测试拆分为多个文件?

-- 注释 --

我认为在标头中包含 Catch 并catch.cpp直接使用包含标头不是一个好主意,但是我成功地将此配置与 3 个(正好 3 个)包含的.cpp测试文件一起使用,并且无法将其与 4 个文件一起使用。

我记得读过它在某种程度上与定义组件的有关,但我也可以移动代码,以便在不同的行定义测试用例并且行为不会改变。

我还尝试“清理并重建”,因为很可能脏数据保存在编译器/链接器的缓存中,但无济于事。

我现在无法创建实际的 MWE,所以我给了你一个测试设置的草图,尽可能准确,因为我认为它可能需要它。我非常愿意提供更多细节或尝试构建一个实际的 MWE 并分享它。

任何想法表示赞赏!


我的“工作”代码如下所示:

主文件

测试1.cpp

单元测试套件.h

实用程序.h


“分裂”之后:

测试1.cpp

test1.2.cpp

主文件

程序输出:

0 投票
1 回答
945 浏览

c++ - 是否有交叉编译器方法可以使用 CMake 禁用测试可执行文件的覆盖率标志?

我正在创建一个我计划在未来使用的通用 C++、CMake 和Catch项目模板,并希望为其启用代码覆盖率报告。为此,我决定将以下 CMake 模块添加到我的模块列表中:CodeCoverage.cmake。我对此的使用基本上归结为以下代码段:

细节。

  • ENABLE_COVERAGE是我用来启用/禁用代码覆盖的命令行标志,它将使用 lcov/gcov 生成。
  • tests是运行我所有单元测试的可执行文件的名称。首先我add_subdirectory用来添加它的文件夹,并在我使用的文件夹内:

    /li>

我的问题:

当我通常运行我的make脚本时,代码很容易编译,包括构建需要大约 10 秒的测试可执行文件。但是,当我为我的代码启用覆盖时,代码会卡在构建main.cpp.o(Inside tests)上,并且make永远不会完成。当我运行时make VERBOSE=1,我得到以下正在为所述对象运行的命令:

(为了便于阅读,我缩短了一些路径,缩进的行是同一命令的一部分)

显然,即使使用set(COVERAGE_EXCLUDES 'tests/*'),编译器仍在将覆盖标志附加到测试可执行文件中,我认为这是构建时间缓慢的根源。如果我的结论是正确的,那么我如何告诉编译器不要将这些标志添加到我的测试可执行文件中?如果我的结论不正确,那么如何减少此可执行文件的构建时间?(我不想直接提及标志名称,因为这可能不适用于所有编译器(我的意思是 GCC/Clang))

在旁注中,我的main.cpp包含:

一个示例测试文件包含: