单元测试框架

Posted 用代码创造价值

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单元测试框架相关的知识,希望对你有一定的参考价值。

Test库提供了强有力的单元测试框架(UTF),它为软件开发的基本领域一单元测试提供了简单而富有弹性的解决方案,可以满足开发人员从高到低的各种需求,它的优点包括

 

  • 易于理解,任何人都可以很容易地构建单元测试模块
  • 提供测试用例、测试套件的概念,并能够以任意的复杂度组织它们

 

  • 提供丰富的测试断言,能够处理各种情况,包括C++异常

 

  • 可以很容易地初始化测试用例、测试套件或者整个测试程序
  • 可以显示测试进度,这对于大型测试是非常有用的
  • 测试信息可以显示为多种格式,如平文件或者XMI格式;
  • 支持命令行,可以指定运行任意一个测试套件或测试用例
  • 还有许多更高级的用法
这是一个非常不错的测试框架
这个框架包含的部分:
  • 测试断言
  • 测试用例和套件
  • 测试夹具
  • 测试日志
  • 运行参数
  • 函数执行监视器
  • 程序执行监视器
  • 高级议题


测试断言

在Test库中,测试断言是一组命名清楚的宏,它们的用法类似 BOOST_ ASSERT,断言测试通过。如果测试失败,则会记录出错的文件名和行号以及错误信息。
Test库中一个典型的测试断言是 BOOST CHECK EQUAL,形式是 BOOST_XXX_YYY,具体
命名规则如下:
  • BOOST_:遵循 Boost库的命名规则,宏一律以大写的 BOOST开头
  • XXX:断言的级别。WARN是警告级,不影响程序运行,也不增加错误数量; CHECK是检查级别,如果断言失败增加错误数量,但不影响程序运行; REQUIRE是最高的级别
  • YYY:各种具体的测试断言,如断言相等/不等、抛出/不抛出异常、大于或小于等等
 
很多的测试断言,见文档,我这里就举例两个:
BOOST_TEST_MESSAGE(message) :仅仅输出通知信息,默认不会显示
BOOST_XXX_EQUAL(l,r) :测试l=r,否则输出错误信息


测试用例和套件

测试用例是一个包含多个测试断言的函数,它是可以被执行的最小单元,各个测试用例之间是无关的,一个测试用例的执行失败,并不会影响其他的测试用例
测试套件是测试用例的容器,就是把一组用例放在一起的一个东西
 
测试用例是在:
 
BOOST_AUTO_TEST_CASE( t_case1 )
{
      BOOST_CHECK_EQUAL(1,1);
      //.........还有很多的其他的断言
}
 
 
测试套件:
 
BOOST_AUTO_TEST_SUITE( s_suit )
BOOST_AUTO_TEST_SUITE_END()
 
一个最简单的测试
  1. #define BOOST_TEST_MODULE example
  2. #include"boost/test/unit_test.hpp"
  3. BOOST_AUTO_TEST_SUITE( s_suit )
  4. BOOST_AUTO_TEST_CASE( t_case1 )
  5. {
  6. BOOST_CHECK_EQUAL(1,1);
  7. }
  8. BOOST_AUTO_TEST_SUITE_END()
注意:这里的 #define BOOST_TEST_MODULE example
不可去掉,不然的话,会发生一个链接错误
 

测试夹具

测试用例和测试套件构成了单元测试的主体,可以满足大部分单元测试的功能需求,但有的
时候这些还不够,因为它们不能完成测试安装和测试清理的任务。就像是Junit里的tearup和teardown一样,是启动和结束的函数:这个也是一个准备和清理函数
 
测试安装执行测试前的准备工作,初始化测试用例或测试套件所需的数据。试清理是试
安装的反向操作,执行必要的清理工作。
 
测试安装和测试清理的动作很像C++中的构造函数和析构函数,Test要求定义一个辅助类,
它的构造函数和析构函数分别执行测试安装和测试清理,之后我们就可以在每个测试用例最开始声明一个对象,它将自动完成测试安装和测试清理

基于这个基本原理,UTF中定义了“测试夹具”的概念,它实现了自动的测试安装和测试清理
  1. #define BOOST_TEST_MODULE example1
  2. #include<iostream>
  3. #include"boost/test/unit_test.hpp"
  4. //全局测试夹具
  5. struct global_fixture
  6. {
  7. global_fixture()
  8. {
  9. std::cout<<"3开始准备测试数据------->"<<std::endl;
  10. }
  11. virtual~global_fixture(){
  12. std::cout<<"3清理测试环境<---------"<<std::endl;
  13. }
  14. };
  15. //定义全局夹具
  16. BOOST_GLOBAL_FIXTURE(global_fixture);
  17. BOOST_AUTO_TEST_SUITE( s_suit )
  18. BOOST_AUTO_TEST_CASE( t_case1 )
  19. {
  20. BOOST_CHECK_EQUAL(1,1);
  21. }
  22. BOOST_AUTO_TEST_CASE( t_case2 )
  23. {
  24. BOOST_CHECK_EQUAL(3,1);
  25. }
  26. BOOST_AUTO_TEST_SUITE_END()
 
 

测试日志

测试日志是单元测试在运行过程中产生的各种文本信息,包括警告、错误和基本信息息,默认情况下这些测试日志都被定向到标准输出( stdout)。测试日志不同于测试报告,后者是对测试日志的总结
 
测试日志,一般情况下,是在当前的项目工程的IDE里看的
 

每条测试日志都有一个级别,只有超过允许级别的日志才能被输出。UTF的日志的级别从低
到高,高级别禁止了低级别的许可,但比它更高级别的日志则不受限制。
这些日志级别如下:
all:输出所有的测试日志;
success:相当于all
.....
默认情况下,UTF的日志级别是 warning,会输出大部分单元测试相关的诊断信息,但BOOST TEST MESSAGE宏由于是 message级别,它的信息不会输出
 

运行参数

命令:
--arg_name=arg_value
run_test:可以指定任意的要运行的测试用例或者是测试套件,用斜杠(/)来访问任意测试树的任意节点
还有很多其他的一些测试命令,可以非常方便的让运行按照你想要的方式来
 

后面这两个算不上是测试的东西
函数执行监视器:监视函数运行,函数发生意外时,调用这个函数
 
 



以上是关于单元测试框架的主要内容,如果未能解决你的问题,请参考以下文章

单元测试 NPE,当我添加片段自定义转换时

使用 Xcode 的单元测试框架,应用程序代码是不是可以确定它是不是作为单元测试运行?

代码质量保证-单元测试框架pytest

单元测试框架选择

python 单元测试,unittest 测试框架

一文让你快速上手 Mockito 单元测试框架