华为软件编程规范学习(七)--可测性_华为 软件测试规范-程序员宅基地

技术标签: C/C++  编程规范  

华为软件编程规范学习(七)--可测性

转自:http://blog.csdn.net/ce123_zhouwei/article/details/8887863

7-1:在同一项目组或产品组内,要有一套统一的为集成测试与系统联调准备的调测开关及相应打印函数,并且要有详细的说明

说明:本规则是针对项目组或产品组的。

7-2:在同一项目组或产品组内,调测打印出的信息串的格式要有统一的形式。信息串中至少要有所在模块名(或源文件名)及行号

说明:统一的调测信息格式便于集成测试。

7-3:编程的同时要为单元测试选择恰当的测试点,并仔细构造测试代码、测试用例,同时给出明确的注释说明。测试代码部分应作为(模块中的)一个子模块,以方便测试代码在模块中的安装与拆卸(通过调测开关)

说明:为单元测试而准备。

7-4:在进行集成测试/系统联调之前,要构造好测试环境、测试项目及测试用例,同时仔细分析并优化测试用例,以提高测试效率

说明:好的测试用例应尽可能模拟出程序所遇到的边界值、各种复杂环境及一些极端情况等。

7-5:使用断言来发现软件问题,提高代码可测性

说明:断言是对某种假设条件进行检查(可理解为若条件成立则无动作,否则应报告),它可以快速发现并定位软件问题,同时对系统错误进行自动报警。断言可以对在系统中隐藏很深,用其它手段极难发现的问题进行定位,从而缩短软件问题定位时间,提高系统的可测性。实际应用时,可根据具体情况灵活地设计断言。

示例:下面是C语言中的一个断言,用宏来设计的。(其中NULL为0L)

[plain]  view plain  copy
  1. #ifdef _EXAM_ASSERT_TEST_  // 若使用断言测试  
  2. void exam_assert(char * file_name, unsigned int line_no )  
  3. {  
  4.    printf( "\n[EXAM]Assert failed: %s, line %u\n",  
  5.            file_name, line_no );  
  6.     abort();  
  7. }  
  8. #define EXAM_ASSERT( condition )  
  9.     if(condition) // 若条件成立,则无动作  
  10.        NULL;  
  11.    else  // 否则报告  
  12.        exam_assert( __FILE__, __LINE__ )   
  13. #else  // 若不使用断言测试  
  14. #define EXAM_ASSERT(condition)  NULL  
  15. #endif  /* end of ASSERT */  

7-6:用断言来检查程序正常运行时不应发生但在调测时有可能发生的非法情况

7-7:不能用断言来检查最终产品肯定会出现且必须处理的错误情况

说明:断言是用来处理不应该发生的错误情况的,对于可能会发生的且必须处理的情况要写防错程序,而不是断言。如某模块收到其它模块或链路上的消息后,要对消息的合理性进行检查,此过程为正常的错误检查,不能用断言来实现。

7-8:对较复杂的断言加上明确的注释

说明:为复杂的断言加注释,可澄清断言含义并减少不必要的误用。

7-9:用断言确认函数的参数

示例:假设某函数参数中有一个指针,那么使用指针前可对它检查,如下。

[plain]  view plain  copy
  1. int exam_fun(unsigned char *str )  
  2. {  
  3.    EXAM_ASSERT( str != NULL );  // 用断言检查“假设指针不为空”这个条件  
  4.    ... //other program code  
  5. }  

7-10:用断言保证没有定义的特性或功能不被使用

示例:假设某通信模块在设计时,准备提供“无连接”和“连接”这两种业务。但当前的版本中仅实现了“无连接”业务,且在此版本的正式发行版中,用户(上层模块)不应产生“连接”业务的请求,那么在测试时可用断言检查用户是否使用“连接”业务。如下。

[plain]  view plain  copy
  1. #define EXAM_CONNECTIONLESS 0 // 无连接业务  
  2. #define EXAM_CONNECTION     1 // 连接业务  
  3. int msg_process(EXAM_MESSAGE *msg )  
  4. {  
  5.    unsigned char service; /* message service class */  
  6.    EXAM_ASSERT( msg != NULL );  
  7.    service = get_msg_service_class( msg );  
  8.    EXAM_ASSERT( service != EXAM_CONNECTION ); // 假设不使用连接业务  
  9.    ...  //other program code  
  10. }  

7-11:用断言对程序开发环境(OS/Compiler/Hardware)的假设进行检查

说明:程序运行时所需的软硬件环境及配置要求,不能用断言来检查,而必须由一段专门代码处理。用断言仅可对程序开发环境中的假设及所配置的某版本软硬件是否具有某种功能的假设进行检查。如某网卡是否在系统运行环境中配置了,应由程序中正式代码来检查;而此网卡是否具有某设想的功能,则可由断言来检查。

对编译器提供的功能及特性假设可用断言检查,原因是软件最终产品(即运行代码或机器码)与编译器已没有任何直接关系,即软件运行过程中(注意不是编译过程中)不会也不应该对编译器的功能提出任何需求。

示例:用断言检查编译器的int型数据占用的内存空间是否为2,如下。

[plain]  view plain  copy
  1. EXAM_ASSERT( sizeof(int ) == 2 );  

7-12:正式软件产品中应把断言及其它调测代码去掉(即把有关的调测开关关掉)

说明:加快软件运行速度。

7-13:在软件系统中设置与取消有关测试手段,不能对软件实现的功能等产生影响

说明:即有测试代码的软件和关掉测试代码的软件,在功能行为上应一致。

7-14:用调测开关来切换软件的DEBUG版和正式版,而不要同时存在正式版本和DEBUG版本的不同源文件,以减少维护的难度

7-15:软件的DEBUG版本和发行版本应该统一维护,不允许分家,并且要时刻注意保证两个版本在实现功能上的一致性

其他

7-1:在编写代码之前,应预先设计好程序调试与测试的方法和手段,并设计好各种调测开关及相应测试代码如打印函数等

说明:程序的调试与测试是软件生存周期中很重要的一个阶段,如何对软件进行较全面、高率的测试并尽可能地找出软件中的错误就成为很关键的问题。因此在编写源代码之前,除了要有一套比较完善的测试计划外,还应设计出一系列代码测试手段,为单元测试、集成测试及系统联调提供方便。

7-2:调测开关应分为不同级别和类型

说明:调测开关的设置及分类应从以下几方面考虑:针对模块或系统某部分代码的调测;针对模块或系统某功能的调测;出于某种其它目的,如对性能、容量等的测试。这样做便于软件功能的调测,并且便于模块的单元测试、系统联调等。

7-3:编写防错程序,然后在处理错误之后可用断言宣布发生错误

示例:假如某模块收到通信链路上的消息,则应对消息的合法性进行检查,若消息类别不是通信协议中规定的,则应进行出错处理,之后可用断言报告,如下例。

[plain]  view plain  copy
  1. #ifdef _EXAM_ASSERT_TEST_ // 若使用断言测试  
  2. /* Notice: thisfunction does not call 'abort' to exit program */  
  3. void assert_report(char * file_name, unsigned int line_no )  
  4. {  
  5.    printf( "\n[EXAM]Error Report: %s, line %u\n",  
  6.            file_name, line_no );  
  7. }  
  8. #define ASSERT_REPORT( condition )  
  9.     if( condition ) // 若条件成立,则无动作  
  10.        NULL;  
  11.    else // 否则报告  
  12.        assert_report ( __FILE__, __LINE__ )  
  13. #else // 若不使用断言测试  
  14. #define ASSERT_REPORT( condition )  NULL  
  15. #endif /* end ofASSERT */  
  16. int msg_handle(unsigned char msg_name, unsigned char * msg )  
  17. {  
  18.    switch( msg_name )  
  19.     {  
  20.        case MSG_ONE:  
  21.            ... // 消息MSG_ONE处理  
  22.            return MSG_HANDLE_SUCCESS;  
  23.            ... // 其它合法消息处理  
  24.        default:  
  25.            ... // 消息出错处理  
  26.            ASSERT_REPORT( FALSE );  // “合法”消息不成立,报告  
  27.            return MSG_HANDLE_ERROR;  
  28.     }  
  29. }  
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_35061586/article/details/79077428

智能推荐

Unity核心9——3D动画_unity动画-程序员宅基地

文章浏览阅读6.3k次,点赞7次,收藏30次。Has Exit Time:是否有退出时间,如果勾选,当切换动画时,动画一定是播放到下方的 Exit Time(百分比)的时间时才过渡到下一个动画。​ 我们是否可以这样做,比如开枪动画只影响上半身,下半身根据实际情况播放站立,跑动,蹲下动作,通过上下半身播放不同的动画就可以达到动画的组合播放。不同的是有一个上层的图标(Up Base Layer),通过连接该状态来转移到上层状态机的某个状态。主要用于直接从另一个层复制状态过来,在该层中进行修改,另一个层的设置信息都将保留,我们只需要替换状态对应的动画即可。_unity动画

vue-cli(vue脚手架)安装 详细教程_vue脚手架安装步骤-程序员宅基地

文章浏览阅读2.4w次,点赞30次,收藏204次。vue-cli这个构建工具大大降低了webpack的使用难度,支持热更新,有webpack-dev-server的支持,相当于启动了一个请求服务器,给你搭建了一个测试环境,只关注开发就OK。一.安装vue-cli1、 使用npm(需要安装node环境)全局安装webpack,打开命令行工具输入:npm install webpack -g或者(npm install -g webpack),安装完成之后输入 webpack -v,如下图,如果出现相应的版本号,则说明安装成功。注意:webpack 4._vue脚手架安装步骤

postgresql批量插入数据脚本_每日踩坑 2020-11-04 PostgreSQL 批量插入数据-程序员宅基地

文章浏览阅读1k次。一看居然两三个月没写博文了。凑。最近去考了个试,老天保佑吧。今天有个同事跑来问我,我之前写的数据同步工具支不支持 PostgreSQL。然后跟我讲了他的需求。感觉我随手写的小东西开始变成整个部门的标准方案了。。。这让我有点惶恐。君要臣死,臣不得不死啊。那么换驱动,兼容不同的sqlsever,mysql 这些都是老生常谈了。无非就是再加上 PostgreSQL 的驱动而已。但是所有事情要是那么简单就..._incorrect binary data format

解决“av_packet_rescale_ts() ” 找不到标识符 的问题_qt 找不到av_packet_rescale_ts-程序员宅基地

文章浏览阅读1.2k次。参考博客:https://blog.csdn.net/DaveBobo/article/details/79648900编写YUV编码MP4程序,结果出现如下错误:av_packet_rescale_ts() 这个函数,在2.8版本中有,后来升级为什么了?3.2.4版本中,就找不到了,不知道中间经历过什么迭代,就消失了。解决方案:but, 生成的mp4文件,播放的时候花..._qt 找不到av_packet_rescale_ts

MTK平台充电模块梳理_mtk平台vcdt-程序员宅基地

文章浏览阅读1w次,点赞9次,收藏90次。一、原理图智能手机充电模块硬件原理图主要可以分为三个部分:电池连接器、充电IC以及电源管理芯片PMIC部分等。BAT_ID:不同电芯的电池区分管脚,一般就是外接的电阻不同,通过该管脚来区分加载不同的电池profile。 BAT_ON:电池是否在位检测管脚,也是电池NTC管脚。 CS_P:Fuel Gauge电流检测的正极管脚,10毫欧电阻的一端。 CS_N: Fuel Gauge..._mtk平台vcdt

随便推点

假如程序员进军 UI 界?-程序员宅基地

文章浏览阅读155次。点击????方“逆锋起笔”,公众号回复视频教程领取大佬们推荐的学习资料著名的社交新闻站Reddit,在#ProgrammerHumor#的标签下(程序员的幽默)举办了一个“最糟糕音量键设计大赛”,提交的作品简直是震!惊!UI!界!并且其中大部分设计,已经被code了出来,来感受一下吧。➀通过摇骰子得到音量数字才能得到合适的音量▽调音量变成了开奖一样还有这种操作!?➁通过平衡调..._程序员转行ui

MISC:压缩包隐写的破解方法._ctf misc 反复zip包压缩100次-程序员宅基地

文章浏览阅读2.6k次,点赞4次,收藏25次。Misc即杂项,是信息隐藏又称信息伪装,就是通过减少载体的某种冗余,如空间冗余、数据冗余等,来隐藏敏感信息,达到某种特殊的目的。信息隐藏打破了传统密码学的思维范畴,从一个全新的视角审视信息安全。与传统的加密相比,信息隐藏的隐蔽性更强,在信息隐藏中,可以把这两项技术结合起来,先将秘密信息进行加密预处理,然后再进行信息隐藏,则秘密信息的保密性和不可觉察性的效果更佳。_ctf misc 反复zip包压缩100次

Paper reading (七):Recent Advances of deep learning in bioinformatics and computational biology_recent advances in document summarization-程序员宅基地

文章浏览阅读364次。论文题目:Recent Advances of deep learning in bioinformatics and computational biologyscholar 引用:2页数:10发表时间:2019.03发表刊物:frontiers in genetics作者:Binhua Tang1,2*†, Zixiang Pan1†, Kang Yin1 and Asif..._recent advances in document summarization

SSM毕设项目基于HTML5的酒店管理系统72o23(java+VUE+Mybatis+Maven+Mysql)_基于html5混合app开发的酒店管理系统-程序员宅基地

文章浏览阅读372次。Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。SSM毕设项目基于HTML5的酒店管理系统72o23(java+VUE+Mybatis+Maven+Mysql)SSM + mybatis + Maven + Vue 等等组成,B/S模式 + Maven管理等等。2. 使用IDEA/Eclipse/MyEclipse导入项目,修改配置,运行项目;_基于html5混合app开发的酒店管理系统

学生体育铅球网页设计作品静态HTML网页模板源码 大学生体育铅球网站制作 简单校园体育网页设计成品-程序员宅基地

文章浏览阅读325次,点赞8次,收藏6次。校园篮球网页设计、足球体育运动、体育游泳运动、兵乓球 、网球、等网站的设计与制作。️ 大学生校园运动静态HTML网页设计作品,采用DIV CSS布局制作,内容包括:校园运动、运动技巧、运动规则、技术规则、经典动作。页面主体内容区域宽度为1200PX。网页整体使用CSS设置了网页背景图片。页面精美包含多个排版布局,学生网页作业水平制作。 一套优质的网页设计应该包含 (具体可根据个人要求而定)网站布局方面:计划采用目前主流的、能兼容各大主流浏览器、显示效果稳定的浮动网页布局结构...

六星经典CSAPP-笔记(12)并发编程(上)-程序员宅基地

文章浏览阅读130次。六星经典CSAPP-笔记(12)并发编程(上)1.并发(Concurrency)我们常常在不知不觉间就说到或使用并发,但从未深入思考并发。我们常常能“遇见”并发,由于并发不仅仅是操作系统内核的“绝招”,它也是应用开发中不可缺少的技巧:訪问慢I/O设备:就像当应用程序等待I/O中的数据时内核会切换运行其它进程一样,我们的应用也能够用相似的方式,将I/O请求与其它工作..._freeswitch bad argument #1 to select (descriptor too large for set size)