使用Catch测试C++类

Sve*_*dak 5 c++ testing cmake clion

我决定做一个小项目,我将尽可能多地进行测试.我正在使用CLion(使用CMake)和Catch库进行测试.

问题是我在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
Run Code Online (Sandbox Code Playgroud)

TestClass.cpp

#include "TestClass.h"
int TestClass::add(int a, int b) {
    return a + b;
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

的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})
Run Code Online (Sandbox Code Playgroud)

Vic*_*voy 5

您没有指定要在LLL_TEST可执行目标中编译的TestClass.{.h,.cpp} :

set(TEST_FILES src/TestClass.h src/TestClass.cpp ${TEST_DIR}/test.cpp)
Run Code Online (Sandbox Code Playgroud)

或者更好地将它移动到某个共享库中,然后链接到它.

问题是因为您的项目产生了2个可执行文件:LLLLLL_TEST目标.每个都有一个目标文件和一个引用.在LLL目标中,这些引用TestClass是令人满意的,因为它们是在LLL目标中编译的,因此ld可以简单地链接它们.但是如果LLL_TEST目标编译器找不到这些符号,因为它们未在此目标中指定 - 这就是编译器说他无法解析引用的原因.

  • 如果你做'TDD' - 是的.当然,您应该考虑项目的架构并对其进行优化. (2认同)

tam*_*nez 5

Polevoy已经回答了你的问题,他也正确地将你的课程分解为图书馆.

我只想展示一下库版本的样子.您可以决定是否真的如此复杂,您需要阅读书籍或是否有任何开销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)
Run Code Online (Sandbox Code Playgroud)

此脚本创建LLL_LIB链接到两个可执行文件的静态库.如果你愿意,你可以建立一个共享的:

add_library(LLL_LIB SHARED src/TestClass.h src/TestClass.cpp)
Run Code Online (Sandbox Code Playgroud)

但静态在这里很好.