使用Python访问CANoe COM接口实践_第1页
使用Python访问CANoe COM接口实践_第2页
使用Python访问CANoe COM接口实践_第3页
使用Python访问CANoe COM接口实践_第4页
使用Python访问CANoe COM接口实践_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

使用Python访问CANoeCOM接口实践北汇信息——邓淇夫CANoe提供的COM接口使得外部脚本能够访问或控制CANoe软件,从而实现自动化测试任务,而易用且具有丰富生态的Python无疑是一个很好的选择。本文将介绍CANoeCOM基本构成、常用COM对象以及Python脚本调用CANoeCOM的方法,在此之前,先介绍一些基本概念。CANoeCOMServer&Pythonpywin32COM全称ComponentObjectModel,是微软为Windows平台软件提出的、实现软件之间互操作的标准。它不会规定软件的具体实现,而是声明一种对象模型,使得满足这种模型的对象之间能交互,这些对象通常被称为组件(Component)。组件会实现特定的功能,而这些功能以特定的方式提供——即接口(Interface)其他组件通过接口使用它们。另外,组件需要经过注册(Registry),才能被其他软件发现和使用。注册后的组件向其他软件提供服务,因此组件将作为服务端(COMServer),其他想要使用服务的作为客户端(COMClient)。在安装完成CANoe软件后,CANoe已经在Windows组件服务管理器中注册了CANoeCOMServer,如果需要重新注册,可以在安装目录下(默认为C:\ProgramFiles\VectorCANoe14)的Exec64文件夹中找到RegisterComponents.exe,运行即手动注册。Pythonpywin32package,它提供了许多Python扩展以调用WindowsAPI,其中就包括COM组件,由于Python脚本将使用CANoeCOM提供的服务,因此Python脚本将作为COMClient,在pywin32包中就对应win32com.client模块,所以后续的Python脚本都要导入win32com.client模块。了解以上的概念后,下面就看看本文的主要内容。"estconfiguratlonBiTestunitTestresultSystemVaridbesCodeHelpdemoCOMobject卜erarchy-ypeLi?-riry"estconfiguratlonBiTestunitTestresultSystemVaridbesCodeHelpdemoCOMobject卜erarchy-ypeLi?-riryApplicatlo-'MeasurementPython访问CANoeCOMCOMObjectHierarchy在CANoe中,各个功能模块按照一定的层级组织在一起构成整个CANoe软件。与这些功能模块直接相关的COM组件同样也是按照相应的层级组织的,这就形成了COMObjectHierarchy:Vector|CANoe&MudulefCOMObjectHierarchyCOMinterface善ObjectHfierardtyHierdnbyofcomobjucts{deprecatedobjectshavebeenremovedfrcmthistablebutarestillinttieindex)ApplicationBuiDdtmbmME弓£han口白natatasatMSrrtrRgi"弓血哂InteractiveGeneratorsInteractiveGeneratarKeplayCdllectiijnReple.BlockC&RLFuni二血「Ccuwi他Result6nfi口uratinnCLibraryCoEEuiiicmH口nSEtuu在口口i门tiq「同odeISeLj口A口uli匚己HanHodElw加口血虫1「1卜1匚。百口淋3:501111「£二三讨口口□mUiSciLm□miSDij心声响口LBCi]匕£卬」心BinqlEFHe口atsSDurce“gurim口口即日与ult以口口li『mtinnMcd皂Is;岛口plEatinriMedel口曲Wbl4日1:日:5口|」「::^[|~11口口日口己「己巾日1:无13GftaS口urrm[35i」Si;如上图所示,图的最左侧是Application对象,是访问其他对象的入口;通过它可以访问Configuration对象,而通过Configuration对象才能访问CommunicationSetup对象;要想设置CommunicationSetup,就需要按照Application->Configuration->CommunicationSetup从左向右的层级顺序找到相应的属性或是方法,从而实现设置。TypeLibrary了解COMObjectHierarchy能帮助快速找到所需功能,但是不能知道实现所需功能对象的继承关系,为此还需要了解CANoeTypeLibrary。在CANoe软件安装目录下(默认为C:\ProgramFiles\VectorCANoe14)的Exec32\COMdev目录中包含了注册COM所用的类型库,如下图所示CANoe.h头文件:名器曰三明大小忖CAhl川尸hJi3030/10^-更[6C/C4-4-Hsdar2.795K白■CAJMalyzEf.db2020/1CySO-3;16TLB文件343KB2O2O/1Q50>3:16CSaurer77咫|B|CANntii3030/10920,仍QC-b-kHe-ader3.735KB2020/1OCT351&WB交件3-13阳图匚时4口jLc上也明即册3:16CSauncr77KBIMDiag.liZOZO/TtyaJ'3;il&口C++Header53Kfl越Diag-Lc3030/1dyaa3:16CS<iurcf3K自■Diagnostic.tlb2020/T(ya>3;il&TLB京件&KBBlMW诒,也202074/fl117^40TW文件72KB回1MediaJ.c2020/4/fl17MCEauree4KQ囱MadiaJ.li2021V4用户加C/CrHeader5aK0在CANoe.h头文件中包含所有CANoeCOM对象的接口定义,比如ITestConfiguration接口:白9REBEMTERK_CccmstIIDIII^ITestCcnfiguration;99B59S9B-60 defined(_cplusplus)工』1defined^€INIERFa.CE)ggREJi -gSB-GZ MIDL_INTEJ?rACEL"^lSA06g2-e533-^73C-8A56-57123ECSDB59n!F59B-6S ITesrCorsflgiHiaDlan 之口业工工白IDispacch.§血4 499时5 putLlCJ:gg日韦3 VirinailZ-[helpsril^Q][Id][propaer]7KRE5ULT51DMETECDCALLTYPEQeE_Afipllcai:10E(99&瓜丁 /kIretvalL][out]IDispatch.**pVi31^二D;59S-£9 y工工1113。/-[n^lpsrxl^Q][Id][pEopgei:]7EEIE5ULI51DMETECDCALLIYPEqmc;_Pa上ECE[“■a17口 ,一(retvall](aut] IDispatch*和¥曰“-0;39671S9B72 virmal/-[helpstilna][id.][propaet]VERE5nLlSIDMETEODCALLTYPHaeG_EnaDledl(<i9S73 c(rctvall][out] VARIANT_BOOL式上比门曰blid卜二0;弓即9 ~59875 Vir-CLLSil/-[helpstll^Q][Id][proppUL]VERE5nLiSIDMETEODCALLTYPEpQt_ElidDled(-|:in|"VSiMANT_BOaLbEnahLtd)-0;39B77S9B7B 军工工[3。/-[help^tXl^Q][Id.][pEOpget]J/EBE5DLI51DMETEC'DCALLIYPE0eG_iTittLe(/(zstval](out]RBSIR*pVal)=fl;a9-B3DS9991 virtlial/*[helpstllna][Id.][proppiiL]J/ERE5nLlSIDMETEODCALLTYPH口口匚—琳ittuef59E93 Jt[ini7BSTRcli-wVeIF-0;virtual/-[heir-string][Id][propgei;]J/HRESTTLTSTDMETRGDCfirLTYPEoei;_verdices59A35 /*[zetval][ouh]*/eVerdictSbat-ifVnl卜二0;9-9flS£919B37 virtual/B[helr-gtrlnff][id][propget]J/HRE5ULTSTDMETtWDCALLTYPEget_TescUnltsLggHHE jx[zstval]r-^J*/ITestUnits**pV*l)=DFqgggggsago virtual/■[heir-strirGr][id][propcr&t]7eresultstdmethobcalltypeg&t_^r-oTT:1gg®gi /*■[zecval][o^c]s/ITeecCDnriffuzaclCiiiRepoEcfc**pVal|i=0?990:93 virtual/B[helrstrlnGT][id]7KRE5U1TSTDMETliDDCALLTXPEScare(TOl-1)=0;■59H34<|9S<|5 virtual产[helpstrii^g][id]«/ERESU1TSTDMETHQDCALLHYFEStop(void),0;59B57 }?■而如果想要设置TestConfigurationSettings对象,从COMObjectHierarchy得知需要从Testconfiguration对象访问:TgstCorficmrationsTegtConfiqiurationTcplpStackSettinqTcplpAdaptersTe5tTTgstCorficmrationsTegtConfiqiurationTcplpStackSettinqTcplpAdaptersTe5tT「E^EluEqntTBSlllni凶TB弘Uni【Um「山ntP「白用eNmmE5T白£[lEn¥irun灯ieiiLeTesilHodulesT2S15缸口口TestconfiaurationReoort1"231<。门方矍「江卜也£€壮门口鼻[Te5tTrg^ElRE€nB但是在TypeLibrary中Configuration对象有多个ITestConfiguration接口,比如:locoesiooae€1000671DOOB&」口仇的1D00901DQ0911000521000931QQ05I4110Mg.51口仅自£10009710009910009^1DQ1DQ1OOI011DC1D21DQ1D31061051DOI061001071DO1DB1DQ1D9100110EXTERN_Clocoesiooae€1000671DOOB&」口仇的1D00901DQ0911000521000931QQ05I4110Mg.51口仅自£10009710009910009^1DQ1DQ1OOI011DC1D21DQ1D31061051DOI061001071DO1DB1DQ1D9100110EXTERN_CcD-natIIDIiri_ITest-CanfLguraticnS;defined|cplus-plus)&&!defined(CIHTERJaCEMIDL_IfJTER.FACE(nOE01621C-E241-41CS-BlftC-S'l3EFA-S'S9RD5n)TTsstCoxLfiquzation2;piiblxcIT£atCcnfigur-sition£UELCapxloc£VlZCUdl-riitlySLling][id][tiCkaei;]7KRESULTBTDKEIHODCSiL二TYPE广[zet™l](out)7HSTR>pVal|i-0;VlECQil-rritlpsiiirLg][Id][tiGuaer]1/HRESULTSTMffiTHCDCILLLTYEE/T[retval](out]r/cTe^tTretElELentTyperpValj■0;ffST.Troetvlrcual1d过工vlrctaalvirtual[LiEltE二,_LTlj][IdLl[ULLLJEE17KRE5OLT^TDKETfiCDCliLITYRgtval]|out]7IDi5p>Eit.ch**pValJ0;'BrrielpsGxing][idl7HRESULI/bIhelpscriTig]lidJ7HRESHLT|helpstring)(rd"HEESCJLTSTISilETHODCALLTYIESTDHETHODCALLTYFE3TDMETHODCALLTYFEuerElementa[Eau日曰tVOLil卜=0;P.effuni.e(void)=0ZipplyVariant3(void)—口:可以看到,ITestConfiguration2继承自ITestConfiguration,在它的基础上又扩充了许多方法,比如获取TestConfigurationSettings对象的方法get_Settings就在其中。也就是说,要通过实现了ITestConfiguration2接口的TestConfiguration对象的get_Settings方法,才能获得TestConfigurationSettings对象。为此,通过win32com.client模块中的CastTo方法,能将TestConfiguration转换成基于ITestConfiguration2接口的对象。COMObjectCOMObjectHierarchy中有许多COM对象,短时间内掌握所有COM对象是不现实的,下面仅针对常用的、与自动化测试紧密相关的COM对象做介绍。Application使用Python控制CANoe,首先要获取关联整个CANoe进程的COM对象,也就是Application对象。通过Dispatch方法就可以获得关联到当前CANoe进程的COM对象,如果当前并没有CANoe进程,则会启动一个CANoe进程;而如果想要另外获得一个CANoe进程,则可以使用DispatchEx方法。下面是获取Application对象的代码示例:9classCanoe(object):10definit(self):app=Dispatch{rCAKoe,Appliczation1)self.App=app在以上示例中,CANoe各部分功能封装在CANoe类中,在CANoe类初始化时,把获得的Application对象保存在CANoe类的App成员中,这样在CANoe类的其他方法中,就可以通过使用App成员来访问Application对象。有了Application对象,才能访问CANoe工程的各个功能模块,比如打开CANoe工程:而在open_canoe_config方法中使用Application对象的Open方法打开特定的CANoe工程,具体Application对象的接口定义(这里仅展示Application的部分方法,其他方法以及后续扩展的方法并未展示)如下:

defii-=d(_eplusplu=>£&!defined(CTRTERFACE>7S5977S55SMIDL_IHTERFACE["GB7a^BJia-4F32-llD3-B54D-001C-53k3E017B"1)795SSlApplioat±on:publicIDisp-a^ah73600(73601pwi1C:^75602virtual/*[kElpatring][id]|[pzopgct,l*/HRE3ULT3TDHETH0DCFlLLTYET:a?t_Applicntion[79603/J[retval](out|J/IDispatch■■pYalk=□;7Ei79605vixtual/Jinelpstxmgj|id]|propget|J/HM5ULTstemethqdcalltypeget_EuliNaine(彳弥依/*[retval][out]*/B3TR*pVal)-0;7S6077EiMBvirtual/*[helpjtring][id]|[propgetl*/HRE5ULT3TDMETH0DCJlLLTYFT:qetjffumui:7StO9『人|retval]|out|\/BSTR*pval)=0;n'seio7senvixtual/A(MelpstungJ|id]|propget|7HEZSULTSTEMETHODC11LLTYPEget_Parenr(7血2『士[retv5l][out]士JIDispatch*・甘第壮]4*Oj79613T56Hvirtual/*[helpatrirg][id]|[propgetl士/FJRESULTSTDHETHODCALLTYPEsjet_Vi3ible[79615『人[retval][out]\/VJLklAWT_BOOiLAvisible)=0;7Ei球7Stl7vixtuai/Aineipstimg][id][propput]7HM5ULTstemethodcjilltypeput_visibieiT9€18尸[ini7VS.RIANT_BOOLvi5iblej-0;T9百1g75620virtual/*Ihelpstzirar][id]*/ERESULTSTDMETR。口CALLTYEEQuit[voidF-0;7B€2175622virtual/*rhelpstxingr][id]./ERESDLTSTDME^HC'DCALLTYEEtT=w(7S€23,人[opiLiCinal][In]7VM.raiTT_BOOLauz.oSavef75624/工|optional][in]7V&RIMT_BO0L^roniEtUaerJ-0;756257562fcvntualfIhelpstzinor)lid] ERESDLTSTDHETHQDGALLTYEEOr5I79627[in]*/B5TRconTlg,7562S/工(optional][in]77iRIANT_BO0Lauto5ave,73629[CipriDnal][in]7VKRiaNTr_BDOL口工口咤匚Um/r)=0;7563075631vlTCLDal/*[Helpsriingr][id][propger]7HR£5ULT3TDMETHODCALLTYPEgeE_Mea3ureraanE[79632/■Iretval]loutI-¥IDispatch,笃pYmlk=0;7363379634virtual [helpstzing][id][pzopgiet]*/HEESULTSTDJ-^THODC%LLTVPEaet_CanfiQuzation(7BS35,人[rerval][du.l]*/IDlgpaccli**pVa1f=0;T96367S637virtual/*[kelpjtring][id][prapget]*/HRESULT3TDMETHODCALLTYPT:get_CAPL(7563S/■[retval)|outI-¥IDispatch",pMalk=0;7963575640vixtual/■zelpstxingIxdIpropget[I'HRESULTSTDMETHODCALLTYPEget_Er.vixoimentI7S£41/*[retval][out]*/IDiapatizh**pVa1\-0;Measurement要想控制CANoe启动测量就需要获取Measurement对象对于上面获得的Application对象,使用self.App.Measurement获得。在Measurement对象的接口定义中,可以看到Start方法,使用Measurement.Start()就能启动CANoe测量。

19^62EXTERNCcortIIDIIDIHeaaurenent;19363ig3芭4*itdefined[_cpluspins> !deTlned(CIWTERFACE)旧651"百f19^671996319^15919^7019-37119^721997319-37419弓?5191"百f19^671996319^15919^7019-37119^721997319-37419弓?519目7519^77vlitual/s[tielpsT;iing][il][pxcpaetl*$HMSdLlSTDMETKODCALuLlYPE |/*[r&rval][ool]*/IDiapaccTi**pVal>=0:vlitual/s[tielpsT;iing][il][pxcpaetl*$HMSdLlSTDMETKODCALuLlYPE |/*[r&rval][ool]*/IDiapaccTi**pVal>=0:19973viztual/1[helpstizng][zd.]*/ERESULTSTDMETHODCALLTYPE5"COP(VOld.>=D;19-37919^00viitualZT[hrlpstiinff][id]T7EMSITLTSIDHETHQDCALLHYPEStep(voidj,-0;19^9119^02virtual/*[hclpatring][id],/ffRESULT5TDMETITODCALLTYPEAninrate£void)=。;199B319-304vlrEiial/・[helpsrrinig][Id]*/EfRESULTSTE^THODCALLTTPEBreak:(voidj=口:19和5J_9目日石vntual/,■[helpstung][id.]*/ERE51DLT51DMETHODCfiLLTYPEReset(vo*口卜=a?19^37194日8vntual/T[helDatiing][id][pxcpgetl有产HRESOLTSTDHETHODCALLI5fPEcret_Aniiaatx□riDela(19-309Z*[r&rval][Dun]*/lang*pVal)-(口:19蚱019^51viztual八[helpstung][id.][pzcppu.t|3HRKSULTSTDWETHODUJLLLIYPEpur_jKdiima'cjlG-riDala(19^52/*[in]*/longnewVa1|i胃10;19319或4};下面是启动CANoe测量的代码示例:18defstact_canoe(self):19 self.App.Measurement.Start()20SystemVariables系统变量作为CANoe中重要的部分,要想获取任意系统变量的值,就要获取对应系统变量的对象。System门口m一,口口匚91VarimbI的l^farohleVa也IHemFileEXfariableszile从COMObjectHierarchy中可以看到,系统变量Variable对象是按照Application->System->Namespaces->Namespace->Variables->Variable顺序访问的。其中Namespaces和Variables分别表示Namespace和Variable对象的集合,因此可以

使用Namespace名称(Variable名称)作为索引,从Namespaces(Variables)中获得相应的Namespace(Variable)对象。73129EXTERNCconat:II&IIDINanE-araMa;7313073131tirdi±rinacl(_cplosplus)匚芯!derined(CTIOTERFACE)7313273133 MIDL_INTERFACE|w364EE35S-iA0A.-42Ji>5-3BA5-F3ijC^2SEeBDBl,F了3133 :piiblicIDiaE-atch73135 17313fi putilic:73137 D工工匚113173138 R^3139/*■[HEipgrinig][id.][pxc-pget]7HRESULTstdmeteodcSlLLTyphgar_Applicarion((zetval)[aut|7IDispatoh一笃pUml)=0;731^0 uixcual731-31 /■731^2[helpsrxing][id][propger]*/HRE5OT.TSTDMETFTODCALLTYPEg&r_Paren.cf[xetval][cut]7iDlspazan*ApVal>=Q;731^3 vixcual7乳44 ”731*35[hclpstiina][id][pxcwetl*/HRESULTS7DMETEODC^1LT¥PEQTEt_Co-LLnt([cetval][oat]*/long*pnCount>=0;731^6 1Vizcual731^7 1731^8 1 /*73工弓9 1[H=lpgriuig][id.][pxopget]7HRESULTslDMETEODGSuLLTPHgsr:_ltem[[zn]3/VARIANIindexj,[xetvittl][aut]*/INamespace*„1卜一。:7313Q WXXLUdX73151 厂73152^3153 virtual73154 7*73155 /731S573157 vizcual^3153 /*7315373160 };[li=Xp±dL-xl-Eig][J.CL][pxupgu!L-j-/KMTOLTn~E«ETKOE'akZ.LTXFEyi±L_11;忖瓦“54(letval)[aut|"/lUnSma,wn,NppEnuni卜=0;/*[helpatrina][id]*/HF1.ESULI31DMETHODCALlTYFTAdd£[in]M&5TRnmiHe.[zetval][aut]*/INameapacie*ApValf=0;冲(hclpatzina][id]t/HRESDLTSTIHETHODCALLTVPERemovef*/VARIANTindEK)=0;71347EXTERN_CconstIIDIID_IVariablc3;7134071945Jtirdetin&d[_cplusplus>&&\defined(CTNTERFEl2E>7135D71351MIDL_IirTER.FACEf.3DE7AA7S-B«32--92c7-A237-3口虱75B14A23D阿j71352IVariniiles;publicIDispatch71353(7135-9putllc\7135Svirtual/*[helpstrina][idl[prorae3]7HEESEJLTSTDMETBODCS1LIYPEqret_Ai>i:liDation(7135€/*[retvtil][out]*7IDispatch**E?Val|)二0;719577135aVixtual尹[匕ELpm七 [IdJ[量topgE匚]7HRE5CTLTSTDMETHDDCfiJ-L.IIPEget_PaxeiLZ(.71855[retval][out)*/IDispatchXTE-ValF-0;¥13专口71获1vlmiial/-[neipsering][1>1][propgec]VHRE3ETLT5TDMETH门口CTlLLTTPHgeE_CounE£713-62/A[reuval][our]7long^pnCount)=0;71863713«^virtual卜[helpsbring][id][propget]*/HRESULTSTTUMETFiODCPiLLTYPEget_Item[719455”[In]7VAHiaNTindLeXj.7J3-61/A[xerval][ou,c]n/IVaria&le**p-Valf=0;718-67718-63virtual"[hclpstrina][id][prorget]7HRESULTSTDMETHODCPlLLTTPEget_tTc-wEnun£71获g/*[rer.val][out]*/ICTnlcnoiHrn**p^.Enuin.)=0;7J37071871viztual”[nelpstrma](idl,/HRESULTSTDMETEODCALLT^PEAdd(713^2n]*/B3TRname,71373[opuional][in]*/VARIANTvalueF7137-3/*[xerval][ou,c]*/IVaria&le**p-Valf=0;7187S7137Svirtual/*IheLpstrina][id]7FfRESULT5TDMETFfODCALLTYPERemove[71377"[in]7VARiaNT =0;72373718753另外,在Variable对象的接口定义中,可以看到get_Value和put_Value方法,而Python将这两种方法转变成了Value属性,也就是说可以直接对Variable.Value取值或赋值。EXTERN_CconstIIDIlD_IVarlable;iitdenned(_cciinspius}£&Fderineaicinterface)MIDLINTERFACE("E172E395-EF4B-4后工e-S9BF-B99DAE354305"4IVariable:publicIDispatokpiiblic™virtual/*[helDStEingl[idl[propuet]#/HEIESULTSTDTSETEODCMiLLTnfPEquL_SpplicatiorL(/工[xecval][out:]工/IDispacchTTpVal)=0;virtual广[helpstringj[idj[propget] HRESULTSTnMETHOD-CALLTYPEget_Parent(/*[xetval][out]7IDispaCGh**pVal)=Orvirtual[helpstring][id][propget;]■/HRESULTSTDMETEODCSiLTYPEget_Name(/*[X&cvall[one]ZB5TRftpVal)=□;下面是获得系统变量值的代码示例:在以上示例中,添加了简单的异常处理可以暂且不看,仅考察if分支中的语句。首先,使用self.App.System.Namespaces获得Namespaces对象;将其保存在system_namespaces变量中;然后使用刚保存的变量,以ns_name作为索引获得Namespace对象并保存在sys_namespace变量中;再通过sysvar_name索引获得Variable对象sys_variable,最后返回sys_variable.Value属性值。TestConfiguration&TestUnit与自动化测试1(这里仅介绍TestConfiguration配置,即与vTESTstudio软件联合使用的自动化测试)直接相关的就是TestConfiguration以及TestUnit,前者对应整个测试执行的设置,后者包含具体执行的测试用例。在COMObjectHierarchy中可以看到,它们的层级构成为Application->Configuration->TestConfigurations->TestConfiguration->TestUnits->TestUnit:倏。血口口闻口的 TestconflourationTcDlpStackS&ttinq TcpIcAdapiersiqt沁nR一口口吒 --nfinij「ati-R旧口口HFi也已rSettin口:■5tSnfi口u「;ati0nS史ttinq5正snrgeElHmgnM T^srT「HEElemgnLTR—tUnit13「i-EP「口fi3lN-m—5其中,TestConfigurations与TestUnits跟前文类似,表示TestConfiguration和TestUnit的集合,同样可以通过索引访问。除了可以使用相应TestConfiguration(TestUnit)名称作为索引以外,还能使用数字索引,但是切记索引起始为1。对于仅有一个TestConfiguration的情况,仅需要TestConfigurations(1)来获得唯一的TestConfiguration对象。当CANoe工程中还没有TestConfiguration或者TestUnit时,就需要先添加。查看它们的接口定义:1这里仅介绍TestConfiguration配置,即与vTESTstudio软件联合使用的自动化测试

可以看到Add方法能添加相应的对象对于TestConfigurations.Add()可以看到Add方法能添加相应的对象对于TestConfigurations.Add()不需要其他参数,即可添加并获得新的TestConfiguration对象;而TestUnits.Add()需要提供所要添加的TestUnit的绝对路径,同样可以获得对应的TestUnit对象。另外值得注意的是,TestUnits的Add方法是在ITestUnits2接口上扩展的,所以要通过前文所述的CastTo方法将TestUnits2(默认为基于ITestUnits接口)转换成基于ITestUnits2的对象。下面请看加载测试配置的代码示例:iq(self,r.^3t_unit:self»te3t_config=3e1f»App►Configuration»TeatConfigurationa.Addt)=Castle(5&If. g.^estUni11T^n5tUnit52bt}tnst'.inits.Add(tnstunitj?2七口)2默认为基于ITestUnits接口

在以上示例中,首先通过TestConfigurations.Add()方法新添加一^个TestConfiguration对象,并把它保存为类成员self.test_config;之后使用CastTo方法将新添加的TestConfiguration中的TestUnits对象转换成基于ITestUnits2接口的TestUnits对象默认为ITestUnits接口)最后使用转换后的TestUnits对象的Add方法添加test_unit_path路径下的测试单元(.vtuexe文件)。加载测试配置后,还需要启动测试执行,查看ITestConfiguration接口定义,可以发现Start方法:SS35BEKTERW_CcanjtIID11s5tConfiauratioel;958^199S€3998%电998^799370553715537299373959785S53759537699377553^0993799598099381993S2953S39338月993E5953EtS5387958^199S€3998%电998^799370553715537299373959785S53759537699377553^0993799598099381993S2953S39338月993E5953EtS5387S53S0953E995350S539199392993538535^S53S7#i亡dLerined(_cpius^iusji ■aeiined(cinterfjice>MIDlb_INTERFACE(r,3LAA。E32-€523-473C-3A.53-57123E020S59nJITeaLConTlgm:aridu之^uJDlLaIDlBpacalipublic;/*[Helpscrlng]|id][pxopger.]*/EIRESULT[xetval](out]■/IDispatchT^pVal/*/*[t2Ipg匚工Ing][id][pxcpgsr.]*/HRE3CILT[工£七寸己[J[oil匚]7LDlBpacch**pval|i=o;5TDMETHOPTALLTTPEgetFarenr(virtual/*[kelpstrin^][id][pxcpget]*/HRE30LT[xetval][ouc]7VAE.LaBT_BOCL^bHnafcled|i5TDKETH00ZALLTYPE=o;9et.Enabled(virtualA[hclpstrinu][id][pTcpput]*7FiRESULT[m]7VAE.IA£^_BOCLt)EnaJDled.>=o;STrnKTHODCALLTYFEput__Enabled£virtual八[helpstrinij][id][prepget]*7FIRE3DLT[i&rual][ouc]*/B3TR*pV£lf=0:STDKCTHCiDCALLTYFEget__NariECSTDWETHODiZALLTrPEgetApplleaHon(•.HRESIILTSTDHZTHODCALLTYPEpr3t_Harae(virtual7*[helpstririgr][id][picpput]

/*[in]*/BSTRneiJVal)=0;■virtualr(helratrincr]fid][picpact]->HRESCTLTSTDKCTHDDCALLTYPEaet_Veidict(/*[rerval][ouc]7eVeidlerscane*pVail>=0;virtual八(helrstrincr]fid][piDpaet]JHRESCTLTSTDHCTHODCALLTYPEaet^TeaaUnits(/*[retvsl][out]岂/ITestUnitB**pVal)=0;vixtual/1Jhelpstrinj][id][pTcpgret]■/HRESULTSTDKETHODCALLTYPEQEt_kepcrt(/*[le-tvol][out]7ITe-stCanfigurationRepart**pVaL)i40;VlELUal/*[t且ipg匚:ting][[d]*/HRE3CTLTSTDMETHODiTAKLTrPEScop(T7O1L1)=0;下面是执行测试的代码示例(这里使用了之前保存的类成员self.test_config):36defrun_test_config(self):37 self.testconfig.Start()执行完测试后,需要获得测试结果,可以通过CANoe软件为TestConfiguration创建的系统变量VerdictSummary查看:%SystemVariablesConfigurationUsei-Defiu-edSystem-Defined除帐Displayvariable rDatatypeMlnMaxReadOnlyAnalysisOnlySourceComment题..Statistics设CANoe7RTest_Configuratiori_l%RurState Int32- -VeffdlctSummaryInt32下面是获得测试结果的代码示例:39defget_te3t_re3ult(selfftet_config_name=1TeaL_Ccn11guration_1*);40 returnselfget_SysVar(test_confi,g_namef'VerdictSummary1)这里get_test_result方法有一个带有默认值的参数test_config_name表示实际执行测试的TestConfiguration名称,它的默认值是Test_Configuration_1,如果没有修改过就不需要提供参数,否则需要提供;get_test_result返回保存在VerdictSummary中的测试结果,其数据类型是整型,需要在接口定义中查询具体数值对应的结果:S941 _COM_ENDM_VER.DICT!_STZk,TE5942fdefine_COM_ENUM_VER1>IGI_STATE5943typedef/*[public][pilblxc][pixblic][public.][public][public][public][public]5914enum_HIDL MIDL:JLtX_CAHW_OO0O_OO0O_OO035945 !— ~ ~ ~ ~ ~5946 cVerdictNotAvailafcle = Qf5947 ciVerdietPasBed=1『S94S cVerdietFai1ed.=2TS949 cVerdictNone=3r5550 cVerdictInconclusive =4,5951 cverdictEirozlnTestsyste^L =55952 }eVerdictState;Testdemo联合使用上述COM对象就能够实现自动化测试,下面展示完整的代码示例:im;■rttimCjosii'FTttin32cDir.*clienti*■:'.■win32cDir.^c];er)t;»correct.:,1011121314151617IE192。2122232426272B心311011121314151617IE192。2122232426272B心31323334353bJ73B33LassCanoe(object)tdefdefdefd&f।lefdeldetinit[seif):曰pp=Liipatchf'CANcjeTApfliedCion1)s-:r,App=app.+:】_c.wn・e।-'Llrefc_path|:.f.App.Opeatcfg_patii}□tdrl_cdntje(尸二!');selfrApp.Mwsurement»Start;{)'.je\_5yLVdrtn3_n<tinsfsyjvar_naiTe):21(5Q11.App31Ncnc):aystem_nam53pace3=^eli.App,Sy^tetn.Ndinsspacessys_Ti

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论