多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > TTCN中PTC的運行流程

TTCN中PTC的運行流程

來源:程序員人生   發布時間:2014-09-26 20:03:59 閱讀次數:2839次

一些概念

Component(測試組件或者測試成分),TTCN接觸下來最頻繁的就是MTC(Main Test Component,主測試組件),在執行測試用例前,需要首先創建一個MTC,在testcase運行過程中,只能有唯一的MTC。如果沒有指明testcase需要runs on在某個Component,系統默認的component就是MTC。在testcase代碼中,不能控制MTC的建立與停止。

非主測試組件的測試組件叫PTC(ParallelTest Component, 并行測試組件), PTC是由testcase控制的,最后由系統銷毀。testcase可以執行create,start,stop等操作 。

簡單說,一個PTC就可以理解為TTCN模擬出來的一臺遠程主機的進程。通過它,模擬出其他主機實現并行測試。而測試組件之間,通過通信端口實現通信。


一個簡單的例子

這個testcase中,簡單執行:

telnet_IPworks(); //check if every port configuration is right startClient(tsp_ptcClientName0); //在這里啟動名為tsp_ptcClientName0的PTC startClient(tsp_ptcClientName1); startClient(tsp_ptcClientName2); startClient(tsp_ptcClientName3); startClient(tsp_ptcClientName4); startClient(tsp_ptcClientName11); … sendCommand_byPTC("date ",tsp_ptcClientName11,2.2);


PCT和startClient的實現(common/CLI/CLI_Function.ttcn.linux):

//定義了接下來需要使用的PTC,類似C中的結構體概念 type component PTC_CT { port TELNETasp_PT telnet_client_port; //與ipwork測試系統接口通信的端口 port ProcePort managePort; //與mtc通訊的端口 var BatchCommand tcv_batchCommand; //if tcv_bcheckBatchResp== true ,check BatchCommad's Response from SUT ,or not var boolean tcv_bcheckBatchResp := true; } function startClient(charstring p_ClientName) runs on MTC_CT { //initial PTC //如果沒有初始化PTC的列表,則根據ipwork.cfg中定義的tsp_ptcClientName*名,初始化若干PTC備用 if(tcv_isPTCInitial == false) { // PTC_CT.create(tsp_ptcClientName0)建立一個名為tsp_ptcClientName0的PTC,但不啟動 ptcClientName[0]:= PTC_CT.create(tsp_ptcClientName0); ptcClientName[1]:= PTC_CT.create(tsp_ptcClientName1); ptcClientName[2]:= PTC_CT.create(tsp_ptcClientName2); ptcClientName[3]:= PTC_CT.create(tsp_ptcClientName3); ptcClientName[4]:= PTC_CT.create(tsp_ptcClientName4); ptcClientName[5]:= PTC_CT.create(tsp_ptcClientName5); ptcClientName[6]:= PTC_CT.create(tsp_ptcClientName6); ptcClientName[7]:= PTC_CT.create(tsp_ptcClientName7); ptcClientName[8]:= PTC_CT.create(tsp_ptcClientName8); ptcClientName[9]:= PTC_CT.create(tsp_ptcClientName9); ptcClientName[10]:= PTC_CT.create(tsp_ptcClientName10); ptcClientName[11]:= PTC_CT.create(tsp_ptcClientName11); tcv_isPTCInitial := true; //have been intialed } //獲取名為p_ClientName的PTC引用p_ptcClient var PTC_CT p_ptcClient := getCurrentPTC(p_ClientName); log(getCurrentPTC(p_ClientName)); //如果p_ptcClient已經停止運行 if(false == p_ptcClient.running) { //利用map,將測試組件p_ptcClient映射到ipwork測試系統接口上,system是測試系統的組件引用 map(p_ptcClient:telnet_client_port,system:telnet_client_port); //connect直接把p_ptcClient的端口managePort連接到mtc的managePort端口, //這樣建立一條雙工的通信關系 connect(p_ptcClient:managePort,mtc:managePort); //啟動PTC引用p_ptcClient,啟動后執行CliSimulator() p_ptcClient.start(CliSimulator()); pause(1.0); } //sendCommand_byPTC("ipwcli",p_ClientName,0.2); //sendCommand_byPTC(tsp_user_admin,p_ClientName,0.2); //sendCommand_byPTC(tsp_adminpassword,p_ClientName,1.2); }

startClient首先檢查PCT的存儲容器ptcClientName是否被初始化,如果沒有,則根據配置文件ipwork.cfg中設定的名字,create(兩個概念,這里只是create,而不start)若干PCT引用填入ptcClientName備用。然后,根據參數p_ClientName獲取相應的PCT引用。

隨后,調用p_ptcClient.running檢測,p_ptcClient是否在運行(running運行在一個測試部件上檢查另一個測試部件是否運行,這里實在mtc上檢查p_ptcClient)。如果沒有運行,則依次執行map和connect,map為p_ptcClient與ipwork之間建立映射 ,connect為mtc和p_ptcClient建立一個雙工的通信關系,即mtc的輸出口指向p_ptcClient的輸入口,p_ptcClient的輸出口指向mtc的輸入口。然后,執行p_ptcClient.start啟動PTC,PTC啟動后執行的就是start的參數CliSimulator(),如同pthread_create或者exec執行線程或進程函數一樣。

我們已經啟動了新的PTC,那么看看p_ptcClient的CliSimulator()里面究竟執行了那些東西:

function CliSimulator() runs on PTC_CT { var charstring command := ""; var charstring result := ""; var charstring keyWords := ""; timer t := 5.0; alt { //根據模板signature sig_Command(inout charstring p_Command),等待另一個測試組 //件的調用請求,遠程調用時傳入的參數p_Command將被賦予command。這里的managePort就是 //之前mtc與p_ptcClient建立關聯的端口,那么這里就是等待mtc的調用 []managePort.getcall(sig_Command:{?}) -> param(command) { //根據mtc的command,telnet_client_port 即之前map建立的p_ptcClient與 //ipwork建立的關聯, telnet_client_port.send(command)將把mtc傳來的command轉發//給ipwork telnet_client_port.send(command); repeat; } //Batch command operation []managePort.getcall(sig_BatchCommand:{?,?,?}) -param(tcv_batchCommand,keyWords,tcv_bcheckBatchResp) { var integer number := sizeof(tcv_batchCommand); for(var integer i:=0;i<number;i:=i+1) { telnet_client_port.send(tcv_batchCommand[i]); if(tcv_bcheckBatchResp == true) { t.start; //啟動計時器 alt { //接收到回復 []telnet_client_port.receive(charstring:?) -> value result; { //返回值與keyword比較 result := regexp(result,"*("&keyWords&")*",0); t.stop; //關閉計時器 //錯誤結果 if(result == "") { log(tcv_batchCommand[i]," fail"); setverdict(fail); //設置測試失敗 stop; //停止當前component } else if(result == keyWords) { log("Execute command:",tcv_batchCommand[i]," success"); } } []t.timeout //超時 { log("Time out ,don't receive Response from SUT.fail"); setverdict(fail); stop; } } telnet_client_port.clear; } } //調用sig_sendBatchcommandFinished,不等待,直接執行下一步 managePort.call(sig_sendBatchcommandFinished:{},nowait); repeat; } []telnet_client_port.receive(charstring:?) -> value result { managePort.call(sig_Command:{result},nowait); repeat; } []telnet_client_port.receive { repeat; } } }

這里的alt是可選步,如同一個switch的消息循環,每個case選項或是等待遠程過程調用請求,或是等待接受數據,如果有請求或者數據傳輸,程序就會跳進對應的case,,這里主要關心[]managePort.getcall(sig_Command:{?}) ->param(command)

getcall等待遠程的call,managePort就是之前mtc與p_ptcClient建立關聯的端口,那么這里就是等待mtc的call調用,根據module CLI_Signature中定義的函數原型signature sig_Command(inout charstring p_Command)mtc遠程call時傳入的參數p_Command將被賦予command,telnet_client_port 即之前map建立的p_ptcClient與ipwork建立的關聯, telnet_client_port.send(command)將把mtc傳來的command轉發給ipwork。這樣就完成了,從mtc傳送命令交由模擬的PTC轉發給ipwork測試系統接口的過程。下面的[]managePort.getcall(sig_BatchCommand也大體類似,只是將一串命令打包執行。

最后看下mtc中如何調用p_ptcClient的方法 ,使用sendCommand_byPTC("date ",tsp_ptcClientName11,2.2),它的作用就是通過名為tsp_ptcClientName11的PTC發送date給ipwork:

function sendCommand_byPTC(charstring p_Command,charstring p_ClientName,float p_pause) runs on MTC_CT { var PTC_CT p_ptcClient; p_ptcClient := getCurrentPTC(p_ClientName); //獲取名為p_ClientName的PTC引用 //調用managePort通信的遠程方法,方法模板sig_Command,傳入參數p_Command managePort.call(sig_Command:{p_Command},nowait) to p_ptcClient; pause(p_pause); }

這里首先獲取了獲取名為p_ClientName的PTC引用,然后利用managePort調用遠程方法(也就是mtc與p_ptcClient關聯的端口),這里的遠程方法會到p_ptcClient中去找模板為sig_Command的方法,也就是之前提到的CliSimulator()中相關內容。



生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 精彩视频在线观看 | 亚洲精品国产一区二区三区在 | 久久在线视频播放 | 最近最新中文字幕免费大全 | 搞av网 | 久久精品观看影院2828 | hh99me福利毛片在线看 | 国产精品亚洲精品一区二区三区 | 日韩一级一欧美一级国产 | 国产精品不卡高清在线观看 | 国产亚洲欧美日韩在线观看一区二区 | 97夜夜操| 亚洲第一视频网 | 欧美人欧美人与动人物性行为 | 成人国产精品久久久免费 | 一二三四在线观看免费中文在线观看 | 亚洲国产欧美在线人网站 | 国产在线观看成人免费视频 | 欧美精| 茄子成视频片在线观看 | 九九欧美| 精品久久久日韩精品成人 | 国产尤物在线播放 | 日本欧美在线播放 | 日本最新免费网站 | 国产精品视_精品国产免费 国产精品视频1区 | 中文字幕 视频一区 | 欧美性猛交xxxx乱大交丰满 | 国产精品久久久久久免费播放 | 老司机午夜精品99久久免费 | 亚洲高清在线观看 | 九色在线看 | 成人精品视频 | 精品日韩在线视频一区二区三区 | 娇小性色xxxxx中文 | 在线精品国产第一页 | 国产一区二区三区四区五区 | 亚洲制服欧美自拍另类 | 日韩字幕无线乱码 | 香蕉国产成版人视频在线观看 | 最近中文字幕国语免费 |