我可以基于“不匹配” 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]完成实现该功能之前,我想调用不属于标签的测试用例。
我通常使用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)
我尝试将运行程序代码放入静态库中的函数中,但这没有帮助。
问题:
与 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) 我正在使用相当大的 MPI 代码。我开始将单元测试包含到现有的代码库中。但是,一旦被测单元使用 MPI 例程,测试可执行文件就会崩溃,并显示错误消息“之前调用 MPI 例程MPI_Init”
我是 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 进行单元测试的正确方法,我将不胜感激。
我正在编写一个 dll,它支持与 C 和 C++ 语言应用程序的接口。dll 本身是用 C++ 编写的,所以问题是我可以使用 Catch2 框架对 C 和 C++ 应用程序进行单元测试吗?
我需要注意哪些事项?有没有任何人可以建议的替代方案?
我已经启动了一个简单的 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 感到困惑。任何有关如何做到最好的建议都将受到赞赏!
我见过很多有同样问题的例子,但它们并不适用于我的情况。
我有以下文件结构:
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) 我有一个使用 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 项目中指定相对文件路径的好方法是什么?
catch2 ×9
c++ ×8
unit-testing ×4
cmake ×2
visual-c++ ×2
bazel ×1
c ×1
c++14 ×1
mpi ×1
testing ×1