目录
一、CMake相关命令
1.macro
2.与宏参数相关的字符串
(1)${ARGC}
(2)${ARGV}
(3)${ARGN}
3.math
4.add_test
5.set_tests_properties
二、主要实现
1.顶层CMakeLists.txt
2.tests/CMakeLists.txt?
3.tests/test.cpp
4.其他文件
5.配置及编译
????????在测试时,通过宏可以方便地定义测试和设置测试的顺序。比如我们测试代码时需要多次调用调用?add_test 和 set_tests_properties来设置每个测试的预期开销,而我们通过定义一个宏(或一个函数)能够一次性处理这两个函数的调用。
一、CMake相关命令
1.macro
macro(<name> [<arg1> ...])
<commands>
endmacro()
????????定义一个名为<name>的宏,该宏接受名为<arg1>的参数。在调用宏之前,不会执行macro()到endmacro()之间列出的命令。
2.与宏参数相关的字符串
(1)${ARGC}
????????保存给定宏的所有参数数量。
(2)${ARGV}
????????保存给定宏的所有参数列表。
(3)${ARGN}
????????保存超过最后一个预期参数的参数列表,即额外参数列表。
????????宏命令与function()命令非常相似。尽管如此,还是有一些重要的区别:
- 在函数中,ARGN,ARGC,ARGV和ARGV0,ARGV1...是通常意义上的真变量。
- 在宏上,它们不是变量它们是字符串替换,就像C预处理器对宏所做的那样。
????????所以,无法使用以下命令:
if(ARGV1)
????????而我们应该这样使用:
if(${ARGV1})
3.math
math(EXPR <variable> "<expression>" [OUTPUT_FORMAT <format>])
????????计算一个数学表达式。计算数学表达式<expression>,并将<variable>设置为结果值。表达式的结果必须可以表示为64位有符号整数。
- 数学表达式必须以字符串形式给出(即用双引号括起来)。
- 结果根据选项OUTPUT_FORMAT格式化,其中<format>是以下选项之一:
- HEXADECIMAL:C代码中的十六进制表示法,即以“0x”开头。
- DECIMAL:十进制记数法。如果未指定“输出格式”选项,也会使用该选项。
math(EXPR num_macro_calls "${num_macro_calls} + 1")
4.add_test
????????CMake I 创建一个简单的单元测试_该用户还没想到好的昵称的博客-CSDN博客
5.set_tests_properties
set_tests_properties(test1 [test2...] PROPERTIES prop1 value1 prop2 value2)
????????设置测试的属性。如果未找到测试,CMake将报告错误。
????????COST属性:描述测试的成本。当启用并行测试时,测试集中的测试将按成本降序运行。项目可以通过将此属性设置为浮点值来明确定义测试的成本。
二、主要实现
1.顶层CMakeLists.txt
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
project(recipe-01 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
#根据GNU标准定义 binary 和 library 路径
include(GNUInstallDirs)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
#使用 add_subdirectory 调用 src/CMakeLists.txt 和 tests/CMakeLists.txt
add_subdirectory(src)
enable_testing()
add_subdirectory(tests)
2.tests/CMakeLists.txt?
#构建并链接 cpp_test 可执行文件
add_executable(cpp_test test.cpp)
target_link_libraries(cpp_test sum_integers)
#定义一个新宏 add_catch_test,两个参数_name _cost
macro(add_catch_test _name _cost)
#将 num_macro_calls 加1
math(EXPR num_macro_calls "${num_macro_calls} + 1")
message(STATUS "add_catch_test called with ${ARGC} arguments: ${ARGV}")
#引入一个新变量,但不能直接查询ARGN,因为它不是通常意义上的CMake变量
set(_argn "${ARGN}")
if(_argn)
message(STATUS "oops - macro received argument(s) we did not expect: ${ARGN}")
endif()
add_test(
NAME
${_name}
COMMAND
$<TARGET_FILE:cpp_test>
[${_name}] --success --out
${PROJECT_BINARY_DIR}/tests/${_name}.log --durations yes
WORKING_DIRECTORY
${CMAKE_CURRENT_BINARY_DIR}
)
set_tests_properties(
${_name}
PROPERTIES
COST ${_cost}
)
endmacro()
set(num_macro_calls 0)
#使用 add_catch_test 定义了两个测试
add_catch_test(short 1.5)
add_catch_test(long 2.5 extra_argument)
message(STATUS "in total there were ${num_macro_calls} calls to add_catch_test")
????????add_test中的命令可以参考:CMake I 使用Catch2库进行单元测试_该用户还没想到好的昵称的博客-CSDN博客?
3.tests/test.cpp
#include "sum_integers.hpp"
// this tells catch to provide a main()
// only do this in one cpp file
#define CATCH_CONFIG_MAIN
#include "catch.hpp"
#include <vector>
TEST_CASE("Sum of integers for a short vector", "[short]") {
auto integers = {1, 2, 3, 4, 5};
REQUIRE(sum_integers(integers) == 15);
}
TEST_CASE("Sum of integers for a longer vector", "[long]") {
std::vector<int> integers;
for (int i = 1; i < 1001; ++i) {
integers.push_back(i);
}
REQUIRE(sum_integers(integers) == 500500);
}
4.其他文件
????????src/sum_integers.h文件和 src/sum_integers.cpp文件见博客。
????????tests/catch.hpp文件见博客。
5.配置及编译
?????????进行测试时,时间长的会先开始。ctest命令见博客。
?
|