2016-01-13 60 views
4

我是我公司的自動化工程師。最近,我寫了一段代碼,我的經理絕對不會接受。如何簡化類似if語句的長列表?

我被要求爲涉及GUI不同部分的測試用例編寫一些腳本。我的經理不接受的部分代碼是if/else聲明,旨在檢查GUI中當前的提示語言。

我被指示使用Sikuli,因此,我知道應用程序當前設置的語言非常重要,所以我的腳本可以單擊正確的按鈕(根據語言而改變)。

我的想法是,代碼遍歷if/else語句,然後指向正確的按鈕。例如:if/else聲明確定「ok」按鈕目前是Suomi翻譯,因此它將比單擊正確的按鈕。

這裏是我的代碼示例:

switch (button) { 
case "ok": 
    if (s.exists("imagerepo/language/catalan_ok.png") != null) { 
          s.click("imagerepo/language/catalan_ok.png"); 
         } else if (s.exists("imagerepo/language/suomi_ok.png") != null) { 
          s.click("imagerepo/language/suomi_ok.png"); 
         } else if (s.exists("imagerepo/language/italian_ok.png") != null) { 
          s.click("imagerepo/language/italian_ok.png"); 
         } else if (s.exists("imagerepo/language/portuguese_ok.png") != null) { 
          s.click("imagerepo/language/portuguese_ok.png"); 
         } else if (s.exists("imagerepo/language/english_ok.png") != null) { 
          s.click("imagerepo/language/english_ok.png"); 
         } else if (s.exists("imagerepo/language/dutch_ok.png") != null) { 
          s.click("imagerepo/language/dutch_ok.png"); 
         } else if (s.exists("imagerepo/language/spanish_ok.png") != null) { 
          s.click("imagerepo/language/spanish_ok.png"); 
         } else if (s.exists("imagerepo/language/french_ok.png") != null) { 
          s.click("imagerepo/language/french_ok.png"); 
         } else if (s.exists("imagerepo/language/latina_ok.png") != null) { 
          s.click("imagerepo/language/latina_ok.png"); 
         } else if (s.exists("imagerepo/language/chinese_ok.png") != null) { 
          s.click("imagerepo/language/chinese_ok.png"); 
         } 
break; 
...etc.. 

我與上面的代碼唯一的抱怨是,它是很醜陋。在功能上,它完全符合我的願望,100%的時間。

編輯:我覺得有一個開關,適應潛在的變化按鈕會比有10個開關相同的按鈕更好。可以說,與我剛纔所說的一樣,如果我正在編寫腳本,我總是會知道系統將會使用什麼語言。

如果這是一個糟糕的代碼示例,我可以做些什麼來決定哪個「形式」的按鈕,我需要按?

現在值得注意的是,我正在尋找的答案實際上並不涉及到測試,而是如何最優地執行上述if/else塊的功能?

+0

圖像路徑可以考慮使用switch語句! – TangledUpInBlue

+0

@TangledUpInBlue它實際上已經在「ok」開關中了(編輯該部分,如果這很重要,我會把它扔回去)。所以當我用「ok」參數調用開關時,它會點擊正確的「ok」按鈕。 – jagdpanzer

+1

我的一般經驗法則是,如果if語句佔用3行以上,那麼可能有更好的方法,或者我應該使用'private boolean'方法使其可讀。我將它作爲'isOkPng()'方法。弗拉德的答案可能是最適合這種情況的。 – SGM1

回答

18

喜歡的東西:

String[] languages = { 
    "catalan_ok.png", 
    "suomi_ok.png", 
    //... 
} 

for (String base : languages) { 
    String file = String.format("imagerepo/language/%s", base); 
    if (s.exists(file) != null) { 
    s.click(file); 
    break; 
    } 
} 

吧?未經測試。

+0

我正要提出這個建議。醜陋的代碼可能會變成美麗的數據結構。 – BigMike

+0

我認爲這是最好的選擇。 –

+0

我現在就把它扔掉,讓你知道! – jagdpanzer

4

我假定這是國際化的,所以你可以使用屬性文件爲每種語言,然後得到這樣

ResourceBundle bundle = ResourceBundle.getBundle("messages", userLocale); 
s.click(bundle.getString("image"));