随想录(做自己代码的測试project师)


【 声明:版权全部。欢迎转载,请勿用于商业用途。

 联系信箱:feixiaoxing @163.com】  


    非常多project师都有一个不好的习惯,由于大多数itproject师都喜欢写代码。可是不喜欢測试代码。在他们眼里,把功能做出来是一件非常牛逼的事情,而软件測试则是一件低级、价值量不高的事情。

其实是否真的如此呢。恐怕未必。姑且不谈你写的这份代码是否真的会给用户或者消费者带来价值,可是一份极其不稳定甚至时常崩溃的软件,肯定不会带来什么好感。这也就意味着公司投资你作了这个劳动非常可能是个无用功。

这个问题其实不光小公司有。大公司也是如此。


(1)非常多朋友没有代码质量意识。一份软件的价值,一方面体如今能否够满足客户的需求。还有一方面也体如今它能否够稳定长久地执行。

代码执行的时间越长、越稳定和健壮,这样才干最大程度保留代码的价值。


(2)測试project师远没有开发project师了解代码的健康程度。非常多公司的測试project师仅仅是依照黑盒的方法对软件进行測试,这些測试的内容包含了功能、易用性、边界測试、兼容性、性能等等,可是这些測试都没有开发人员自己写的单元測试重要。大多数单元測试能够在第一时间发现问题、解决这个问题,而不是等到測试的时候来进行解决。

假设开发人员认为代码哪写的好像有问题。那么十有八九有问题。仅仅是个时间问题而已。


(3)好代码是不停改动和重构得来的。之前看了非常多的代码,这包含vxworks、gcc、linux、mysql等等,它们中的非常多代码从上个世纪八九十年代就已经存在了,到今天还在改动。有的是又一次调整流程。有的是为了适配新的cpu。还有的是为了兼容新的设备特性。

所以说。一份健康的代码须要重复的測试、重复的重构、重复的执行。没有什么是一层不变的。在server上执行的非常多系统代码。不知道经过了多少次推倒重来的改动,经过了多少次作者的代码检查,预计仅仅有真正经历的人才知道。


(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
", 10);
		fprintf(file, "%u
", -1);
		fprintf(file, "%s %c 0x%x
", "china", 'c', 0x12345678);
		fclose(file);

		return 1;
	}

	// read file 

	fseek(file, 0, SEEK_SET);
	fscanf(file, "%d
", &data);
	fscanf(file, "%u
", &udata);
	fscanf(file, "%s %c 0x%x
", buf, &str, &hex);
	fclose(file);

	// output content to the screen

	printf("%d
", data);
	printf("%u
", udata);
	printf("%s %c 0x%x
", 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);
}

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



原文地址:https://www.cnblogs.com/gavanwanggw/p/6762892.html