随想录(做自己代码的测试工程师)
来源:互联网 发布:哪个软件可以听歌识曲 编辑:程序博客网 时间: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);}
上面的观点是我最近一段时间的感受,欢迎大家来交流。
- 随想录(做自己代码的测试工程师)
- 随想录(构建自己的代码库)
- 随想录(webbench压力测试代码)
- 随想录(学习wrk的代码)
- 随想录(管理自己)
- 随想录(写给自己的C++编程规范)
- 随想录(内核模块的测试方法)
- 随想录(提高代码质量的几个工具)
- 随想录(提高代码质量的几个工具)
- 随想录(一个android原生app的代码赏析)
- 随想录(简单的windows驱动代码)
- 随想录(改进的豆瓣爬行代码)
- 随想录(怎么阅读代码)
- 随想录(在实践中学习kernel代码)
- 随想录(在实践中学习kernel代码)
- 随想录(在实践中学习kernel代码)
- 随想录(在实践中学习kernel代码)
- 随想录(编写简单资源管理代码)
- 编写程序
- PostgreSql 常用命令
- codeforces——1A - Theatre Square
- Windows 常用消息及含义
- Java程序员的JavaScript学习笔记(9—— jQuery工具方法)
- 随想录(做自己代码的测试工程师)
- 网友超级实用待产包清单明细分享推荐
- TestFlight Beta Testing - 介绍
- jsp标签
- 大数据与数据挖掘的相对绝对关系
- Legacy与UEFI
- 程序员面试好书
- Memory作业分析(基于CodeSculptor,python 2.7)
- C# 解析 json