楊國勝?楊毅?王海?欒衡
摘要:在常規(guī)的MATIP服務測試過程中,通常采用定制的MATIP服務端與客戶端程序作為通信載體,交互能力與適應能力弱,阻礙了自動化測試的開展。DSL指的是專注于某特定領域,為解決特定任務而設計的語言,常用來解決特定的領域問題。通過抽象MATIP會話模型,提出一種描述MATIP會話的DSL,支持業(yè)務人員快速構建個性化的測試場景,降低MATIP測試的復雜度?;贛ATIP會話DSL,實現了MATIP測試服務插件,通過與CI/CD工具的對接,將MATIP服務的測試集成到DevOps流程中,推進了MATIP服務的自動化測試,做到了質量保證和效率提升。
關鍵詞:MATIP;領域特定語言;自動化測試
一、前言
中國民用航空局《智慧民航建設路線圖》明確提出加強民航基礎設施保障,實現智慧出行、智慧空管、智慧機場、智慧監(jiān)管;深化民航大數據場景應用,形成良好數據開放生態(tài),實現跨業(yè)務領域數據資源的融合創(chuàng)新和挖掘分析[1]。作為民航信息系統(tǒng)的運營主體,各航司與民航信息服務提供商不斷深入傳統(tǒng)業(yè)務變革,促進了以業(yè)務目標和客戶需求為中心的企業(yè)轉型。在敏捷和精益[2]的影響下,企業(yè)軟件研發(fā)過程提倡快速交付和持續(xù)優(yōu)化,而測試工作貫穿整個研發(fā)過程,因此測試效率顯得至關重要,直接影響整體的交付速度。在敏捷和 DevOps[3]模式下,頻繁的交付加重了業(yè)界對測試的擔憂,為應對這樣的挑戰(zhàn),持續(xù)測試的概念被提出,并逐漸成為業(yè)界的共識。
MATIP[4]作為航空運輸業(yè)專用傳輸協(xié)議,具有專業(yè)性強、受眾范圍小的特點,若在測試過程中過多關注MATIP會話與連接層面的問題,勢必使得測試人員偏離業(yè)務主線、降低測試效率。同時,由于缺乏通用工具的支持,設計過程缺乏普適性,不利于與DevOps工具的結合及持續(xù)測試的執(zhí)行。
二、相關技術介紹
在常規(guī)的MATIP服務測試過程中,通常采用定制的MATIP服務端與客戶端程序作為通信載體,輔以數據庫對交互報文進行存儲,其會話策略在啟動前通過參數的形式進行設置,之后保持不變,導致交互能力與適應能力弱,阻礙了自動化測試的開展。
HTTP具有簡單、靈活、擴展性強的優(yōu)點,基于HTTP的服務可以使用成熟穩(wěn)定的工具(如瀏覽器等)方便地進行測試,對自動化測試支持程度高,使測試人員聚焦于業(yè)務需求的測試。DSL指的是專注于某特定領域,為解決特定任務而設計的語言,常用來解決特定的領域問題[5]。通過對MATIP會話模型的抽象,設計并實現用以描述MATIP處理的DSL,繼而使用DSL對MATIP的會話建立與維護、心跳保持、報文收發(fā)、鏈路異常等場景進行聲明式語義描述,有利于減少業(yè)務場景構建過程中的重復工作,豐富業(yè)務場景,提高測試效率,降低構建成本。同時,DSL可以提高代碼的易讀性,有利于組織內部統(tǒng)一語言的形成,便于內部交流,支持業(yè)務專家進行新型業(yè)務場景的快速構建?;贖TTP封裝MATIP服務測試接口,利用DSL描述MATIP服務交互場景,是一種推動MATIP服務自動化測試的有效途徑。
三、MATIP會話模型DSL
(一)MATIP會話中的數據類型
MATIP會話的生命周期包括連接建立、創(chuàng)建會話、數據交互、會話維持、會話關閉等階段。因為MATIP協(xié)議建立在TCP/IP協(xié)議棧之上,一個MATIP會話開始于MATIP客戶端和MATIP服務端的連接建立,此過程中的數據交互包括客戶端對服務端的選擇和服務端對客戶端連接的驗證。創(chuàng)建會話階段,對于MATIP客戶端,輸出數據為打開會話SO控制報文,報文格式如圖1所示。H1、H2用來標識會話,Flow ID用于多路復用時的數據流區(qū)分。輸入數據為確認打開OC控制報文,用來表述接受或拒絕一個會話。與之相對,對于MATIP服務端,客戶端發(fā)送的SO控制報文作為輸入數據,MATIP服務端根據SO報文中的會話標識H1、H2及其他控制信息確定是否接受該會話打開請求,并生成用于表述拒絕或接受該會話的確認打開OC控制報文作為輸出數據。在會話創(chuàng)建之后,客戶端和服務端開始進行雙向數據交互,根據MATIP數據格式按需發(fā)送或接收數據,具體數據MATIP數據格式參照RFC2351[4]。在MATIP會話的實現中,在長時間沒有數據交互的情況下,為節(jié)省資源通常會終止空閑的MATIP會話。為了避免工作MATIP會話在空閑時被誤終止,需要通過MATIP心跳報文進行會話維護。MATIP會話的關閉可由服務端和客戶端的任何一方發(fā)起,輸出數據為MATIP關閉會話SC控制報文,接收端在收到該控制報文后進行本地資源清理。
(二)MATIP會話模型DSL定義
在MATIP會話模型DSL的定義過程中,采用類SQL形式的語法定義。定義如下關鍵字:matip、scenario、create、alter、destroy、exec、display、which、and、or、not等。matip代表MATIP會話對象,scenario代表場景對象,create、alter、destroy、exec、display分別代表創(chuàng)建、修改、銷毀、執(zhí)行和查詢相關的對象,which、and、or、not用于相關屬性的設置或篩選,常用的語句如下:
create matip m1 mode=client and svrIp=10.1.1.1 and? svrPort=350 and h1h2=EE10;//創(chuàng)建MATIP會話對象m1,其作為客戶端連接目標服務器10.1.1.1的350端口,H1、H2為十六進制數值的字符串表示,用于標識與同一節(jié)點間多個不同的會話,十六進制取值范圍0000——FFFF,共支持65536個不同的會話;創(chuàng)建MATIP會話時,本例中H1H2分別為EE和10,其余屬性為缺省值
alter matip m1 timeout=30000 and interval=20;//修改MATIP會話對象m1在同步場景中應答超時時間為30000毫秒,連續(xù)請求間隔20毫秒
display matip which mode=client;//展示所有作為客戶端的MATIP會話對象
destroy matip which h1h2=EE10;//銷毀h1h2為EE10的MATIP會話對象,等同語句destroy matip m1
create scenario s1 which matip=m1 and action=tpcall and dataType=database and data=d1.t1 and counts=10 and interval=20;//創(chuàng)建名為s1的交互場景,使用名為m1的MATIP會話對象發(fā)起10次同步調用,兩次之間的間隔為20毫秒,數據來源為數據庫表d1.t1
exec scenario s1;//執(zhí)行場景s1
display scenario s1;//展示場景s1的執(zhí)行狀態(tài)
四、基于MATIP會話DSL測試MATIP服務的方法與實現
借助于MATIP會話DSL對業(yè)務場景的描述,測試人員可以方便地構建業(yè)務測試場景。為實現DSL描述場景的正確執(zhí)行,并與DevOps工具進行有機結合,提出一種基于MATIP會話DSL測試MATIP服務的方法。在架構上采用分層架構模式,接口層對外提供Restful風格接口,方便與DevOps工具集成。中間層提供報文處理和DSL解析功能,同時利用緩存為運行中的各場景提供數據支持。底層MATIP處理組件封裝MATIP操作,維護MATIP連接資源池并實現MATIP數據的收發(fā)。任務管理組件負責各后臺場景任務的執(zhí)行。具體實現如圖2所示,由接口層、報文處理組件、DSL解釋器、MATIP處理組件、緩存和任務管理組件等模塊組成。
(一)接口層
接口層負責與外部環(huán)境進行交互,承擔著數據的輸入輸出、身份認證和訪問控制等職責。接口層對外提供Restful API,便于與Devops工具進行集成。在功能上,接口層提供MATIP會話和業(yè)務場景的創(chuàng)建、更新、查詢、執(zhí)行與銷毀等服務接口。
(二)報文處理組件
報文處理組件負責對輸入的請求報文進行解析和有效性校驗。在確保請求數據的正確性和完整性的前提下,將解析出的DSL串輸入DSL解釋器,并根據DSL處理結果完成應答報文,用于接口層返回。
(三)DSL解釋器
DSL解釋器根據輸入字符串依次進行詞法、語法和語義分析,將請求中描述MATIP場景的DSL語句映射為具體的操作集合。以下列用于創(chuàng)建MATIP會話對象的資源定義DSL語句為例,“create matip m1 mode=client and svrIp=10.1.1.1 and? svrPort=350 and h1h2=EE10;”DSL解釋器在獲得執(zhí)行操作和對象的類型、名稱及屬性后,調用MATIP處理組件中DSL協(xié)同模塊提供的接口,創(chuàng)建一個名為m1的MATIP會話對象作為客戶端嘗試建立與測試樁服務10.1.1.1:350的連接,并以EE10作為H1、H2嘗試打開會話并維持會話。若成功創(chuàng)建會話對象,DSL解釋器會將新創(chuàng)建的會話對象添加進MATIP處理組件的Matip客戶端連接池中,待后續(xù)使用,并在緩存中增加該對象的靜態(tài)鏡像。DSL解釋器將上述操作執(zhí)行的結果(創(chuàng)建會話對象成功與否的信息)作為輸出。在對資源執(zhí)行DSL語句的處理上,DSL解釋器首先會查詢緩存中是否存在該資源對象,若不存在直接返回錯誤提示信息,若存在,則從對應的MATIP連接池中取出目標對象,執(zhí)行相應的處理。以下列資源執(zhí)行DSL語句為例,“exec scenario s1;”DSL解釋器從緩存中查找業(yè)務場景s1的信息,根據s1的屬性信息獲取在該場景中使用哪個MATIP會話進行哪些操作,生成一個后臺任務,由任務管理組件進行調度處理。DSL解釋器針對輸入的處理按階段劃分如圖3所示。
1.階段1
接收并解析輸入語句,檢查DSL語句是否正確,并生成對應的抽象語法樹AST。
2.階段2
對AST進行語義分析,將DSL語句中的對象轉化為實際的MATIP會話對象和場景對象。在轉換過程中針對操作類型的不同,結合緩存模塊中存儲的對象信息,完成對操作對象的檢查。例如create和exec操作均需要檢查待創(chuàng)建的同名對象是否已經存在,在create操作中,若同名對象已經存在,返回錯誤信息;而exec操作相反,在操作對象不存在時返回錯誤信息。
3.階段3
在生成執(zhí)行計劃階段,DSL解釋器按資源對象類型和操作類型進行區(qū)分,若為matip會話對象的非查詢類display操作,利用MATIP處理組件提供的接口進行計劃編排,若為matip會話對象或場景對象scenario的查詢類display操作,則使用緩存提供的查詢接口進行計劃編排,若為場景對象scenario的exec操作,則創(chuàng)建后臺任務。
4.階段4
執(zhí)行階段負責發(fā)起階段3生成的計劃和后臺任務的執(zhí)行。特別對于后臺任務,DSL解釋器只負責將任務發(fā)送至任務管理組件,由后者負責任務的調度執(zhí)行。
5.階段5
將階段4的執(zhí)行結果作為輸出進行返回,返回結果內容:創(chuàng)建MATIP會話對象m1成功、更新MATIP會話對象m1的interval屬性成功、場景對象scenario對象s1的執(zhí)行任務被添加等。
(四)緩存
存儲當前所有MATIP會話對象和業(yè)務場景對象的靜態(tài)鏡像,包含對象的執(zhí)行狀態(tài)、處理的業(yè)務量、成功和失敗次數等,用于生成應答結果。在scenario對象的執(zhí)行過程中,承載業(yè)務處理的MATIP會話對象定期向緩存更新任務的執(zhí)行狀態(tài),為DSL解釋器的執(zhí)行提供基礎數據。
(五)MATIP處理組件
MATIP處理組件封裝MATIP連接建立、斷開、連接維持、打開會話、接受會話、拒絕會話、心跳處理和數據發(fā)送等功能,由DSL協(xié)同模塊、Matip Listener、Matip客戶端連接池、Matip服務端連接池和Matip工作協(xié)程等多個模塊組成,通過這些模塊功能的組合,實現MATIP服務端和客戶端交互的諸多場景。DSL協(xié)同模塊通過向DSL解釋器提供調用接口,實現DSL語句的執(zhí)行調用。Matip Listener作為Matip服務端啟動偵聽,用于以業(yè)務驅動端為MATIP服務端的測試場景下,接收對方的連接請求。Matip客戶端連接池和Matip服務端連接池分別對不同模式下的MATIP會話對象進行管理,以滿足不同的測試需求。Matip工作協(xié)程為具體執(zhí)行業(yè)務場景的協(xié)程,根據DSL語句的內容完成MATIP數據收發(fā)。
(六)任務管理組件
任務管理組件負責維護各業(yè)務場景中的后臺任務,以“exec scenario s1”為例,DSL語句的返回結果為是否成功添加場景對象s1的執(zhí)行任務,任務管理組件根據該場景對象s1的屬性信息負責其任務的具體執(zhí)行,從對應的MATIP連接池中選取用于執(zhí)行數據收發(fā)的MATIP連接,按照場景中定義的數據收發(fā)頻率,從指定的數據源發(fā)送請求并接收應答。同時,任務管理組件負責任務的管理與維護,執(zhí)行任務的撤銷、中斷、更新和重啟等。
五、應用
MATIP會話DSL的提出與使用降低了測試MATIP服務的復雜性,業(yè)務人員使用MATIP會話DSL可以方便、迅速地構建個性化的測試場景,提升了測試效率。結合基于MATIP會話DSL測試MATIP服務在企業(yè)內部的實現,中國航信Devops平臺完成了CI/CD工具與MATIP測試服務插件的對接,將MATIP服務的測試集成到DevOps流程中,以確保軟件質量并提高開發(fā)效率。目前,該平臺上構建的MATIP關聯(lián)測試用例達600多個,支持了中國航信業(yè)務系統(tǒng)與外航、GDS之間的MATIP業(yè)務測試。
六、結語
本文介紹了DSL在MATIP服務測試中的應用,通過定義與實現MATIP會話DSL,為業(yè)務人員構建個性化MATIP測試場景提供了便利?;谠揇SL實現的MATIP服務測試插件完成了與Devops工具的集成,推動了MATIP服務自動化測試的開展。領域特定語言DSL針對特定領域進行設計,具有簡化維護、提升效率、提高團隊協(xié)作和降低技術門檻等優(yōu)勢。在測試領域,尤其針對專業(yè)性強、受眾范圍小的業(yè)務場景,通過實現相應的DSL,提供高層次的抽象,不僅有助于降低測試復雜度,更有利于促進團隊溝通與協(xié)作,實現業(yè)務知識積累。
參考文獻
[1]中國民用航空局.智慧民航建設路線圖.[EB/OL].[2022-01-06].https://www.gov.cn/xinwen/2022-01/21/5669771/files/f7402a57bcf349b0ae8d1224a0f35737.pdf.
[2]何勉.精益產品開發(fā)——原則、方法與實施[M].北京:清華大學出版社,2017.
[3]朱少民,李潔.敏捷測試--以持續(xù)測試促進持續(xù)交付[M].北京:人民郵電出版社,2021.
[4]A.Robert.Mapping of Airline Reservation, Ticketing,and Messaging Traffic over IP (RFC-2351),1998.
[5]Martin Fowler.領域特定語言[M].北京:人民郵電出版社,2021.
作者單位:中國民航信息網絡股份有限公司
責任編輯:張津平、尚丹