配置文件的內(nèi)容主要分為五個(gè)部分。A、D、E部分保存的是case無關(guān)的元數(shù)據(jù),B和C保存的是通用的header數(shù)據(jù)。 A部分的數(shù)據(jù)有:整個(gè)web service的url前綴(圖中的“drapi.serviceUrl”),公用的soap header代號(hào)(圖中的“drapi.headersGroup”),所有service的代號(hào)(圖中的“drapi.servicesGroup”)。 B和C部分是兩個(gè)公用的header。Normal和editor是他們的代號(hào),在A中給出。Dr-api用到的header信息主要有username/password/token/target,都在這里給出。這些header會(huì)被每個(gè)case引用。 D和E部分是兩個(gè)service。它們的代號(hào)在A中給出。每個(gè)service有三個(gè)字段:name表示service的名稱;url表示service的url后綴。 數(shù)據(jù)文件夾里保存的是每個(gè)case的數(shù)據(jù)。數(shù)據(jù)文件夾可以再進(jìn)行分層:每個(gè)子目錄的名字就是上面提到的service的名字,那么該子目錄下所有case訪問的url都是這個(gè)service的url。每個(gè)case有XXX.input.xml、XXX.output.xml和XXX.properties三個(gè)文件表示,XXX表示case的名稱(為了應(yīng)用到ficus中,XXX最好不帶空格,否則會(huì)被ficus分成數(shù)組)。 ficus數(shù)據(jù)驅(qū)動(dòng) 數(shù)據(jù)驅(qū)動(dòng)使用ficus的data_driven關(guān)鍵字。關(guān)于這個(gè)關(guān)鍵字可以參考FICUS_DataDriven。 這個(gè)關(guān)鍵字需要兩個(gè)主要的輸入:csv文件,執(zhí)行單個(gè)case的關(guān)鍵字。Csv文件的每一行都表示一個(gè)case,data_driven會(huì)針對csv文件的每一行循環(huán)調(diào)用執(zhí)行單個(gè)case的關(guān)鍵字。 我們需要對此編寫兩個(gè)關(guān)鍵字。第一個(gè)是讀取配置文件和數(shù)據(jù)文件夾生成csv文件。這個(gè)關(guān)鍵字首先會(huì)讀取公共的配置文件,得到service列表和輸入header列表;然后創(chuàng)建一個(gè)csv文件,包含這幾列:url,使用的Header名稱,case名稱,XXX.input.xml路徑,XXX.output.xml路徑和properties中的字段。讀取數(shù)據(jù)文件夾的每個(gè)數(shù)據(jù)文件,根據(jù)XXX.input.xml/XXX.output.xml/XXX.properties的組合來添加case到csv文件中。 第二個(gè)關(guān)鍵字是用來執(zhí)行單個(gè)case。輸入就是csv文件的一行。首先根據(jù)使用的Header和XXX.input.xml拼裝成輸入的XML包,使用HTTP方式向Web Service Server發(fā)送請求,接收HTTP相應(yīng),解析出Header和Body,將Header中個(gè)字段和XXX.properties中的個(gè)字段做對比,將Body和XXX.output.xml做對比。 ficus調(diào)用java關(guān)鍵字 我們寫關(guān)鍵字使用的是Java,這里簡單提一下如何用ficus調(diào)用java關(guān)鍵字(感謝朱雷同學(xué)的幫助)。在最新版的ficus程序里,有一個(gè)Java目錄,有一個(gè)ficus-java-stub.bat文件。將自己寫的java關(guān)鍵字打成jar包,放到這個(gè)目錄,然后啟動(dòng)這個(gè)文件就可以啟動(dòng)ficus的Java樁。在寫case的時(shí)候,首先要添加library,為了使用Java樁,需要添加FicusProxy.JavaProxy | XXX | YYY | localhost | 2345。XXX和YYY都是java關(guān)鍵字所在的public類的類名,這些類的public方法名稱都是ficus關(guān)鍵字。 它的原理是:FicusProxy.JavaProxy是一個(gè)python關(guān)鍵字,當(dāng)ficus遇到一個(gè)關(guān)鍵字的時(shí)候,會(huì)通過JavaProxy來查詢。JavaProxy會(huì)通過socket發(fā)送請求到Java樁。Java樁加載了java關(guān)鍵字所在的jar包,因而可以通過反射找到以關(guān)鍵字為名字的方法,從而實(shí)現(xiàn)調(diào)用。 提示一點(diǎn),如果自定義的java關(guān)鍵字(都是java方法)所在的類比較多,那么最好把FicusProxy.py的BaseProxy的_receive函數(shù)的length默認(rèn)值改大一點(diǎn)兒,這個(gè)值表示ficus和Java樁通信每次發(fā)送的數(shù)據(jù)長度。如果太小,發(fā)送的數(shù)據(jù)會(huì)被截?cái)?,包含關(guān)鍵字名稱和參數(shù)那部分會(huì)被截?cái)?,就?huì)出錯(cuò)。 總結(jié) 以上便是我們在HTTP層面進(jìn)行Web Service測試的總結(jié)。這種方法由于需要手動(dòng)構(gòu)造輸入和輸出SOAP包的body,因而在數(shù)據(jù)量較小并且不關(guān)注輸出包body的場景使用起來很方便。由于使用的數(shù)據(jù)驅(qū)動(dòng),也很方便應(yīng)對接口的變動(dòng)。 后續(xù)考慮遷移到eFicus中,實(shí)現(xiàn)case的管理和執(zhí)行一體化。
|