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