董 昕 王 杰
1(成都工業學院計算機工程學院 四川 成都 611730)
2(中國電子科技集團第29研究所系統工程部 四川 成都 610036)
一種自動生成軟件測試用例的新方法
董 昕1王 杰2*
1(成都工業學院計算機工程學院 四川 成都 611730)
2(中國電子科技集團第29研究所系統工程部 四川 成都 610036)
泛歐集群通信系統是一種為無線用戶提供語音和數據服務的公共安全的大型集群通信系統。作為其核心組成部分,區域控制器在廣泛區域內提供無線通信和電話互連互通的呼叫處理服務,其自身也是一個大型軟件系統。提出區域控制器軟件基于Python方法的軟件自動化測試用例生成一種創造性方法。該方法不僅能自動創建測試用例,而且支持將創建的測試用例批量上傳到存儲器及支持批量運行。測試實踐證明,該方法可以大大減少軟件測試人員的人工干預,而且較大程度地提高測試效率。設計實現了最大化腳本重用和最小化測試腳本維護修改成本, 值得在大型軟件系統的大批量自動化測試環境中推廣和部署。
大型軟件系統 軟件自動化測試 測試用例 Python方法 重用
隨著社會進步、科技發展及軟件應用范圍的增廣,軟件規模愈來愈大。軟件不僅僅是在規模上快速地發展擴大,而且其復雜性也急劇地增加,規模達到千萬行的大型軟件系統層出不窮[1]。規模及復雜性的與日俱增使其錯誤產生幾率大大增加,其中潛在的缺陷與故障所造成損失不斷發生。大型軟件系統中的關鍵構件的質量問題可能造成嚴重損失或災難,因此質量問題已為開發軟件和應用軟件的關注焦點。軟件缺陷具有“難以看到”和“難以抓到”的特征,很有必要引入軟件測試來提高軟件質量。而且軟件測試并非一次就能完成,通常需要多次執行,其工作量和時間耗費巨大。對可靠性要求更高的大型軟件系統,其測試工作已占到整個軟件項目工作量的 50%~60%[2]。傳統的手工測試雖然仍為基本方式,但自動化測試得到了越來越廣泛的運用。作為軟件測試重要策略與技術手段,自動化測試可實現人工測試無法實現或難以實現的測試及更高的測試質量與效率。目前越來越多的軟件測試必須引入自動化測試技術才能保障順利完成。在許多情況下特別是在規模較大及復雜性較高的大型軟件系統自動化測試能發揮較大作用。作為自動化測試中的重要組成部分之一的自動化測試用例是指自動化測試執行中引用的具體測試用例。如何高效地實現大型軟件系統的自動化測試一直是困擾軟件測試行業的一個課題,其中的核心問題在于如何快速并準確地創建自動化測試腳本。本文以數字集群通信系統為例,介紹一種新的方法能有效地解決這一問題并提高測試用例復用性。
在介紹自動化測試平臺之前,先簡要介紹下被測體大型軟件系統——數字集群通信系統,它廣泛應用于公共安全、交通運輸、能源和物流等領域。TETRA系統作為一種為無線用戶提供語音和數據服務的數字集群通信系統,在各行各業的指揮調度中發揮了重要作用, 其系統概述圖如圖1所示。

圖1 TETRA系統概述圖
圖中左上方的區域控制器ZC(zone controller)作為TETRA系統中的核心組成部分,提供組呼、單呼和電話互連互通的呼叫處理服務[3]。區域控制器的測試對確保整個數字集群通信系統正常運行起著不可或缺的作用,其主要組件達40多個,文件數量13 000多個,實現代碼高達95多萬行。
區域控制器的自動化測試平臺GLS(Generic Link Simulator)是通用鏈路模擬器的縮寫。 它是一個專門為了仿真基于消息協議的通信設備而設計開發的測試平臺,如圖2所示。

圖2 GLS自動化測試平臺概述圖
從圖2可以看出,GLS自動化測試平臺由鏈接過程、消息定義文件、測試用例腳本等組成。鏈接過程仿真其他連接到區域控制器(ZC)的系統組件的較低協議層,維護已建立的鏈接,并作為GLS測試用例與區域控制器間的接口。其中MCAST_SC_NETCOM 是ZC與基站之間的鏈接,IZ_NETCOM 是兩個ZC之間的鏈接。鏈接過程支持手動啟動或終止,也支持全自動或半自動啟動或終止。鏈接過程參數和特性由配置文件管理,比如IP地址、端口號、緩存和變量等。每個配置文件都可看作一個鏈接過程的可能的實例。消息定義文件包含了消息定義及消息在鏈接中發送和接收的初始值。每個鏈接過程都有一個與之相對應的消息定義文件。
作為自動化測試中的重要組成部分之一的自動化測試用例,主要分為兩類:結構化腳本和共享腳本。腳本類似于結構化程序含有控制腳本執行的指令。優點是健壯性好,可通過循環和調用減少工作量。缺點是腳本較復雜且測試用例“捆綁”腳本中。共享腳本指腳本可被多測試用例使用,一個腳本可被其他腳本所調用。使用共享腳本可節省腳本生成時間和減少重復工作量,當重復任務變化時只需少量修改。優點在于較少開銷實現類似測試,維護開銷低于線性腳本,能刪除重復并可增加智能。缺點是需跟蹤更多腳本,給配置管理帶來困難,對每個測試仍需定制,測試腳本維護費用高。
GLS測試腳本綜合了結構化腳本和共享腳本的優勢,既支持控制腳本執行的指令,健壯性好,可通過循環和調用減少工作量,又支持腳本間的相互調用,可節省腳本生成時間和減少重復工作量,當重復任務變化時只需少量修改。ZC的每個測試用例對應著一個用戶場景,每個GLS測試腳本對應著相應的消息序列。測試腳本可以調用其他的腳本文件,并支持并行調用,而且GLS腳本可以用來配置及測試被測體,還可以組成測試集。測試集一般由測試相同或相近功能的測試腳本組合而成。
大型軟件系統有大量的較復雜的功能點需要測試,單純采用傳統的手動測試已變的不合時宜。必須引入自動化測試,并且需要大量的測試用例來檢驗被測體的有效性,例如區域控制器測試項目就有4 000余個測試用例。測試用例的有效創建、重用和維護是自動化測試中最關鍵的環節之一。本文給出了一種基于Python的自動創建測試用例的新方法并在集群通信系統中得到了驗證。
區域控制器主要處理和生成與呼叫(如單呼、電話互聯互通和組呼等)的相關信令。由于要在區域控制器引入新的呼叫架構[4](即端到端的呼叫架構),該重構會引入大量接口改變,比如區域控制器與基站BTS(base transceiver station)的接口。接口改變會引起大量自動化測試用例的變動。所以選擇高效的創建測試用例的方法顯得至關重要。區域控制器-基站間的接口因為端到端的呼叫架構(P2P架構)而有較大的改動。新架構將使用新的P2P消息的原語。在區域控制器-基站間的接口,單呼和電話互聯互通消息被合并成一個單一的新的消息,并定義為P2P消息。作為一般規則,一個“P2P”消息將代替對應的兩個單呼(U2U)和電話互聯互通(INTerconnect)消息[5],如表1所示。

表1 區域控制器-基站間的接口改動
由于P2P功能將合并U2U和INT呼叫類型到一個共同的P2P類型,現有的U2U和INT消息將由新的P2P的消息取代[6],這對現有的單呼和電話呼叫的測試用例有相當大的影響?,F有測試用例的功能及場景將保持不變,變化主要是改動現有測試用例的接口,基于已有的測試場景創建新的測試用例。消息的變化將被劃分為三類:刪除現有域/消息、添加新的域/新消息和更改現有的域/消息。在項目調研階段,作者發現大概有1 400多個自動化測試用例需要做接口的改動,如果純手工改動工作量大,項目進度要求緊迫,現有項目不可行。所以決定開發Python方法來完成自動化測試用例創建[7]。刪除舊的域/消息、替換舊的域/消息和增加新的域或消息都可以通過自動Python方法,如表2所示。

表2 消息變動類型
現有U2U消息和INT的消息轉換為P2P的消息,將相應創建新的測試用例。為了減少手工改動繁重的工作量,本文開發一個基于Python語言的方法實現自動化創建測試用例。其主要目的是最大限度實現無需人工參與,完成測試用例自動創建。Python語言是一種面向對象直譯式計算機程序設計語言,也是一種功能強大的通用型語言,近幾年已成為最受歡迎的動態編程語言之一。Python語言清晰、簡潔、易讀以及可擴展性,使得使用者從語法細節中擺脫出來,專注于解決問題的方法、分析程序本身的邏輯和算法[8]。經過20多年的發展,Python語言已成為一門重要的程序設計語言,在軟件開發領域有著廣泛的應用。基于上述這些特點,本文選擇Python語言來自動創建和更新測試用例,實現測試用例的重用。
這項工作覆蓋了78個消息的變化,新的P2P消息取代U2U消息和INT的信息。每一個新消息的變化可分為三種類型:修改現有消息/域、添加新的消息/域、刪除現有的消息/域。以手持呼叫設備主動發起和建立呼叫過程的消息U2U_CALL_RQST_TYPE為例,在新P2P構架中將變為P2P_CALL_RQST_SVC_TYPE。如下所示:
Send P2P_CALL_RQST_SVC_TYPE
{
# NETCOM_HEADER_SECTION 不變的域
to_device_type : 8 =$DEV_TYPE_CONTROLLER
to_device_num : 8 = 0x00
from_device_type : 8 =$DEV_TYPE_SITE
from_device_num : 8 = 0x00
pkt_type : 8 = ALSLIP_TYPE_SITE_TO_CTRLR
version_num : 8 =$VERSION_NUMBER
# NETCOM_HEADER_SECTION 域名保持不變,而值變化
pkt_sub_type: 8 =$ALSLIP_SUBTYPE_P2P
pkt_svc_type :8 =$ALSLIP_SVC_P2P_CALL_REQ
# OFFSET_SECTION 域名保持不變,而值變化
id_section_offset : 8 = 0x0C
svc_info_section_offset : 8 = 0x18
msg_info_section_offset : 8 = 0x1E
next_offset : 8 = 0x00
# ID_SECTION 域名將改變
source_id : 24 = 0x00 → calling_id : 24 = 0x00
target_id : 24 = 0x00 → called_id_issi : 24 = 0x00
# 新增的域
called_id_issi : 24 = 0x00
called_id_wacn_id : 24 = 0x00
called_id_system_id : 16 = 0x00
calling_id : 24 = 0x00
…}
其中有部分域的域名保持不變,而值變化; 有部分域的域名將改變; 還有部分域是新加的域。由此可見每個消息都包含幾種不同的變化,說明采用人工地更新大量測試用例是不可行的,一是客觀上工作量巨大,二是手動操作效率較低,三是可能引入一些不易察覺的錯誤。因此采用Python方法勢在必行。
該軟件框架如圖3所示。此框架可分為兩部分:核心和變量部分。其核心部分包括解析器和公用部分; 變量部分包括消息部分和配置元素。其中具體分為以下四個部分:通用部分,包括一些通用的常量和函數;解析器,該自動創建框架的核心部分,其主要職責是創建測試用例,比如找到需要創建的域和消息,修改域值等[9];配置部分,存儲一些配置文件,例如新接口定義文件;消息部分,包含所有78個消息變化,是非常重要的組成部分,描述消息改變的具體信息。

圖3 Python方法軟件構架
為了實現消息自動更新的需求,Python方法將在測試用例首先搜索現有的消息及其域。匹配消息內容后,將執行文本匹配及替換等操作,并寫回測試用例[10]。該方法的輸入為一個現有的測試用例文件或測試用例所在的文件夾。輸出為創建后的測試用例文件和記錄變化的filechanged.txt文件。具體解釋的流程如圖4所示。

圖4 Python方法工作流程
該方法不僅支持對單個測試用例進行更新,也支持對多個測試用例進行批量操作。圖5是經過自動化Python方法創建前后的測試用例例子。左側為創建前的測試用例,右側為創建后的測試用例。圖中深色區域是更新前后發生變化的部分。

圖5 Python方法創建前后的測試用例
在實際項目應用中,創建測試用例后還需要考慮后繼的軟件配置管理工作,其主要目的在于通過在軟件生命周期的不同時間點上對軟件配置進行標識,并對這些標識的軟件配置項的更改進行系統性控制,達到保證軟件產品完整性和可溯性。軟件配置管理作為軟件工程的關鍵元素,提供了結構化、有序化、產品化的管理軟件工程的方法,并應用于整個軟件工程的過程。 軟件配置管理工具已出現商業化及開源產品,如IBM Rational ClearCase、開源產品CVS、入門級的Microsoft-VSS等。這些產品能夠幫助開發人員和測試人員有效地進行軟件配置的管理。其中IBM Rational ClearCase是業界廣泛應用的軟件配置管理工具。 其功能包括版本控制、工作空間管理、建立管理和過程控制。其特點是能推進并行開發,提供強有力的版本控制,透明的工作區管理,有效的構件管理,有彈性的流程管理[11]。
因此該方法還提供了基于版本管理工具Rational ClearCase的自動批量上傳測試用例到存儲服務器的功能,能高效完成測試用例版本控制工作,如圖6所示。這大大節約了測試人員手動上傳的時間,而且避免了無意義的重復勞動和人工操作可能出現的錯誤。

圖6 Python方法自動上傳測試用例
通過項目實踐,自動化Python方法能夠處理80%~90%的域的變化。由以前的100%手動創建降為只有10%~20%需要手工創建,極大地提高了測試用例的創建效率。圖7為創建測試用例耗時與測試用例數量的關系圖,橫坐標為測試用例數量,單位為個,縱坐標為創建測試用例所需時間,單位為人月。從圖中可以看出,當測試用例的數量小于臨界點(本文測試用例數量的臨界點為500)時,由于開發Python方法需要一定的時間,采用手工方法創建測試用例耗時更少;當測試用例的數量恰恰等于臨界點時,采用手工方法創建測試用例與采用Python方法耗時相當;當測試用例數量大于臨界點時,采用Python方法可以大大提高工作效率,而且測試用例的數量越大節約的時間越多。

圖7 耗時與測試用例數量關系圖
并且由于引入了自動化Python方法,由之前手動創建測試用例預計需要17.8個人月,最終縮短到7.5個人月就順利完成,減少了10.3個人月的工作量,極大提高了現有測試用例的創建效率,縮短了測試時間,加快了產品開發周期,使軟件產品更快面向市場。該方式不僅本身具有較高的復用性,只需少量的改動就可在不同的測試過程中使用,可推廣到性能測試中的內存測試[12]運用,還大大提高了測試用例的可重用性。使用該方法能更好地利用了項目的人力資源,將瑣碎的任務賦予自動化方式,可以提高測試工作的準確性和測試人員的積極性,將測試人員解脫出來,更多精力投入到創造性工作中,比如設計探索性的測試用例、分析缺陷的原因和進行軟件質量的持續改進等。
綜上所述,在軟件測試項目實踐中特別是大型軟件系統項目中建議采用Python方法來創建和更新大批量的測試用例。該新方法可以大大減少測試人員的人工干預程度,而且較大程度地提高測試效率,增強測試用例的重用性,值得在大型軟件系統或擁有大量自動化測試用例的測試環境中推廣和部署,能起到事半功倍的作用。在今后的工作中,將繼續運用和提升該方法,比如不僅支持命令行界面,還要支持更友好、更人性化的圖形界面;與現有的GLS自動化測試平臺融合,該方法嵌入到測試平臺中;與Jenkins等持續集成平臺協作[13],提供持續的軟件版本發布和測試功能等。
[1] 張友生.軟件體系結構[M]. 2版.北京:清華大學出版社,2015.
[2] 賀平.軟件測試教程[M]. 3版.北京:電子工業出版社,2014.
[3] European Telecommunications Standards Institute. TETRA Voice plus Data Air Interface Part 2 [R].2013.
[4] European Telecommunications Standards Institute. Call Hold [R]. 2003.
[5] European Telecommunications Standards Institute. General requirements for supplementary services [R].2012.
[6] TETRA and Critical Communications Association. TETRA Interoperability Profile (TIP), Part 1: Core [R].2012.
[7] Derezinska A, Halas K. Experimental Evaluation of Mutation Testing Approaches to Python Programs[C]//IEEE International Conference on Software Testing, Verification, and Validation Workshops. IEEE Computer Society, 2014:156-164.
[8] 劉衛國.Python語言程序設計[M].北京:電子工業出版社,2016.
[9] Jiang C, Liu B, Yin Y, et al. Study on Real-Time Test Script in Automated Test Equipment[C]//2009 8th international conference on reliability,maintainability and safety. 2009:738-742.
[10] Marinescu R, Saadatmand M, Bucaioni A, et al. A Model-Based Testing Framework for Automotive Embedded Systems[C]//Software Engineering and Advanced Applications. IEEE, 2014:38-47.
[11] 趙池龍,程努華.實用軟件工程[M]. 4版.北京:電子工業出版社,2015.
[12] 董昕.一種新的數字集群通信系統網關內存測試方法[J].現代電子技術,2015,38(7):34-38.
[13] 蘭洋,溫迎福.持續集成實踐 [M].北京:電子工業出版社,2016.
ANEWMETHODFORAUTOMATICALLYGENERATINGSOFTWARETESTCASE
Dong Xin1Wang Jie2*
1(CollegeofComputerEngineering,ChengduTechnologicalUniversity,Chengdu611730,Sichuan,China)2(DepartmentofSystemEngineering,The29thResearchInstituteofChinaElectronicsTechnologyGroupCorporation,Chengdu610036,Sichuan,China)
TETRA communication system is a public security large-scale cluster communication system that provides voice and data services for wireless users. As a core component, the zone controller provides call processing services for wide area radio communications and telephone interconnect calls in a wide area, which is itself a large software system. This paper presents a creative method to the generation of software automated test cases based on the Python of the zone controller software. This method can not only automatically create test cases, but also support the batch of test cases uploaded to memory and support batch operation. Test practice has proved that the new method can greatly reduce the human intervention of software testers and improve the testing efficiency to a great extent. The design achieves maximum scripting reuse and minimizes maintenance and modification costs of test scripts. It is worth popularizing and deploying in large automated testing environments for large software systems.
Large software system Software automated testing Test case Python method Reuse
TP311.56
A
10.3969/j.issn.1000-386x.2017.10.008
2016-12-12。董昕,副教授,主研領域:大型軟件系統設計與體系結構及自動化測試。王杰,高工。