电竞比分网-中国电竞赛事及体育赛事平台

分享

隨想錄(做自己代碼的測(cè)試工程師)

 心不留意外塵 2016-04-15

from http://blog.csdn.net/feixiaoxing/article/details/40480189

  聯(lián)系信箱:feixiaoxing @163.com 


    很多工程師都有一個(gè)不好的習(xí)慣,因?yàn)榇蠖鄶?shù)it工程師都喜歡寫(xiě)代碼,但是不喜歡測(cè)試代碼。在他們眼里,把功能做出來(lái)是一件很牛逼的事情,而軟件測(cè)試則是一件低級(jí)、價(jià)值量不高的事情。事實(shí)上是否真的如此呢,恐怕未必。姑且不談你寫(xiě)的這份代碼是否真的會(huì)給用戶或者消費(fèi)者帶來(lái)價(jià)值,但是一份極其不穩(wěn)定甚至?xí)r常崩潰的軟件,肯定不會(huì)帶來(lái)什么好感,這也就意味著公司投資你作了這個(gè)勞動(dòng)很可能是個(gè)無(wú)用功。這個(gè)問(wèn)題其實(shí)不光小公司有,大公司也是如此。


(1)很多朋友沒(méi)有代碼質(zhì)量意識(shí)。一份軟件的價(jià)值,一方面體現(xiàn)在是否可以滿足客戶的需求,另一方面也體現(xiàn)在它是否可以穩(wěn)定長(zhǎng)久地運(yùn)行。代碼運(yùn)行的時(shí)間越長(zhǎng)、越穩(wěn)定和健壯,這樣才能最大程度保留代碼的價(jià)值。


(2)測(cè)試工程師遠(yuǎn)沒(méi)有開(kāi)發(fā)工程師了解代碼的健康程度。很多公司的測(cè)試工程師只是按照黑盒的方法對(duì)軟件進(jìn)行測(cè)試,這些測(cè)試的內(nèi)容包括了功能、易用性、邊界測(cè)試、兼容性、性能等等,但是這些測(cè)試都沒(méi)有開(kāi)發(fā)者自己寫(xiě)的單元測(cè)試重要。大多數(shù)單元測(cè)試可以在第一時(shí)間發(fā)現(xiàn)問(wèn)題、解決問(wèn)題,而不是等到測(cè)試的時(shí)候來(lái)進(jìn)行解決。如果開(kāi)發(fā)者覺(jué)得代碼哪寫(xiě)的好像有問(wèn)題,那么十有八九有問(wèn)題。只是個(gè)時(shí)間問(wèn)題而已。


(3)好代碼是不停修改和重構(gòu)得來(lái)的。之前看了很多的代碼,這包括vxworks、gcc、linux、mysql等等,它們中的很多代碼從上個(gè)世紀(jì)八九十年代就已經(jīng)存在了,到今天還在修改。有的是重新調(diào)整流程,有的是為了適配新的cpu,還有的是為了兼容新的設(shè)備特性。所以說(shuō),一份健康的代碼需要反復(fù)的測(cè)試、反復(fù)的重構(gòu)、反復(fù)的運(yùn)行,沒(méi)有什么是一層不變的。在服務(wù)器上運(yùn)行的很多系統(tǒng)代碼,不知道經(jīng)過(guò)了多少次推倒重來(lái)的修改,經(jīng)過(guò)了多少次作者的代碼檢查,估計(jì)只有真正經(jīng)歷的人才知道。


(4)現(xiàn)有的工具可以極大地幫助我們進(jìn)行代碼的各種測(cè)試,我有一篇文章談到了這些工具。比如說(shuō),CUnit可以幫助我們進(jìn)行單元測(cè)試;splint可以進(jìn)行代碼的靜態(tài)檢查;valgrind可以進(jìn)行代碼的泄漏測(cè)試;gcov可以進(jìn)行覆蓋率的測(cè)試;gprof可以進(jìn)行代碼性能的統(tǒng)計(jì)測(cè)試;gdb的watch功能可以直接幫助我們檢查數(shù)據(jù)是否越界;core dump可以幫助我們保存程序的相關(guān)內(nèi)存信息,為我們逆向調(diào)試提供了方便。當(dāng)然,上面說(shuō)的都是linux上面的工具,大家可以根據(jù)自己的環(huán)境,看看有沒(méi)有什么合適的工具幫到自己提高一下代碼的質(zhì)量。


(5)有些錯(cuò)誤是隨機(jī)的,但是有一定的概率性。這就要求我們對(duì)相關(guān)數(shù)據(jù)的輸入、輸出進(jìn)行記錄和處理。實(shí)現(xiàn)這個(gè)功能不難,用fprintf和fscanf就可以做到,下面是我自己寫(xiě)的一份簡(jiǎn)單代碼,算是拋磚引玉之用,

  1. #include <stdio.h>  
  2.   
  3. #define NAME "log.txt"  
  4.   
  5. int main(int argc, char* argv[]) {  
  6.   
  7.     FILE* file;  
  8.     char buf[32];  
  9.     int data;  
  10.     unsigned int udata;  
  11.     char str;  
  12.     unsigned int hex;  
  13.   
  14.     // generate log txt file  
  15.   
  16.     file = fopen(NAME, "rt");   
  17.     if(NULL == file){  
  18.   
  19.         file = fopen(NAME, "w");  
  20.         fprintf(file, "%d\n", 10);  
  21.         fprintf(file, "%u\n", -1);  
  22.         fprintf(file, "%s %c 0x%x\n", "china", 'c', 0x12345678);  
  23.         fclose(file);  
  24.   
  25.         return 1;  
  26.     }  
  27.   
  28.     // read file   
  29.   
  30.     fseek(file, 0, SEEK_SET);  
  31.     fscanf(file, "%d\n", &data);  
  32.     fscanf(file, "%u\n", &udata);  
  33.     fscanf(file, "%s %c 0x%x\n", buf, &str, &hex);  
  34.     fclose(file);  
  35.   
  36.     // output content to the screen  
  37.   
  38.     printf("%d\n", data);  
  39.     printf("%u\n", udata);  
  40.     printf("%s %c 0x%x\n", buf, str, hex);  
  41.   
  42.     return 1;  
  43. }  

(6)對(duì)于代碼中的日志、打印、告警要進(jìn)行分開(kāi)處理。有的時(shí)候,代碼運(yùn)行很長(zhǎng)時(shí)間才會(huì)發(fā)生錯(cuò)誤,那么除了core dump和代碼入庫(kù)記錄之外,你能看的就是打印日志了,所以寫(xiě)一份自己的print函數(shù)也是很有必要的。因?yàn)閾Q成自己的print函數(shù)后,這些log你可以顯示出來(lái),也可以保存到文件里面,同時(shí)也可以是一個(gè)空函數(shù),真是太方便了。

  1. #include <stdarg.h>  
  2.   
  3. void printk(char* fmt)  
  4. {  
  5.     va_list args;  
  6.     char buffer[256];  
  7.   
  8.     va_start(args, fmt);  
  9.     vsnprintf(buffer, 256, fmt, args);  
  10.     va_end(args);  
  11.   
  12.     printf("%s", buffer);  
  13. }  

    上面的觀點(diǎn)是我最近一段時(shí)間的感受,歡迎大家來(lái)交流。



    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多