使用 Catch 进行 C++ 测试 类
C++ testing classes with Catch
我决定做一个小项目,我会尽可能多地进行测试。我正在使用 CLion(使用 CMake)和 Catch 库进行测试。
问题是我在 运行 测试 class 时得到了 undefined reference to TestClass::add
方法。
这是我的设置(这是一个虚拟设置,因为我想确定是否一切正常):
TestClass.h
#ifndef LLL_TESTCLASS_H
#define LLL_TESTCLASS_H
class TestClass {
public:
int add(int a, int b);
};
#endif //LLL_TESTCLASS_H
TestClass.cpp
#include "TestClass.h"
int TestClass::add(int a, int b) {
return a + b;
}
test.cpp -- 包含测试的文件
#define CATCH_CONFIG_MAIN
#include "catch.hpp"
#include "../src/TestClass.h"
TEST_CASE("addition") {
TestClass testClass;
REQUIRE(testClass.add(2,3) == 5);
REQUIRE(testClass.add(-1, 1) == 0);
REQUIRE(testClass.add(2, 4) == 1);
}
CMakeLIsts.txt
cmake_minimum_required(VERSION 3.2)
project(LLL)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(LIB_DIR "lib")
include_directories(${LIB_DIR}/Catch)
include_directories(${LIB_DIR}/Eigen)
set(SRC_DIR src)
set(SOURCE_FILES ${SRC_DIR}/main.cpp src/TestClass.h src/TestClass.cpp)
add_executable(LLL ${SOURCE_FILES})
set(TEST_DIR test)
set(TEST_FILES ${TEST_DIR}/test.cpp)
add_executable(LLL_TEST ${TEST_FILES})
您没有指定要在 LLL_TEST
可执行目标中编译的 TestClass.{.h, .cpp}:
set(TEST_FILES src/TestClass.h src/TestClass.cpp ${TEST_DIR}/test.cpp)
或者最好将它移动到某个共享库中,然后 link 移动到它。
问题是因为您的项目产生了 2 个可执行文件:LLL
和 LLL_TEST
目标。他们每个人都有一个目标文件和一个参考。在 LLL
目标中,这些对 TestClass
的引用是满足的,因为它们是在 LLL
目标中编译的,所以 ld
可以简单地 link 它们。但是如果 LLL_TEST
目标编译器找不到这些符号,因为它们未在此目标中指定 - 这就是编译器说他无法解析引用的原因。
Polevoy 已经回答了您的问题,关于将您的 class 分解为图书馆的问题,他也是正确的。
我只想展示库版本的外观。您可以决定它是否真的复杂到您需要阅读书籍,或者它是否对执行 TDD 有任何开销。
cmake_minimum_required(VERSION 3.2)
project(LLL)
set(CMAKE_CXX_STANDARD 11) # adds -std=c++11
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(LIB_DIR "lib")
include_directories(${LIB_DIR}/Catch)
include_directories(${LIB_DIR}/Eigen)
add_library(LLL_LIB src/TestClass.h src/TestClass.cpp)
add_executable(LLL src/main.cpp)
target_link_libraries(LLL LLL_LIB)
add_executable(LLL_TEST test/test.cpp)
target_link_libraries(LLL_TEST LLL_LIB)
此脚本创建链接到两个可执行文件的静态库 LLL_LIB
。如果你愿意,你可以建立一个共享的:
add_library(LLL_LIB SHARED src/TestClass.h src/TestClass.cpp)
但静态在这里就可以了。
我决定做一个小项目,我会尽可能多地进行测试。我正在使用 CLion(使用 CMake)和 Catch 库进行测试。
问题是我在 运行 测试 class 时得到了 undefined reference to TestClass::add
方法。
这是我的设置(这是一个虚拟设置,因为我想确定是否一切正常):
TestClass.h
#ifndef LLL_TESTCLASS_H
#define LLL_TESTCLASS_H
class TestClass {
public:
int add(int a, int b);
};
#endif //LLL_TESTCLASS_H
TestClass.cpp
#include "TestClass.h"
int TestClass::add(int a, int b) {
return a + b;
}
test.cpp -- 包含测试的文件
#define CATCH_CONFIG_MAIN
#include "catch.hpp"
#include "../src/TestClass.h"
TEST_CASE("addition") {
TestClass testClass;
REQUIRE(testClass.add(2,3) == 5);
REQUIRE(testClass.add(-1, 1) == 0);
REQUIRE(testClass.add(2, 4) == 1);
}
CMakeLIsts.txt
cmake_minimum_required(VERSION 3.2)
project(LLL)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(LIB_DIR "lib")
include_directories(${LIB_DIR}/Catch)
include_directories(${LIB_DIR}/Eigen)
set(SRC_DIR src)
set(SOURCE_FILES ${SRC_DIR}/main.cpp src/TestClass.h src/TestClass.cpp)
add_executable(LLL ${SOURCE_FILES})
set(TEST_DIR test)
set(TEST_FILES ${TEST_DIR}/test.cpp)
add_executable(LLL_TEST ${TEST_FILES})
您没有指定要在 LLL_TEST
可执行目标中编译的 TestClass.{.h, .cpp}:
set(TEST_FILES src/TestClass.h src/TestClass.cpp ${TEST_DIR}/test.cpp)
或者最好将它移动到某个共享库中,然后 link 移动到它。
问题是因为您的项目产生了 2 个可执行文件:LLL
和 LLL_TEST
目标。他们每个人都有一个目标文件和一个参考。在 LLL
目标中,这些对 TestClass
的引用是满足的,因为它们是在 LLL
目标中编译的,所以 ld
可以简单地 link 它们。但是如果 LLL_TEST
目标编译器找不到这些符号,因为它们未在此目标中指定 - 这就是编译器说他无法解析引用的原因。
Polevoy 已经回答了您的问题,关于将您的 class 分解为图书馆的问题,他也是正确的。
我只想展示库版本的外观。您可以决定它是否真的复杂到您需要阅读书籍,或者它是否对执行 TDD 有任何开销。
cmake_minimum_required(VERSION 3.2)
project(LLL)
set(CMAKE_CXX_STANDARD 11) # adds -std=c++11
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(LIB_DIR "lib")
include_directories(${LIB_DIR}/Catch)
include_directories(${LIB_DIR}/Eigen)
add_library(LLL_LIB src/TestClass.h src/TestClass.cpp)
add_executable(LLL src/main.cpp)
target_link_libraries(LLL LLL_LIB)
add_executable(LLL_TEST test/test.cpp)
target_link_libraries(LLL_TEST LLL_LIB)
此脚本创建链接到两个可执行文件的静态库 LLL_LIB
。如果你愿意,你可以建立一个共享的:
add_library(LLL_LIB SHARED src/TestClass.h src/TestClass.cpp)
但静态在这里就可以了。