張 琪
(上海市軟件評測中心有限公司(軟件測試部),上?!?00233)
大數據處理是指不能通過傳統計算技術處理的海量數據集合的數據創建、存儲、檢索和分析等操作,具有大批量、多樣性、復雜性、實時性、交互性等特性。在大數據背景下,隨著互聯網、政府、企業、個人用戶需求量的增加,基于大數據技術的應用系統越來越多,對軟件測試工作提出了很大的挑戰。只有轉變傳統的測試思維,合理利用多種技術和框架、各種自動化工具的融合,并不斷開拓創新測試方法和技術,優化改進測試策略和流程,才能夠獲得更好的發展。
Google于 2004年提出的大數據處理框架Map-Reduce已得到了廣泛的應用,用戶在設計分布式應用程序時只需要實現 map()和 reduce()兩個函數,不需關注數據分片、任務調度、機器間通信、機器容錯等方面是如何實現的,雖然簡化了數據密集型應用的數據處理過程,但是用戶功能不如框架本身功能豐富,也給測試工作帶來了難度。并且該框架采用分布式特性,無法知道任務被動態分配到集群中的哪個節點執行;無法預知map或reduce任務在哪個節點執行;無法在錯誤發生前設置斷點等,而傳統軟件測試是基于軟件規格說明書等文檔進行測試,有預先確定的流程圖、數據關系、數據的輸入/輸出,大數據處理框架的分布式特性給傳統軟件測試帶來了難度[1]。
傳統數據一般采用結構化數據,存儲在關系型數據庫表中或結構化文件中,軟件測試時可以用來驗證軟件輸入和輸出的正確性。大數據處理的數據包含結構化、半結構化、非結構化三種。半結構化數據沒有預定義格式,需要根據數據模式推導出其基本機構。非結構數據沒有任何格式,存儲在文件或Web頁面中,需要抽取、轉化成結構化數據,由于數據的異?;驍祿袷睫D換錯誤導致的問題,使軟件測試對數據輸入和輸出正確性的驗證變得非常困難。
大數據是對所有數據集進行分析處理,而不是隨機樣本,找到其中最有價值的數據。這就對測試設計時的評價模型提出了更高的要求,能否構造與原始數據集等價的數據集?是否所有數據覆蓋了所有可能性?都是需要考慮的問題[2]。
傳統的B/S或C/S性能測試一般通過客戶端測試負載器模擬向服務器發送請求來實現對服務器的壓力測試。在大數據背景下,數據處理平臺一般架構在可動態擴展的PaaS平臺,傳統的局域網環境下開展壓力測試模式,已無法滿足需求,難以實現負載器數量的擴展,也無法采取有效的控制措施[3]。在大數據時代背景下,云計算系統分布范圍較廣,測試客戶端需要設置分布式特征,在大量用戶數據的驅動下,控制設備的監控壓力也在不斷增加,受到負載器數據及狀態的影響,很大程度上會對軟件性能測試造成影響。并且由于大數據應用所涉及的技術、環境的復雜性,對于問題的診斷調優也存在難度。
Map-Reduce對來自不同數據源的數據進行處理過程中可能會出現編碼問題,如在單一節點上運行正確,在多個節點上運行不正確的問題,包括不正確的聚合、節點配置、輸出格式等??刹捎靡韵路绞竭M行驗證:a.驗證梳理數據處理過程是否完成并輸出文件;b.在單個節點上驗證大數據的業務邏輯后,在多節點上進行相同驗證;c.驗證Map-Reduce處理過程的Key/Value對是否正確生產;d.在reduce過程結束后驗證數據的聚集合并是否正確;e.通過源文件驗證輸出數據來保證數據處理正確完成;f.驗證輸出數據文件格式是否符合大數據業務要求[4]。
測試是為了保證數據的正確性、業務邏輯的正確性。首先,需要進行需求的調研,必須要清楚整個業務處理流程,每個數據的流轉,每個步驟的輸入和輸出,才能判斷最后的輸出結果是否正確。然后,結合不同業務場景設計測試用例,不僅限于數據的邊界要求、屬性要求等,更多需要考慮數據的樣本及大小,樣本集的分布特征。需要考慮:數據量;數據唯一性;數據完整性;數據一致性;數據邊界;數據精度和格式化;數據區間和分布;數據空值替換及格式化特征等,可結合自動化測試工具或手工編寫測試腳本等方式,導入測試數據,提高測試數據覆蓋率和測試效率[5]。
目前業界暫無通用、標準的大數據性能測試工具,要自行開發或整合多種相關測試工具才可能實現性能測試及問題診斷。首先搭建測試環境,需要考慮:是否有足夠的存儲設備來存儲和處理大數據;有足夠的CPU、內存資源保障高性能處理;有集群處理分布式節點和數據等[6]。接著準備測試數據、設計測試場景、編寫測試腳本,需要考慮:各業務的占比;各節點測試數據量的準備;并發線程/用戶量的需求;超時時間/參數/消息隊列長度設置;選用測試工具或測試腳本開發等。最后執行性能測試,可通過 Hadoop性能監控器來監測平均響應時間、吞吐量、資源占用率等運行狀態性能指標和瓶頸問題[7]。
在大數據背景下,云計算、虛擬化技術得到了較好的應用。結合相關資料,大數據背景下軟件測試展望主要如下:
(1)完善與改進測試技術,在大數據背景下,測試技術只有朝著多元化方向發展,才能夠實現突破。將已知測試技術、測試方法相互結合,并進行綜合利用。針對數據儲存模糊認知,導致影響測試精準性的情況,其解決措施為:在應用數據庫前,必須要反復測試數據庫,降低數據錯誤率帶來的影響,全面提升數據的準確性、一致性、完整性,為后期的測試奠定基礎。除了功能測試,還要兼顧性能效率、容錯性、可用性、擴展性、穩定性、兼容性、數據一致性等方面的測試[9]。
(2)加入智能化技術,提升數據處理質量,在實際應用時,其設計工作不僅需要對輸入的數據進行界定,分析數據的屬性,還需要依據數據的樣本、數據采集情況、數據分布規模等選擇正確的評價方式。在數據輸入時,需要確保數據屬性的規范性,綜合分析、考慮數據輸入的大小、輸出樣式,在大數據背景下,應用智能化技術能夠消除輸入、輸出數據之間的差異性,逐步規范操作,全面提升軟件測試質量[10]。
(3)基于大數據背景下,在各類數據處理中云計算、虛擬化的應用十分有必要,為了更好的滿足大數據時代的性能測試需求,就必須要構建客戶端與服務器端需求相匹配的自動化運行環境,發揮負載器的作用,研究并發環境,強化監控,逐步探索全新的測試手段。
綜上所述,當前的時代屬于大數據時代,軟件測試面臨著很多的挑戰,為了更好應對大數據環境下對軟件測試帶來的問題,提出了一些解決措施,并對未來的軟件測試發展提出展望,需要從以下幾方面改善:(1)測試技術需朝著多元化方向發展,多元化的測試技術能夠有效避免“殺蟲劑效應”,在已知測試技術基礎上,探索出全新的測試技術。(2)大數據的智能化處理,需更多去考慮輸入數據樣本的大小、特性、輸出評判方法等。(3)構建自動化云測試環境,更好的滿足大戶數據背景下性能測試需求,強化客戶端的處理能力,提升與服務端需求之間的匹配度,進而探索、創新更多的測試方法。(4)采用大數據的思維方式,通過全面的測試來提高大數據應用軟件的質量、容錯性、可擴展性、穩定性、安全性。