从测试角度写代码(一)调试分级
一.为什么要使用调试分级
调试分级并不是一定要做的,需要根据具体情况进行分析,比如我们在使用开发小型代码时,是完全不需要使用调试分级的,反而会给我们带来了代码编写的复杂性。调试分级一般用于大型项目开发中,可以快速定位代码问题,提高编程效率,以下场景都是可以使用调试分级进行优化的选项。
- 当我们进行大型项目开发时基本都是按阶段性开发进行的,当我们调试完一阶段代码之后,如果需要继续调试开发下一段代码时,需要将上一段代码的打印信息全部屏蔽。
- 上一个场景尽管有同学说我们可以开发下一阶段任务前,利用编译器的查找替换将上阶段的代码的printf全部替换//printf进行快速注释,但是如果我们需要输出的代码既有需要显示的业务代码,又有需要开发时的调试方法。直接使用替换功能将调试信息注释掉同时也会将显示信息注释。
- 在项目发布上线的头天,进行最后的代码测试时,如果调试打印出现了错误信息,但是这个信息并不紧急,为了不影响发布日期,我们完全如期上线项目,在后期使用补丁或者更新的方法进行代码修饰。但如果没有代码分级的情况下,在大型项目中测试打印出非常多信息的情况下,如何快速得到错误严不严重呢。
二.调试分级层次
-
以上问题都可以通过手动修改printf进行改变,但是这种方法在使用时,即繁琐又低效,而且一步步修改也容易出错,自己写一个小的demo代码还好,具体代码实施时,还是使用分级调试的思想比较快捷。
-
我认为调试分级参照日志的做法,大致的分为以下四个级别:
- ERROR级别:这种级别优先级最高,表示运行功能的过程中表示代码已经发生了错误,比如文件读写出错,内存访问出错,需要进行修正。这种问题需要立即解决。
- WARNING级别:这种级别优先级其次,表示代码能够正常运行,但是可能存在潜在问题,这种问题在也需要进行解决,但是如果项目紧急,完全可以先根据警告信息进行一个判断。当错误信息不会影响到整个项目的功能运行,我们先将产品发布,后期通过更新和补丁进行修复。比如现在很多手机厂商在发布会上需要发布新的操作系统,尽管系统中还存在一些小的DEBUG,但是就目前而言,这些小bug基本不会影响到用户体验,这时我们为了保证如期发布,可以使用先上线,后修复的策略。
- DEBUG级别:这种级别属于程序调试级别,在程序开发时,提供一个调试级别给程序员们做一个信息调试,获取出程序员员所需要的调试信息。在项目发布后,需要屏蔽掉这一级别显示信息。
- INFO级别:这种级别属于正常输出级别,系统通过正常的打印出业务信息与用户进行交互,我们需要展显出来的菜单信息就是这一层。
-
实现调试分级的方法
-
利用不同的宏定义不同的调试等级,下面代码定义出了两种级别,一个正常的信息交互info_log,一个用于调试debug_log。我们调试代码可以使用debug_log代替printf,正常的交互信息可以用info_log代替printf。具体实现代码如下:
#define DEBUG_PRINT 1 #if(1 == DEBUG_PRINT) #define debug_log printf #else #define debug_log #endif #define INFO_PRINT 1 #if(1 == INFO_PRINT) #define info_log printf #else #define info_log #endif #include <stdio.h> #include <stdlib.h> int main(void) { char *info_messages = NULL; info_log("you scanf messages is %s\n", info_messages); while(1) { info_messages = (char*)malloc(sizeof(int)*10000); if(NULL == info_messages) { debug_log("no enough memory\n"); break; } } return 0; }
-
程序输出
-
将info_log的宏置为1,debug_log的宏置为0,只显示正常交互信息
-
将info_log的宏置为0,debug_log的宏置为1,只显示调试信息
-
-