标签: catch2

运行单元测试,但不包括Catch2中的特定标签

我可以基于“不匹配” Catch2中的特定标签来运行测试用例吗?

TEST_CASE("Check the data validity","[Working]"){
  REQUIRE(true);
}

TEST_CASE("Check the input","[InProgress]"){
  REQUIRE(true);
}
TEST_CASE("Validate the response","[NotWorking]"){
  REQUIRE(false);
}
Run Code Online (Sandbox Code Playgroud)

[NotWorking]完成实现该功能之前,我想调用不属于标签的测试用例。

c++ catch2

5
推荐指数
1
解决办法
411
查看次数

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

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

例如:

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

#include <catch2/catch.hpp>

TEST_CASE("test", "[test]")
{
    CHECK(true);
}
Run Code Online (Sandbox Code Playgroud)

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

#define CATCH_CONFIG_RUNNER
#include <catch2/catch.hpp>

int main(int argc, char* argv[])
{
    return Catch::Session().run(argc, argv); // run tests
}
Run Code Online (Sandbox Code Playgroud)

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

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

catch main started..
Filters: [test]
===============================================================================
No tests ran
Run Code Online (Sandbox Code Playgroud)

我尝试将运行程序代码放入静态库中的函数中,但这没有帮助。

问题:

  • catch 究竟如何找到它的测试用例?
  • 为什么会失败?
  • 我该如何修复它?

c++ unit-testing visual-c++ catch-unit-test catch2

5
推荐指数
0
解决办法
374
查看次数

在 Catch2 中检查近似零的规范方法是什么?

与 Catch2 中的近似零进行比较的规范方法是什么?

我发现这种方式的容差为 1e-12,但目前尚不清楚这是最好的方式:

TEST("a approx. equal to b", "[test]"){
    REQUIRE( a - b == (0_a).margin(1e-12) );
}
Run Code Online (Sandbox Code Playgroud)

我不是在问如何比较浮动。我知道这不是一个简单的问题。我问的是如何使用 Catch2 给定事先已知的特定容差。

以下内容不起作用,因为相对(epsilon)错误在零附近表现不佳:

TEST("a approx. equal to b", "[test]"){
    REQUIRE( a - b == (0_a).epsilon(1e-5) );
}
Run Code Online (Sandbox Code Playgroud)

其他可能的(不太好)(替代方案似乎是

TEST("a approx. equal to b", "[test]"){
    REQUIRE( std::abs( a - b ) < 1e-12 );
}
Run Code Online (Sandbox Code Playgroud)
TEST("a approx. equal to b", "[test]"){
    REQUIRE_THAT( a - b, WithinULP(0., ???));
}
Run Code Online (Sandbox Code Playgroud)
TEST("a approx. equal to b", "[test]"){
    REQUIRE_THAT( a, WithinULP(b, ???));
}
Run Code Online (Sandbox Code Playgroud)

c++ floating-point c++14 floating-point-comparison catch2

4
推荐指数
1
解决办法
953
查看次数

是否可以使用 Catch2 来测试 MPI 代码?

我正在使用相当大的 MPI 代码。我开始将单元测试包含到现有的代码库中。但是,一旦被测单元使用 MPI 例程,测试可执行文件就会崩溃,并显示错误消息“之前调用 MPI 例程MPI_Init

  • 解决这个问题的最佳方法是什么?
  • 我可以使用多个 MPI 等级运行测试吗?

c++ mpi catch2

4
推荐指数
1
解决办法
854
查看次数

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

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

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

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

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

LNK2019 unresolved external symbol "public: bool __thiscall MyClass::Check(int,int)" (?Check@MyClass@@QAE_NHH@Z) referenced in function "void __cdecl ____C_A_T_C_H____T_E_S_T____0(void)" (?____C_A_T_C_H____T_E_S_T____0@@YAXXZ)
Run Code Online (Sandbox Code Playgroud)

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

unit-testing visual-c++ catch-unit-test catch2

4
推荐指数
1
解决办法
4889
查看次数

Catch2可以用C语言吗?

我正在编写一个 dll,它支持与 C 和 C++ 语言应用程序的接口。dll 本身是用 C++ 编写的,所以问题是我可以使用 Catch2 框架对 C 和 C++ 应用程序进行单元测试吗?

我需要注意哪些事项?有没有任何人可以建议的替代方案?

c c++ unit-testing catch2

4
推荐指数
1
解决办法
1408
查看次数

如何在 Bazel 项目中设置 Catch2

我已经启动了一个简单的 C++ 项目,该项目使用 Bazel 作为构建系统,并希望将 Catch2 添加到其中作为测试框架。

这是我的项目到目前为止的样子:

WORKSPACE -> empty file
src/
  Money.hpp
  Money.cpp
BUILD
Run Code Online (Sandbox Code Playgroud)

其中 BUILD 只是

WORKSPACE -> empty file
src/
  Money.hpp
  Money.cpp
BUILD
Run Code Online (Sandbox Code Playgroud)

我希望能够为每个创建测试cc_library,在本例中为Money. 我尝试设置它,但与 Catch2 main 感到困惑。任何有关如何做到最好的建议都将受到赞赏!

c++ testing catch-unit-test bazel catch2

3
推荐指数
1
解决办法
1512
查看次数

catch2 单包含导致测试中“未定义的引用”

我见过很多有同样问题的例子,但它们并不适用于我的情况。

我有以下文件结构:

unit-tests/CMakeLists.txt
unit-tests/FlaAlgoTests/CMakeLists.txt
unit-tests/FlaAlgoTests/catch_test_runner.cpp
Run Code Online (Sandbox Code Playgroud)

Proj/CMakeLists.txt

ExternalProject_Add(
        catch
        PREFIX ${CMAKE_BINARY_DIR}/catch2
        GIT_REPOSITORY https://github.com/catchorg/Catch2.git
        TIMEOUT 10
        UPDATE_COMMAND ${GIT_EXECUTABLE} pull
        CONFIGURE_COMMAND ""
        BUILD_COMMAND ""
        INSTALL_COMMAND ""
        LOG_DOWNLOAD ON
)
ExternalProject_Get_Property(catch source_dir)
include_directories(${source_dir}/single_include/catch2)
Run Code Online (Sandbox Code Playgroud)

并在Proj/TestDir1/CMakeLists.txt

add_executable(
        catch_test_runner
        catch_test_runner.cpp
)
Run Code Online (Sandbox Code Playgroud)

哪里catch_test_runner.cpp

#include <iostream>
#include "catch.hpp"

#define CATCH_CONFIG_MAIN

TEST_CASE("Yeet", "[beep]"){
    REQUIRE(true);
    REQUIRE(2 == 1);
}
Run Code Online (Sandbox Code Playgroud)

所有这些看起来都很好,似乎基本上是我为此找到的众多指南的复制/粘贴。但是,我遇到以下问题:

[100%] Linking CXX executable catch_test_runner.exe
CMakeFiles/catch_test_runner.dir/catch_test_runner.o: In function `::____C_A_T_C_H____T_E_S_T__(void)':
/cygdrive/c/Users/dbak/Projects/firmware/unit-tests/FlaAlgoTests/catch_test_runner.cpp:7: undefined reference to `Catch::StringRef::StringRef(char const*)'
/cygdrive/c/Users/dbak/Projects/firmware/unit-tests/FlaAlgoTests/catch_test_runner.cpp:7:(.text+0x32): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `Catch::StringRef::StringRef(char …
Run Code Online (Sandbox Code Playgroud)

c++ cmake catch2

2
推荐指数
1
解决办法
3642
查看次数

如何获取 CMake 单元测试的相对路径?

我有一个使用 CMake 构建的项目,它使用 Catch2 进行单元测试。一些单元测试练习从文件加载数据的代码,如下所示:

std::string resource_dir = "TEST_CWD/resources/";
std::ifstream infile{resource_dir + "datafile.txt"}
Run Code Online (Sandbox Code Playgroud)

问题是如何正确获取 的值TEST_CWD

目录结构很简单(并不是一成不变的):

my_project/
    test/
        resources/datafile.txt
        loader_test.cpp
Run Code Online (Sandbox Code Playgroud)

留空TEST_CWD有时会起作用,但在通过 IDE 运行测试时会中断。使用绝对路径设置环境变量也可以,但在其他机器上会崩溃。同样,强制所有用户手动设置环境变量也是用户不友好的。

在 CMake 项目中指定相对文件路径的好方法是什么?

c++ unit-testing cmake catch2

0
推荐指数
1
解决办法
1335
查看次数