CMake Tutorial(3)——Installing and Testing

现在来为我们的工程添加安装和测试的功能。安装的规则很简单也很直接。对于MathFunctions库,我们可以通过在MathFunctions文件夹下的文件CMakeLists.txt中加入一下两行来完成对它的进行安装设置:

# add install
install (TARGETS MathFunctions DESTINATION bin)
install (FILES MathFunctions.h DESTINATION include)

接着我们在工程目录最顶层的CMakeLists.txt文件中加入以下内容,用于安装可执行文件并且配置头文件:

# add the install targets
install(TARGETS Tutorial DESTINATION bin)
install(FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h"
  DESTINATION include)

完成上面的工作,我们就结束了对安装的配置了。之后你只需要构建工程,并使用make install命令就可以完成安装,它会把对应的header files,libraries,和可执行文件放入对应的位置。你可以通过修改CMake变量CMAKE_INSTALL_PREFIX来决定你的安装的根目录。在Linux下面,默认为/use/local。

现在,我们来为你的工程添加测试样例,方便你以后进行基本的测试,避免每次都要手动输命令。添加测试的方法也很简单,你可以通过在工程顶层目录下的CMakeLists.txt文件中加入和下面类似的代码,用于测试和验证你的应用是否正常工作。

# enable testing
enable_testing()

# does the application run
add_test (TutorialRuns Tutorial 25)

# does is sqrt of 25
add_test (TutorialComp25 Tutorial 25)
set_tests_properties (TutorialComp25
  PROPERTIES PASS_REGULAR_EXPRESSION "25 is 5"
  )

# does it handle negative numbers
add_test (TutorialNegative Tutorial -25)
set_tests_properties (TutorialNegative 
  PROPERTIES PASS_REGULAR_EXPRESSION "-25 is 0"
  )

# does it handle small numbers
add_test (TutorialSmall Tutorial 0.0001)
set_tests_properties (TutorialSmall 
  PROPERTIES PASS_REGULAR_EXPRESSION "0.0001 is 0.01"
  )

# does the usage message work?
add_test (TutorialUsage Tutorial)
set_tests_properties (TutorialUsage 
  PROPERTIES PASS_REGULAR_EXPRESSION "Usage:.*number"
  )

先来解释下add_test命令的使用,第一参数为测试样例的名称,第二个为测试对象,第三个是测试参数。
之后重新构建工程,你可以通过命令ctest进行测试。第一个测试用于验证程序是否在运行,并且没有发生段错误(segfault)或者崩溃,它会返回一个0。这是CTest测试的基本形式。其它的测试都使用了属性“PASS_REGULAR_EXPRESSION”,用于验证测试的输出内容的字符串是否与你所设定的相符。当测试结果出错时,它会打印使用消息。对于上面测试的代码,你可能会觉得很麻烦,每测试一种,都要输出一遍几乎一样的代码,这看上去相当麻烦。为此,你可以通过定义一个宏来方便的进行功能一样的操作,这很函数很像。

#define a macro to simplify adding tests, then use it
macro (do_test arg result)
  add_test (TutorialComp${arg} Tutorial ${arg})
  set_tests_properties (TutorialComp${arg}
    PROPERTIES PASS_REGULAR_EXPRESSION ${result})
endmacro (do_test)

# do a bunch of result based tests
do_test (25 "25 is 5")
do_test (-25 "-25 is 0")

这个宏定义了do_test操作,并接受两个参数arg,result。

猜你喜欢

转载自blog.csdn.net/YZS_L_H/article/details/63683185