随想录(做自己代码的测试工程师)

来源:互联网 发布:哪个软件可以听歌识曲 编辑:程序博客网 时间:2024/06/07 03:07


【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】  


    很多工程师都有一个不好的习惯,因为大多数it工程师都喜欢写代码,但是不喜欢测试代码。在他们眼里,把功能做出来是一件很牛逼的事情,而软件测试则是一件低级、价值量不高的事情。事实上是否真的如此呢,恐怕未必。姑且不谈你写的这份代码是否真的会给用户或者消费者带来价值,但是一份极其不稳定甚至时常崩溃的软件,肯定不会带来什么好感,这也就意味着公司投资你作了这个劳动很可能是个无用功。这个问题其实不光小公司有,大公司也是如此。


(1)很多朋友没有代码质量意识。一份软件的价值,一方面体现在是否可以满足客户的需求,另一方面也体现在它是否可以稳定长久地运行。代码运行的时间越长、越稳定和健壮,这样才能最大程度保留代码的价值。


(2)测试工程师远没有开发工程师了解代码的健康程度。很多公司的测试工程师只是按照黑盒的方法对软件进行测试,这些测试的内容包括了功能、易用性、边界测试、兼容性、性能等等,但是这些测试都没有开发者自己写的单元测试重要。大多数单元测试可以在第一时间发现问题、解决问题,而不是等到测试的时候来进行解决。如果开发者觉得代码哪写的好像有问题,那么十有八九有问题。只是个时间问题而已。


(3)好代码是不停修改和重构得来的。之前看了很多的代码,这包括vxworks、gcc、linux、mysql等等,它们中的很多代码从上个世纪八九十年代就已经存在了,到今天还在修改。有的是重新调整流程,有的是为了适配新的cpu,还有的是为了兼容新的设备特性。所以说,一份健康的代码需要反复的测试、反复的重构、反复的运行,没有什么是一层不变的。在服务器上运行的很多系统代码,不知道经过了多少次推倒重来的修改,经过了多少次作者的代码检查,估计只有真正经历的人才知道。


(4)现有的工具可以极大地帮助我们进行代码的各种测试,我有一篇文章谈到了这些工具。比如说,CUnit可以帮助我们进行单元测试;splint可以进行代码的静态检查;valgrind可以进行代码的泄漏测试;gcov可以进行覆盖率的测试;gprof可以进行代码性能的统计测试;gdb的watch功能可以直接帮助我们检查数据是否越界;core dump可以帮助我们保存程序的相关内存信息,为我们逆向调试提供了方便。当然,上面说的都是linux上面的工具,大家可以根据自己的环境,看看有没有什么合适的工具帮到自己提高一下代码的质量。


(5)有些错误是随机的,但是有一定的概率性。这就要求我们对相关数据的输入、输出进行记录和处理。实现这个功能不难,用fprintf和fscanf就可以做到,下面是我自己写的一份简单代码,算是抛砖引玉之用,

#include <stdio.h>#define NAME "log.txt"int main(int argc, char* argv[]) {FILE* file;char buf[32];int data;unsigned int udata;char str;unsigned int hex;// generate log txt filefile = fopen(NAME, "rt"); if(NULL == file){file = fopen(NAME, "w");fprintf(file, "%d\n", 10);fprintf(file, "%u\n", -1);fprintf(file, "%s %c 0x%x\n", "china", 'c', 0x12345678);fclose(file);return 1;}// read file fseek(file, 0, SEEK_SET);fscanf(file, "%d\n", &data);fscanf(file, "%u\n", &udata);fscanf(file, "%s %c 0x%x\n", buf, &str, &hex);fclose(file);// output content to the screenprintf("%d\n", data);printf("%u\n", udata);printf("%s %c 0x%x\n", buf, str, hex);return 1;}

(6)对于代码中的日志、打印、告警要进行分开处理。有的时候,代码运行很长时间才会发生错误,那么除了core dump和代码入库记录之外,你能看的就是打印日志了,所以写一份自己的print函数也是很有必要的。因为换成自己的print函数后,这些log你可以显示出来,也可以保存到文件里面,同时也可以是一个空函数,真是太方便了。

#include <stdarg.h>void printk(char* fmt){va_list args;char buffer[256];va_start(args, fmt);vsnprintf(buffer, 256, fmt, args);va_end(args);printf("%s", buffer);}

    上面的观点是我最近一段时间的感受,欢迎大家来交流。



2 0
原创粉丝点击