我是一个使用CATCH的新手,我想知道如何测试两个std::vectors
是否相等.
我非常天真的尝试是这样的:
#define CATCH_CONFIG_MAIN
#include "catch.hpp"
#include <vector>
TEST_CASE( "are vectors equal", "vectors")
{
std::vector<int> vec_1 = {1,2,3};
std::vector<int> vec_2 = {1,2,3};
REQUIRE (vec_1.size() == vec_2.size());
for (int i = 0; i < vec_1.size(); ++i)
REQUIRE (vec_1[i] == vec_2[i]);
}
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?像魔术一样的东西REQUIRE_VECTOR_EQUAL
?
另外,我的上述解决方案是,如果一个数组包含双精度数则传递{1.0, 2.0, 3.0}
; 如果因此而认为两个向量不相等就没问题.
请问,请问一个与Catch一起用于测试C++的模拟系统?我真的很喜欢一个不要求我定义任何新类的东西(比如我看过Google Mock):),类似于Mockito for Java.到目前为止,我已经检查了Mockitopp和Fakeit.Fakeit的问题在于它不支持多重继承,而Mockitopp似乎比Fakeit具有更少的功能(我不知道它是否支持多重继承).Fakeit有什么好处,它实际上似乎与Catch和许多其他测试框架集成.
谢谢.
在Catch C++单元测试框架中是否有可能比较基于浮点类型的std :: vectors?我知道我可以比较两个容器和每个元素的大小(使用约),但这很麻烦.
积分类型向量的比较适当地工作.
现在,我必须使用这样的结构
REQUIRE(computed.size() == expected.size());
for (size_t i = 0; i < computed.size(); ++i)
REQUIRE(computed[i] == Approx(expected[i]));
Run Code Online (Sandbox Code Playgroud)
但我想使用一个衬垫(它适用于整体类型):
REQUIRE(computed == expected);
Run Code Online (Sandbox Code Playgroud) 我是单元测试的新手,并决定将Catch框架用于c ++,因为它似乎很容易与其一个头文件集成.但是,我有一个多文件二进制搜索树程序(文件是:main.cpp,Tree.h,Tree.hxx,TreeUnitTests.cpp,catch.hpp).如果我在main.cpp中注释掉我的int main()函数,我只能运行单元测试.我知道它与我的TreeUnitTests.cpp中的'#define CATCH_CONFIG_MAIN'声明冲突,但如果我不包含该声明,我无法运行单元测试.每次我想运行单元测试时,如何在不必评论main()的情况下运行两者?
这是我正在使用的头文件:https: //raw.githubusercontent.com/philsquared/Catch/master/single_include/catch.hpp
我发现它的Catch教程并用作指南:https: //github.com/philsquared/Catch/blob/master/docs/tutorial.md
一些相关文件供参考: main.cpp:
//******************* ASSN 01 QUESTION 02 **********************
#include "Tree.h"
#include <iostream>
using namespace std;
/*
int main()
{
//creating tree with "5" as root
Tree<int> tree(5);
tree.insert(2);
tree.insert(88);
tree.inorder();
cout << "does tree contain 2?: ";
cout << tree.find(2) << endl;
cout << "does tree contain 3?: ";
cout << tree.find(3) << endl;
Tree<int> copytree(tree);
cout << "copied original tree..." << endl;
copytree.preorder();
cout << "after deletion …
Run Code Online (Sandbox Code Playgroud) 经过大量的努力和研究,我成功地创建了多个 cmake 目标,以将运行我的程序与运行代码测试分开。但我不喜欢我所做的,因为我看到CMakeList.txt
文件中有冗余。
目前,我必须将每个新的源文件添加到两个目标,以便源目标可以使用该文件进行构建,并且测试目标可以构建,因为它们需要测试该文件。我无法将整个源目标放入测试目标中,因为这样测试目标将包含两个主文件。
我对如何修复冗余的唯一想法是将源目标中没有文件的所有文件main.cpp
放入某个组中,然后将该组附加到两个目标。这样,源目标仅包含main.cpp
文件和源文件组,测试目标包含其所有测试和源文件组。因此文件组基本上是两个目标之间的所有重叠部分。我只是不知道该怎么做。
以下是我发现的其他堆栈溢出问题,这些问题帮助我到达了现在的位置:
这是我为试验 catch2 和 cmake 而制作的测试项目,目前适用于构建目标“tests”和“catch2Test”:
/catch2Test // <-- project folder
|---- /include
| |---- /catch2
| |---- catch.hpp
|---- /src
| |---- /myMath
| | |---- factorial.cpp
| | |---- factorial.h
| |---- main.cpp
| |---- CMakeLists.txt
|---- /test
| |---- test_main.cpp
| |---- test_factorial.cpp
| |---- CMakeLists.txt
|---- CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)
/include/catch2/catch.hpp
是catch2的库头文件
/src/myMath/
包含阶乘实现的头文件和代码文件,与catch2 教程中使用的相同。这也是阶乘测试的实现的来源。
/src/main.cpp …
我正在使用 Catch v2.13.1
比较浮点值的正确方法是什么?我以为下面的会失败,但都通过了。
REQUIRE(1147332687.7189338 == Approx(1147332688.4281545).margin(0.0001));
REQUIRE(1147332687.7189338 == Approx(1147332688.4281545));
Run Code Online (Sandbox Code Playgroud)
然而这按预期失败了
REQUIRE(abs(1147332687.7189338 - 1147332688.4281545) <= Approx(0).margin(0.0001));
Run Code Online (Sandbox Code Playgroud)
我不明白为什么前两个语句不起作用
这个断言的要点是什么REQUIRE_NOTHROW
?如果我只是放置一条语句并且不将其包装在任何断言宏中,那么如果它无论如何抛出都会失败?
我正在使用 Catch2 作为库来测试我的项目。我遵循了 Catch 文档中的每个步骤,但是当我运行测试时,出现以下错误:
CMakeFiles/tests.dir/tests/IntegerIntervalTest.cpp.o: in function "____C_A_T_C_H____T_E_S_T____0()":
/home/davide/cpp-project/tests/IntegerIntervalTest.cpp:8: undefined reference to "domain::IntegerAbstractInterval<int, int>::IntegerAbstractInterval(int, int)"
对于测试“类”中的每个方法调用,都会重复此错误。
CMake 列表:
PROJECT(cpp_project)
CMAKE_MINIMUM_REQUIRED(VERSION 3.5)
INCLUDE(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG(-std=c++14 COMPILER_SUPPORTS_CXX14)
IF (COMPILER_SUPPORTS_CXX14)
ADD_COMPILE_OPTIONS("-std=c++14")
ELSE ()
MESSAGE(FATAL_ERROR "Compiler ${CMAKE_CXX_COMPILER} has no C++14 support.")
ENDIF ()
set(BASE_SRCS src/Bound.cpp src/Bound.hpp src/Infinity.cpp src/Infinity.hpp src/AbstractInterval.cpp src/AbstractInterval.hpp
src/UndefinedOperationException.hpp src/IntegerAbstractInterval.cpp src/IntegerAbstractInterval.hpp src/FloatingPointAbstractInterval.cpp
src/FloatingPointAbstractInterval.hpp)
ADD_COMPILE_OPTIONS("-Wall" "-Wextra" "-Wpedantic" "-Werror" )
ADD_LIBRARY(cpp-project ${BASE_SRCS})
INCLUDE_DIRECTORIES(libs/variant/include)
set(EXECUTABLE_OUTPUT_PATH bin)
set(CATCH_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/catch)
add_library(Catch INTERFACE)
target_include_directories(Catch INTERFACE ${CATCH_INCLUDE_DIR})
set(TEST_SRCS tests/InfinityTest.cpp tests/IntegerIntervalTest.cpp)
add_executable(tests ${BASE_SRCS} ${TEST_SRCS})
target_link_libraries(tests Catch)
Run Code Online (Sandbox Code Playgroud)
这是测试文件IntegerIntervalTest.cpp
:
#include …
Run Code Online (Sandbox Code Playgroud)