CTS測試框架 RegexTrie

2021-08-13 15:58:09 字數 3300 閱讀 3169

概述:前面已經提到,基礎框架trade-federation預設就支援很多命令。在控制台輸入一組命令,肯定要經過解析,然後去執行的過程。基礎框架中對於命令有乙個單獨的資料結構去組織,並不是通過if-else這樣去比較string的。比如:前面提到的命令:run cts --plan cts,這個命令中,run才是命令,而剩下的都屬於引數;再比如:list configs,還有命令的簡寫,list可以簡寫為l等等。

trie樹又稱為字典樹,又叫做單詞查詢樹。主要用於文字檢索以及詞頻統計等。有乙個很大的優點就是能夠減少無效匹配的次數。

實現方式:從root節點開始,每個節點儲存乙個字元。每次在向樹中儲存字串的時候,根據單詞中字元的順序,逐個向樹的每層去存放,如果該層已經有該字元,就去取下乙個字元。

例:現在有一些單詞:t,tx,txt,to,txa,too,a,b

構建成為字典樹如圖所示

看這個圖就能一目了然,因為共字首,能夠加快查詢效率,且查詢以及構建的過程可以同時進行。

regextrie是在這個基礎框架中的乙個工具類,實現跟上面的trie很像,但是還是有區別的:區別就在於regextrie的節點上存放的是正規表示式,也就是支援的命令的正規表示式。

基礎框架中支援兩種命令:定長命令以及變長命令。

定長命令list configs– 固定的字串(包括簡寫)

變長命令run cts --plan cts– 後帶變長引數

樹的結構:

接下來看下實現:

首先是這個類中的變數:

private v mvalue = null;

private map> mchildren = new linkedhashmap>();

2.1 put
public v put(v value, string... regexen) 

pattern pat = pattern.compile(regex);

// 把所有的正規表示式裝進list,準備往樹中存放

plist.add(new comppattern(pat));

}return validateandput(value, plist);

}private v validateandput(v value, listplist)

return recursiveput(value, plist);

}v recursiveput(v value, listpatterns) else

return nextchild.recursiveput(value, nextkeys);}}

這個就是樹的構建,使用就在console類中:

首先是定長命令:

trie.put(new runnable() 

}, list_pattern, "d(?:evices)?");

可見在存放的時候就把是以正規表示式做為引數。

然後是變長命令:

argrunnablerunruncommand = new argrunnable() 

string flatargs = new string[args.size() - startidx];

for (int i = startidx; i < args.size(); i++)

try catch (configurationexception e)

}};// 可以看到對於run這個正規表示式,因為這個命令就是為了執行的,肯定是要帶引數的

// 因此,往樹中存放的時候最後一引數為null

// 上面put時對於null的判斷也就是為了處理這種情況

// 這個地方存放的時候存入的v直接就是乙個runnable物件了

trie.put(runruncommand, run_pattern, null);

protected

static

final string run_pattern = "r(?:un)?";

2.2retrieve
public v retrieve(list> captures, string... strings) 

// 在取的時候就是根據控制台的輸入了,同樣是變長引數

listslist = arrays.aslist(strings);

if (captures != null)

return recursiveretrieve(captures, slist);

}// 遞迴匹配

v recursiveretrieve(list> captures, liststrings) else

matcher matcher = pattern.matcher(curkey);

// 正規表示式match

if (matcher.matches())

captures.add(curcaptures);

}// 遞迴

return child.getvalue().recursiveretrieve(captures, nextkeys);}}

// 如果是通配模式,則返回所有的剩餘引數

if (wildcardmatch)

}return wildcardvalue;

}return

null;}}

可以看到在取的時候正式根據引數的list逐個去和樹中每個節點上的正規表示式進行match,如果可以匹配則進入子樹繼續,直到引數取完,此時拿出對應的v。

基礎框架中通過這樣乙個正規表示式字典樹的結構,在初始化的時候就把自己支援的命令以及這個命令要執行的action – runnable物件存進了樹,在使用者輸入引數之後直接去樹中取,可以說是取值以及匹配同時進行,直道拿到對應的runnable物件,取出執行。

雖然這樣對於命令的支援很到位,但是這樣的資料結構也優缺點,就是對於資料量小的話支援比較到位,但是當資料量很大,那這個樹就會很大,效率也就沒有那麼高了。

CTS測試框架 總結

針對v1版本的框架,因為框架做的事情比較多,而且需要plan的組織,新增case除了需要把case寫好之外,還需要配置case的xml檔案,寫好每條case,放到制定目錄,另外如果想要根據plan來執行的話還需要在plan中進行配置。針對v2版本的框架,配置起來要簡單的多,只需要在case寫好之後配...

CTS測試方法

1.準備一台測試機器a,一張可以打 發簡訊的sim卡,一張16g的高速tf卡 推薦閃迪class10等級,讀寫速度95m s 還需要能夠連線youtube 的網路 推薦使用2m的香港專線 2.首先把a恢復出廠設定,然後連線電腦在terminal下進入到media資料夾輸入一下命令拷貝檔案到a的記憶體...

CTS測試介紹

cts測試基本介紹 cts測試全稱為系列相容測試 compatibility test suite cts是為了測試手機是否符合google定義的相容性規範 compatibility definition 從而基於android的應用程式能在基於同乙個api版本的裝置上面執行。通過cts測試的裝置...