visual-decaf / decaf-compiler

Compiler of decaf language
1 stars 3 forks source link

学习使用单元测试框架Catch2 #3

Closed DistinctWind closed 1 year ago

DistinctWind commented 1 year ago

考虑到单元测试框架在过去的学习当中都从未使用过,需要学习单元测试框架的使用方法。

DistinctWind commented 1 year ago

Catch2的CMake集成

我们已经选用了vcpkg作为第三方库的包管理软件,并在CMakePresets.json当中指定了使用这个vcpkg的包。所以我们可以直接在cmake文件当中引用Catch2的内容。

find_package(Catch2 3 REQUIRED)
include(CTest)
include(Catch)

这三行代码负责找到Catch2,并且将Catch2集成到CTest当中,方便测试的运行。

单元测试

一个单元测试是一个可运行的可执行文件,通过CMake的add_executable指令添加。

为了项目的整洁,我们的单元测试计划都放在tests文件夹下,通过cmake的add_subdirectory的功能,将该子文件夹包含进来。

add_subdirectory(tests)

单元测试示例

我们提前编写一个简单的将两数相加的库。以下来自add.cpp

#include "add.h"

int add(int a, int b) {
    return a + b;
}

以下来自add.h

#ifndef CATCH2_LEARNING_ADD_H
#define CATCH2_LEARNING_ADD_H

int add(int a, int b);

#endif //CATCH2_LEARNING_ADD_H

然后是添加这个库到cmake文件当中的代码:

add_library(add add.cpp)
target_include_directories(add INTERFACE .)

编写单元测试

#include "add.h"
#include <catch2/catch_test_macros.hpp>

TEST_CASE("Add test", "[add]") {
    REQUIRE(add(1, 2) == 3);
}

重点是包含单元测试框架catch2的头文件catch2/catch_test_macros.hpp,然后就能使用单元测试的功能了。

我们新建了一个测试用例TEST_CASE("Add test", "[add]"),测试内容是要求REQUIRE函数add(1, 2)的调用结果为3

将单元测试添加到构建目标

使用以下CMake指令完成:

add_executable(test_add_lib test_add_lib.cpp)
target_link_libraries(test_add_lib PRIVATE add Catch2::Catch2WithMain)
catch_discover_tests(test_add_lib)

测试文件test_add_lib.cpp中包含了单元测试代码。为了构建单元测试(单元测试是可执行文件)将示例测试文件test_add_lib.cpp命名为目标test_add_lib,然后将add库和Catch2WithMain链接起来(Catch2WithMain这个目标提供了main函数,不需要我们自己写)。

构建并运行测试

使用推荐的开发环境,能直接在vscode当中运行测试及其运行结果。

运行测试

显示结果

DistinctWind commented 1 year ago

以上项目代码来自我的另一个示例仓库,注意观察new分支,以及new分支即将合并到main分支的Pull Request,我们单元测试结果也会显现在你的Pull Request当中。

DistinctWind commented 1 year ago

参考Catch2文档

看一下这个Catch2单元测试框架的文档,只需要理解TEST_CASEREQUIRESECTION三个宏就可以了

DistinctWind commented 1 year ago

单元测试的学习已经完成