zoukankan      html  css  js  c++  java
  • 随想录(做自己代码的測试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);
    }
    

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



  • 相关阅读:
    二维莫队的一个细节
    错失AK良机的测试48T3 Walk
    枚举二进制子集
    又是一次值得纪念的考试
    测试46
    值得纪念的测试43
    点分治模板理解
    牛客多校第三场 G Removing Stones(分治+线段树)
    牛客多校第三场 F Planting Trees
    HDU6621 K-th Closest Distance HDU2019多校训练第四场 1008(主席树+二分)
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6762892.html
Copyright © 2011-2022 走看看