如何在 Makefile 中正确设置 Catch2 测试?

问题描述 投票:0回答:1

我正在尝试使用 Catch2 设置测试并在 Makefile 中设置测试规则,这是先决条件,我无法使用 CMake。我不知道该怎么做。

例如,我有一些类似的内容:

src
|
|--------- model
              |
              | 
              |-------- classA.hpp
              |-------- classA.cpp
              |-------- classB.hpp
              |-------- classB.cpp

tests/
|
|-------- catch.hpp
|-------- test-main.cpp
|-------- test_classA.cpp
|-------- test_classB.cpp

我希望为

test
目标制定 Makefile 规则来运行所有测试。从 Catch 文档中阅读“实际示例”对于设置文件很有帮助,但我对之后要做什么有点迷失。 test-main 使用连字符而不是下划线,以避免稍后使用通配符(因为它只编译一次)。
目前,我的(简化的)Makefile 是这样的:

testdir := tests test_sources := $(wildcard $(testdir)/test_*.cpp)

然后,这就是示例让我困惑的地方,似乎我需要编译
test-main.cpp

,模型目录中的类,并在创建测试可执行文件期间添加测试源文件。

这就是上面 Catch 的 README 中的例子所说的。

我只是不知道如何创建允许我这样做的 Makefile 规则,而且我似乎无法在网上找到包含许多测试文件的示例。

感谢您的帮助。

c++ unit-testing testing makefile catch2
1个回答
0
投票

我的文件结构:

-| |-- src/ | |-- model/ | | |-- classA.cpp | | |-- classB.cpp | | |-- classA.hpp | | |-- classB.hpp | |-- main.cpp |-- tests/ | |-- test_classA.cpp | |-- test_classB.cpp |-- makefile

然后是文件的基本最小实现(为了简单起见,所有代码块都在一个代码块中,但将它们拆分到上面的文件树中

// main.cpp #include "model/classA.hpp" #include "model/classB.hpp" int main(){ return 0.0; } // classA.hpp struct A { double a; A(double a); }; // classA.cpp #include "classA.hpp" A::A(double a): a(a) {}; // classB.hpp and classB.cpp // copy class A files and change all the As to Bs

测试是:

// test_classA.cpp #include <catch2/catch_test_macros.hpp> #include "../src/model/classA.hpp" TEST_CASE( "Test class A" ) { A myA(1.0); REQUIRE( myA.a == 1.0 ); } // test_classB.cpp #include <catch2/catch_test_macros.hpp> #include "../src/model/classB.hpp" TEST_CASE( "Test class B" ) { B myB(2.0); REQUIRE( myB.b == 2.0 ); }

最后生成文件是

# files to pull headers/source or to wite object code IDIR=src SDIR=src ODIR=obj # compiler and flags CC=g++ --std=c++14 CFLAGS=-I$(IDIR) -Wall ## specify the needed files, separated as model and main _MAIN = main _MODEL = classA classB # create path to class header/source MODELDPS = $(patsubst %, $(IDIR)/model/%.hpp, $(_MODEL)) MODELSRC = $(patsubst %, $(SDIR)/model/%.cpp, $(_MODEL)) MAINSRC = $(patsubst %, $(SDIR)/%.cpp, $(_MAIN)) # object files MODELOBJ = $(patsubst %, $(ODIR)/model/%.o, $(_MODEL)) MAINOBJ = $(patsubst %, $(ODIR)/%.o, $(_MAIN)) # specify code dependencies MODELDEP = $(MODELDPS) $(MODELSRC) MAINDEP = $(MAINSRC) $(MODELDEP) ## Main rule for creating the code base ## it will create model and main object files code: $(MAINOBJ) $(MODELOBJ) $(CC) -o $@ $^ $(CFLAGS) ## Rules for each subsection -- only update if their dependencies change $(MODELOBJ): $(ODIR)/model/%.o: $(SDIR)/model/%.cpp $(MODELDEP)| obj/model/ $(CC) -c -o $@ $< $(CFLAGS) $(MAINOBJ): $(ODIR)/%.o: $(SDIR)/%.cpp $(MAINDEP)| obj/ $(CC) -c -o $@ $< $(CFLAGS) ## create the tests TEST = $(patsubst %, ./tests/test_%.cpp, $(_MODEL)) tests: code $(CC) -o ./tests/tests.o $(MAINOBJ) $(MODELOBJ) $(TEST) $(CFLAGS) -l catch2 ./tests/tests.o --success ## this rule creates an obj directory if none exists obj/: mkdir -p obj obj/model/: mkdir -p obj/model

此 makefile 将为目标代码创建目录,为所有类创建目标代码,并创建与类链接的测试。

您可以使用

创建代码本身

make code

并使用 
进行并运行测试

make tests

这两个程序都在我的计算机上运行,并给出了简单的代码。

通过更改

_MODEL

_MAIN
数组也可以轻松添加新文件。假设您添加一个类 C。然后将
classC
标记到
_MODEL
数组中。希望对以后看到这一点的人有所帮助。
    

© www.soinside.com 2019 - 2024. All rights reserved.