我正在尝试使用 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 规则,而且我似乎无法在网上找到包含许多测试文件的示例。
感谢您的帮助。
我的文件结构:
-|
|-- 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
数组中。希望对以后看到这一点的人有所帮助。