随想录(做自己代码的测试工程师)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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 file
file = 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 screen
printf("%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);
}
上面的观点是我最近一段时间的感受,欢迎大家来交流。
相关文章
- 太赞了!华为鸿蒙工程师总结的Linux笔记,提供下载
- 如何成为 AI 领域的资深工程师?
- 测试工程师, 入职以后如何开展工作?
- 字节测试开发工程师面经(二面已凉)
- 5年高级测试工程师,还不会用Pytest+Allure实现自动化用例失败截图
- 10年+工作经验总结:测试工程师职业成长路线图
- 想问一下系统数据库工程师自学能过吗?
- 年薪40w+,在国企做软件测试工程师是一种什么样的体验:每天过的像打仗一样
- 大学时代的牺牲品,测试工程师转型测试开发历程...
- 测试工程师加薪的那些事,加薪的博弈其实从很早就开始了,凡事预则立,不预则废
- 这些都不会,那20k离你有点远【测试工程师】
- 性能测试工程师能力进阶3部曲,你确定不来看看吗?
- 【软件测试】你真的会测试吗?一位真正的测试工程师是如何做的......
- 【软件测试】一名合格成功的测试工程师及职业发展提升......
- 【软件测试】测试员vs测试工程师,你是测试员还是测试工程师?
- 测试开发工程师程序员为什么会忧虑自己的未来?最黄金年龄规划 IDP
- it 测试/开发工程师在等代码出结果的时候都会干什么?砖家说,久坐不动容易造成血栓
- 互联网高级测试工程师至少具备的能力
- 测试工程师如何提高自动化测试覆盖率
- 作为测试工程师的发展之路-如何做好测试开开发?
- √年底了,如何准备初、高级测试工程师技术面试?
- APP测试工程师岗位面试题
- 成为一个优秀的测试工程师需要具备哪些知识和经验?
- 专访谷歌高级工程师 | 不作恶的高昂代价,我如何让谷歌损失巨额广告费
- 工程师唱主角 2012 SDCC中国软件开发者大会启动
- 全栈开发工程师微信小程序-中(下)
- 从算法工程师到全栈开发者,我终于明白了数据科学的真谛
- 性能测试工程师需要掌握的技能
- 程序员和工程师的差异
- 测试工程师能力胜任考核
- 去应聘软件工程师记得这样介绍自己