邵金萍
(濰柴動力股份有限公司,山東 濰坊 261061)
隨著計算機、電子等學(xué)科領(lǐng)域在汽車上的廣泛應(yīng)用,汽車電控系統(tǒng)日益復(fù)雜成為必然趨勢,電子模塊的增加導(dǎo)致汽車故障診斷的難度也越來越大。ECU診斷工具在國內(nèi)得到了迅速發(fā)展和普及。
為確保診斷工具的可靠性,針對其API接口測試的工作凸顯重要性。傳統(tǒng)的手動API接口測試效率低下、覆蓋度低,且品質(zhì)得不到保證[1]。作者所用ECU診斷工具同時存在項目版本眾多、適配的ECU平臺多樣化、開發(fā)及測試周期短等問題[2]。因此基于Python腳本語言開發(fā)了一套ECU診斷工具的API接口自動調(diào)用方法,滿足診斷工具跨ECU平臺的功能和性能測試要求,在人力不足及接口工作量大的情況下,通過合理設(shè)計Python腳本和ECU診斷邏輯測試用例更準(zhǔn)確高效地完成對診斷工具的開發(fā)測試工作[3-9]。
Visual Studio是目前流行的Windows平臺應(yīng)用程序開發(fā)平臺,其中包含的.NET框架是一個多語言 (C++語言、C#語言、VB語言、J#語言等)組件開發(fā)和執(zhí)行環(huán)境[10]。從層次結(jié)構(gòu)上看,.NET框架包括3個主要組成部分:公共語言運行庫(CLR:Common Language Runtime)、服務(wù)框架 (Service Framework)和上層的兩類應(yīng)用模板——傳統(tǒng)的Windows應(yīng)用程序模板 (Win Forms)和基于ASP.NET的面向Web的網(wǎng)絡(luò)應(yīng)用程序模板 (Web Forms和Web Service)[11-13]。
公共語言運行庫 (CLR)是一個運行時環(huán)境,提供內(nèi)存管理、線程管理、代碼執(zhí)行、代碼安全驗證、編譯及其他系統(tǒng)服務(wù)。
服務(wù)框架位于CLR之上,提供了一套開發(fā)人員希望在標(biāo)準(zhǔn)語言庫中存在的基本類庫,包括集合、輸入/輸出、字符串及數(shù)據(jù)類。使用這些可重用類型集合,大大提高了開發(fā)效率。
基于.NET框架的API接口命令調(diào)用前需提前連接和ECU通信的硬件接口設(shè)備,將本文中的ECU診斷工具API命令所在的.dll文件添加到基于Visual Studio 2015 C#Win Forms程序的引用文件集中,運行編寫好的Win Forms程序返回正確的測試結(jié)果,以獲取故障碼信息為例,如圖1所示,為下一步Python腳本調(diào)用提供依據(jù)。
編譯時目標(biāo)平臺選擇Any CPU是將程序集編譯為在任意平臺上運行,也就是在32位Windows上按照32位運行,在64位Windows上按照64位運行。本文的ECU診斷工具API命令所在的.dll文件為32位,因此勾選了“首選32位 (P)”選項。編譯配置界面如圖2所示。
圖1 基于Visual Studio的API命令編譯運行圖
圖2 編譯配置界面圖
Python是一種面向?qū)ο蟮慕忉屝陀嬎銠C程序設(shè)計語言,其語法更接近自然語言,通俗易懂且具有豐富和強大的庫[10,14-15]。
本文中用到32位的Python3.7.4以及它的兩個庫——pythonnet和tblib。pythonnet庫是python與C#的交互模塊,tblib庫是實現(xiàn)其他程序?qū)ython運行結(jié)果可追溯調(diào)用的模塊庫。
ECU診斷工具的.dll文件為32位,因此選擇32位的Python軟件。Python3默認采用UTF-8編碼,解決了Python2的默認編碼是ASCII帶來的編程過程中經(jīng)常遇到編碼報錯問題。
pythonnet庫常用的命令有:
import sys
sys.path.append (r‘…’) #加載dll文件夾路徑;
import clr#導(dǎo)入公共運行時環(huán)境;
clr.AddReference(‘…’)#加載dll文件;
from…import*#導(dǎo)入命名空間;
本ECU診斷工具API命令返回結(jié)果中分別將C#的list和datatable數(shù)據(jù)類型轉(zhuǎn)換成Python的list和dictionary。以獲取故障碼信息為例,圖3是Python調(diào)用dll文件的API命令成功的結(jié)果展示。
ECU-TEST是一款支持多平臺的ECU自動測試軟件,具有二次開發(fā)功能強大、操作簡單等優(yōu)點。其不僅支持dSPACE ControlDeskNG、 ETASLabCar、 NIVeristand、CarSim、 MatLabSimulink、 AVLPUMA、 D2TMorphee等HILMILSIL仿真平臺和臺架,而且支持INCA、CANape、CANoe、CANalyzer等ECU標(biāo)定診斷工具。要實現(xiàn)對ECU診斷工具API命令的自動測試需要將其返回結(jié)果和INCA中的測試結(jié)果在ECU-TEST中做比較,三者關(guān)系如圖4所示。本章要完成的工作是ECU-TEST對ECU診斷工具的調(diào)用。
根據(jù)dll文件開發(fā)的Python腳本和包含API命令的dll文件需要同ECU診斷工具運行涉及到的其他dll文件放在同一個文件路徑下。腳本調(diào)用流程如圖5所示。
ECU-TEST調(diào)用ECU診斷工具測試調(diào)試完成后,連接INCA進行診斷工具功能的自動測試用例設(shè)計,以獲取故障碼信息的API命令自動測試為例,說明如圖6所示。
Python根據(jù)某個元素讀Excel的腳本屬于測試用例二次開發(fā)內(nèi)容,腳本實現(xiàn)設(shè)計如下所示:
import os
import pandas as pd
def ReadExcelDTCM (FilePath,F(xiàn)ileName,SheetName,DFCName):
AbsoluteFilePath=os.path.join (FilePath,F(xiàn)ileName)
df=pd.read_excel(AbsoluteFilePath,SheetName,header=0)
圖3 Python調(diào)用API命令運行結(jié)果圖
圖4 測試工具關(guān)系圖
圖5 腳本調(diào)用流程圖
DFCRow=''
for indexs in df.index:
for i in range (len (df.loc [indexs] .values)):
if (df.loc [indexs] .values [i] ==DFCName):
print ('RowNo:',indexs+1,'ColumnNo:',i+1)
圖6 API命令自動測試用例流程圖
print (df.loc [indexs] .values [DTCM所在列號])
DFCRow=df.loc [indexs] .values[DTCM所在列號]
return DFCRow
ECU-TEST對上述診斷工具的功能測試進行的測試用例編寫步驟如圖7所示。
本論文提供了一種使用Python腳本語言實現(xiàn)了基于.dll文件的API命令調(diào)用的解決問題思路,穩(wěn)定實現(xiàn)了對開發(fā)升級中的ECU診斷工具進行接口功能的自動化測試和版本用例移植,提高了測試效率和準(zhǔn)確性。
圖7 ECU-TEST自動測試用例編寫圖