王 奚,王新月,李 航,張秀明
(1.北京和利時(shí)智能技術(shù)有限公司,陜西 西安 710075;to 2.寧波和利時(shí)信息安全研究院有限公司,陜西 西安 710075;3.中國移動(dòng)通信集團(tuán)黑龍江有限公司,黑龍江 哈爾濱 150028)
可編程邏輯控制器(programmable logic controller,PLC)作為通用自動(dòng)控制裝置,具有較強(qiáng)的工作環(huán)境適應(yīng)性,深受工業(yè)控制界的歡迎。PLC在現(xiàn)代工業(yè)的各個(gè)領(lǐng)域都有應(yīng)用,已成為自動(dòng)化控制的核心[1]。國際上各大PLC制造企業(yè)都傾全力研發(fā)滿足工業(yè)生產(chǎn)需要的PLC,并形成系列化產(chǎn)品,從而在不同領(lǐng)域和地區(qū)構(gòu)建各自的市場[2]。
隨著工業(yè)4.0概念的推出,各領(lǐng)域都在飛速發(fā)展,各類應(yīng)用場景越來越復(fù)雜。工業(yè)控制領(lǐng)域中PLC所需要適應(yīng)的場景、具備的功能越來越多,對PLC產(chǎn)品的測試工作發(fā)起挑戰(zhàn)。PLC產(chǎn)品的新功能和新應(yīng)用場景的測試工作會占用更多的時(shí)間。而在保證既有功能的產(chǎn)品質(zhì)量的前提下提高這部分測試工作的效率,是困擾業(yè)界的難題。
近年來,自動(dòng)化測試領(lǐng)域蓬勃發(fā)展。相對于手工測試,自動(dòng)化測試具有以下優(yōu)點(diǎn)[3-4]:①提高測試效率;②實(shí)現(xiàn)更多高難度繁瑣操作的測試;③解放人力資源;④增強(qiáng)測試穩(wěn)定性。這些優(yōu)勢正是PLC測試所需要的。PLC測試需要完整的自動(dòng)化測試系統(tǒng),實(shí)現(xiàn)從上到下、從軟件到硬件的自動(dòng)化測試平臺。
PLC控制器與編程軟件通常是捆綁在一起的。編程軟件的功能與PLC本身的功能緊密相連[5]。所以通常對PLC產(chǎn)品系統(tǒng)的測試,也包括對PLC編程軟件的測試。除了PLC編程軟件以外,PLC控制器根據(jù)功能的實(shí)現(xiàn)又可劃分為PLC嵌入式軟件和PLC硬件。因此,自動(dòng)化測試平臺的被測對象分為以下3個(gè)部分。
①PLC編程軟件(基于IEC 61131-3標(biāo)準(zhǔn))。對PLC 進(jìn)行編程的軟件,一方面能以程序?qū)崿F(xiàn)過程的自動(dòng)化,另一方面又能對PLC 的工作狀態(tài)進(jìn)行監(jiān)控[5]。該軟件具有編譯、下裝、仿真、多種數(shù)據(jù)類型變量、硬件配置、多種編程語言等功能。
②PLC嵌入式軟件。PLC主要由嵌入式軟件實(shí)現(xiàn)部分功能,如Modbus、自由協(xié)議、文件操作、多任務(wù)等。
③PLC硬件。PLC主要由硬件實(shí)現(xiàn)的有DI、DO、AI、AO等通道。
PLC編程軟件的自動(dòng)化測試由Python語言實(shí)現(xiàn)。Python是面向?qū)ο蟮哪_本語言,具有跨平臺、可擴(kuò)展、解釋性強(qiáng)、易學(xué)易讀等特性[6]。Pywinauto是基于Python、用于自動(dòng)化測試的腳本模塊,主要功能是實(shí)現(xiàn)對Windows標(biāo)準(zhǔn)控件操作的可編程處理,包括對窗口的指定、鼠標(biāo)或鍵盤操作、獲得控件屬性等[7]。對PLC編程軟件測試的實(shí)現(xiàn)就是通過Pywinauto等工具對界面中各個(gè)控件的識別,并模擬鼠標(biāo)和鍵盤對這些控件進(jìn)行操作,從而實(shí)現(xiàn)對編程軟件的自動(dòng)化測試。
目前,B/S體系的軟件自動(dòng)化測試比較成熟。它的表示層為通用的瀏覽器[8]。現(xiàn)有的工具Selenium可以完全模擬用戶在瀏覽器上進(jìn)行各種Web操作[9]。而PLC編程軟件作為C/S體系的軟件,控件標(biāo)準(zhǔn)程度較低,自動(dòng)化測試的轉(zhuǎn)化難度遠(yuǎn)高于B/S軟件,使用到的Pywinauto等工具也不如Selenium成熟、穩(wěn)定。因此,實(shí)現(xiàn)方案需要在現(xiàn)有工具的基礎(chǔ)上封裝一些對控件常用的操作方法,并在測試用例轉(zhuǎn)化時(shí)調(diào)用這些方法,從而大大提高轉(zhuǎn)化效率以及對后續(xù)軟件升級的兼容性。
例如,將右鍵菜單頁面的選擇封裝成1個(gè)函數(shù),如下所示。
def right_menu_select(*args):
"""
右鍵選擇 AT最多存在兩級右鍵菜單,支持兩級
@Time : 2020/3/6
@Author : wangxi
:param args: 右鍵菜單元素名稱或序號(str/int),逗號隔開,兩種類型可組合使用:
"""
m = 0
#標(biāo)志位
if len(args) > 2:
#輸入大于兩個(gè)元素報(bào)錯(cuò)
raise TypeError(' right_menu_select takes 2 positional argument but {} were
given'.format(len(args)))
for input_name in args:
if isinstance(input_name, int):
#輸入為int型
Keyboard.SendKeys('{VK_DOWN %d}' % input_name)
Keyboard.SendKeys('{ENTER}')
elif m == 0:
#輸入為str型且第一級菜單
popwindow.child_window(title=input_name,
control_type="MenuItem").click_input()
elif m == 1:
#輸入為str型且第二級菜單
popmenu.child_window(title=input_name,control_type="MenuItem").click_input()
m = 1
測試用例中,使用到右鍵菜單選擇操作時(shí),調(diào)用這個(gè)函數(shù)并傳入相應(yīng)參數(shù)即可。如后續(xù)編程軟件升級導(dǎo)致右鍵菜單控件的識別或用法發(fā)生變化,則直接修改該函數(shù)即可。這對于不斷升級的軟件的測試非常重要。類似的基礎(chǔ)方法封裝有80個(gè)。這些方法構(gòu)成了測試框架的基礎(chǔ)層。
為了滿足常用業(yè)務(wù)場景,基礎(chǔ)方法的上一層作了業(yè)務(wù)方法的封裝,例如變量、硬件配置、程序組織單元(program organization unit,POU),包括程序、功能塊、函數(shù)等。根據(jù)業(yè)務(wù)的復(fù)雜程度,每種業(yè)務(wù)封裝了幾個(gè)至幾十個(gè)方法不等。這2層方法的封裝不僅可以提高測試用例轉(zhuǎn)化為腳本語言的轉(zhuǎn)化效率,還可大大降低后續(xù)的維護(hù)成本。
業(yè)務(wù)層的上一層是用例層。用例層中用到的一些便利方法如下所示。
①ddt數(shù)據(jù)結(jié)構(gòu)。該結(jié)構(gòu)將測試數(shù)據(jù)和測試代碼分開,提高了代碼轉(zhuǎn)化及執(zhí)行效率,并且便于后期維護(hù)。
②ini配置文件。其存儲全局變量等信息,便于后期維護(hù)。
③異常截圖。在用例執(zhí)行失敗或錯(cuò)誤后截圖保存,可方便定位分析問題。
④測試記錄寫入。該功能可以將每條用例的執(zhí)行結(jié)果自動(dòng)填入記錄測試結(jié)果的excel文檔;測試結(jié)果自動(dòng)填入pass/fail/error;執(zhí)行人自動(dòng)填入robot。這可以替代手動(dòng)整理測試記錄的工作。
測試框架采用了Python的單元測試框架unittest。unittest具有能夠組織、管理和執(zhí)行多個(gè)測試用例,以及提供豐富的斷言方法等優(yōu)點(diǎn)。每條測試用例寫在1個(gè)testcase中,執(zhí)行過程包括測試前準(zhǔn)備環(huán)境的搭建(setUp)、執(zhí)行測試代碼、還原測試后環(huán)境(tearDown),以及根據(jù)斷言輸出pass和fail的測試結(jié)果。測試報(bào)告使用了HTMLTestRunner,將testcase中斷言的結(jié)果打印在報(bào)告中并進(jìn)行數(shù)據(jù)統(tǒng)計(jì)。
嵌入式軟件測試采用對PLC編程軟件的操作與編寫自動(dòng)化測試工程相結(jié)合的方式實(shí)現(xiàn)。對PLC編程軟件的操作采用了與2.1節(jié)中PLC編程軟件自動(dòng)化測試相同的方法實(shí)現(xiàn),使用了Python語言。自動(dòng)化測試工程是使用PLC編程軟件編寫的自動(dòng)化測試工程。每個(gè)工程可以測試嵌入式軟件某項(xiàng)功能。
例如,Modbus主站功能的自動(dòng)化測試工程。工程中組態(tài)邏輯如下。
①使用Modbus寫的功能碼向從站(從站通常選用PLC控制器,需配合組態(tài)相關(guān)從站邏輯)寫隨機(jī)數(shù)。
②用Modbus讀取功能碼讀回寫入地址上的數(shù)據(jù)。
③對比每個(gè)讀取與寫入的數(shù)據(jù):如相同,則繼續(xù);如不同,則記錄相關(guān)錯(cuò)誤信息以及錯(cuò)誤次數(shù)。
④工程中,組態(tài)以邏輯①~邏輯③的方式測試所有PLC支持的Modbus功能碼后,由主站通過通信方式通知從站切換到下一種通信參數(shù)(波特率校驗(yàn)位停止位的組合);同時(shí),主站切換到下一種通信參數(shù)。
⑤切換后,再次進(jìn)行上述的通信測試,在整個(gè)過程中統(tǒng)計(jì)丟包率及記錄診斷異常信息。
自動(dòng)化測試工程是整個(gè)嵌入式軟件自動(dòng)化測試的核心,可以實(shí)現(xiàn)對嵌入式軟件功能的測試。但每個(gè)自動(dòng)化測試工程僅實(shí)現(xiàn)了針對單一功能的自動(dòng)化測試。為了將這些單一功能的測試串聯(lián)起來,就需要對PLC編程軟件進(jìn)行自動(dòng)化操作,為每個(gè)工程編寫配置文件,使Python按照配置文件的內(nèi)容進(jìn)行一系列操作。例如工程打開關(guān)閉、工程下裝監(jiān)視在線讀寫數(shù)據(jù)。這就實(shí)現(xiàn)了各個(gè)子功能測試之間的銜接。
嵌入式軟件自動(dòng)化測試工作流程如圖1所示。
圖1 嵌入式軟件自動(dòng)化測試工作流程
嵌入式軟件自動(dòng)化測試工作流程主要通過解析配置文件并按照配置文件描述的信息執(zhí)行操作步驟,例如下裝在線任務(wù)啟動(dòng)讀寫變量等。每個(gè)配置文件執(zhí)行完成后會產(chǎn)生1個(gè)pass或fail的測試結(jié)果。所有配置文件執(zhí)行完成后生成測試報(bào)告。
PLC硬件自動(dòng)化測試方案采用硬件測試和軟件界面相結(jié)合的方式。
①硬件測試。國家儀器公司(National Instrument,NI)板卡具有精度高、可靠性高、用戶接口功能強(qiáng)大等特點(diǎn)[10]。硬件通道測試采用NI板卡,通過對PLC各輸出通道的采集及輸入通道的輸出控制等實(shí)現(xiàn)對PLC硬件功能的測試。
②軟件界面。LabVIEW是基于圖形編譯語言的虛擬儀器軟件開發(fā)平臺。其表現(xiàn)形式和功能類似于實(shí)際的儀器,特別適用于實(shí)驗(yàn)室等需要經(jīng)常改變儀器和設(shè)備參數(shù)及對信號進(jìn)行分析研究的場合[11]。系統(tǒng)采用LabVIEW實(shí)現(xiàn)與控制器數(shù)據(jù)交互,與NI板卡數(shù)據(jù)的交互、控制,界面圖形的組態(tài),以及數(shù)據(jù)處理等功能。
硬件自動(dòng)化測試環(huán)境如圖2所示。
圖2 硬件自動(dòng)化測試環(huán)境
軟硬件結(jié)合使用實(shí)現(xiàn)了對AI/AO精度、穩(wěn)定度、通道間串?dāng)_以及DI/DO邏輯等功能的測試驗(yàn)證。
PLC硬件自動(dòng)化測試流程如下。
①使用PLC編程軟件編寫實(shí)現(xiàn)相關(guān)功能的標(biāo)準(zhǔn)化測試工程。LabVIEW軟件調(diào)用接口程序下裝組態(tài)工程到PLC,使PLC硬件通道實(shí)現(xiàn)相應(yīng)功能。
②LabVIEW軟件控制NI板卡提供可編程控制器輸入、輸出信號、通信等功能信號,同時(shí)通過動(dòng)態(tài)連接庫與PLC進(jìn)行數(shù)據(jù)交互,獲取測試結(jié)果。
③LabVIEW軟件控制器完成測試過程,生成測試報(bào)告,保存測試數(shù)據(jù)。
完整的測試流程是通過Jenkins調(diào)度完成的,具體按照以下步驟進(jìn)行自動(dòng)觸發(fā)調(diào)度。
①執(zhí)行腳本自動(dòng)安裝最新提測軟件(編程軟件)及升級PLC的固件版本(嵌入式軟件),為后續(xù)測試作好準(zhǔn)備。
②執(zhí)行UI Test實(shí)現(xiàn)對PLC編程軟件測試,生成測試報(bào)告。
③執(zhí)行Firmware Test,實(shí)現(xiàn)對控制器嵌入式軟件的測試,生成測試報(bào)告。
④將以上生成的所有測試報(bào)告通過郵件形式發(fā)送給相關(guān)人員。
根據(jù)測試需要,步驟②和步驟③可以都執(zhí)行,也可以選擇性執(zhí)行其中1個(gè)。
PLC自動(dòng)化測試系統(tǒng)平臺如圖3所示。
圖3 PLC自動(dòng)化測試系統(tǒng)平臺示意圖
PLC自動(dòng)化測試系統(tǒng)平臺目前已在和利時(shí)LE、MC、LK系列產(chǎn)品以及編程軟件AutoThink上測試、使用。根據(jù)測試需要,測試應(yīng)用場景分以下3種。
①每日構(gòu)建:篩選部分自動(dòng)化測試用例,以確保每日構(gòu)建軟件版本的可用性。
②單元測試:篩選部分自動(dòng)化測試用例可覆蓋基本功能,確保提交集成測試前所有基本功能可用。
③集成/系統(tǒng)測試:根據(jù)版本變更范圍,執(zhí)行全部或大部分自動(dòng)化測試用例,確保除新增/修改功能以外的功能正常。
本文設(shè)計(jì)并實(shí)現(xiàn)了以PLC產(chǎn)品及其編程軟件為對象的自動(dòng)化測試系統(tǒng)平臺。該平臺對3個(gè)不同的被測對象選取了不同的測試方案,并使用Jenkins將各部分流程串接起來,實(shí)現(xiàn)了整體的自動(dòng)化測試。該平臺可滿足每日構(gòu)建測試、單元測試和集成測試這3種測試場景的使用。該平臺的投用大大提升了PLC產(chǎn)品的測試效率及產(chǎn)品穩(wěn)定性。