減少產生不必要的Log

隨著testcases越來越多,我們這陣子開始有報表無法出現的問題。後來發現是由於output.xml就有46~50MB的大小,在產生報表時會發生out of memory。這大小光要透過編輯器打開就很吃力了;後來暫時解決方式是透過commandline自行產生報表:

java -jar robotframework.jar rebot output.xml
但這方法不治本,所以開始慢慢的調整我們的testcases。

我開始著手這問題時,RobotFramework已升級到3.0版本,而Selenium從SeleniumLibrary(2.9.1)升級到Selenium2Libary(1.7.4),接下來針對這兩個Library我們所做的調整做說明。會有大量log產生的兇手之一為Wait Until Keyword Succeeds,它會將你retry的內容記錄下來,但有時你並不需要它們:

等到網頁不包含XXX

在SeleniumLibrary時,會寫成這樣:

Wait Until Keyword Succeeds | ${timeout} | ${interval} | Page Should Not Contain Element | ${locator}
而Selenium2Library後,可以改成這樣:
Wait Until Page Does Not Contain Element | ${locator} | ${timeout}
可用Keywords: Wait Until Page Does Not Contain ElementWait Until Page Does Not Contain

等到網頁包含XXX

不管在Selenium1還是2,可能都有人會透過以下寫法去做等到網頁包含XXX:

Wait Until Keyword Succeeds | ${timeout} | ${interval} | Page Should Contain Element | ${locator}
但其實Selenium本身已支援Wait Until:
Wait Until Page Contains Element | ${locator} | ${timeout}
可用Keywords: Wait Until Page Contains ElementWait Until Page Contains

檔案內容是否包含

有時我們會檢查某個檔案內容是否包含特定字串:

${content} | Get File | ${file}
Should Contain | ${content} | ${expect_str}
在發生錯誤時,會將整個檔案內容給log下來。如果檔案內容是值得參考的,也許你會直接log下來;但我會將當時的檔案複製一份,再透過log去連結它: link。如果抓取檔案不是問題,接下來就是減少錯誤發生時所造成的大量log。我透過Grep File,去取代Get File:
${ret} | Grep File | ${file} | ${expect_str}
Should Not Be Empty | ${ret}
另外一個方式是將,Should Contain的values參數設定為False:
${content} | Get File | ${file}
Should Contain | ${content} | ${expect_str} | values=False
不少判斷內容的keyword都支援此參數,缺點是Get File的動作還是會log部分內容。
可用Keywords: Grep File

設定Retry/Wait Keyword的Log Level

這部分可參考另外一篇:

Set Log Level

在某些retry動作內有包含log keyword時,可以在使用前透過Set Log Level為NONE去避免不必要的LOG,然後在teardown在回復成INFO。

使用--RemoveKeywords參數

Wait Until Keyword Succeeds來說,Robot設計者已考量到大量log產生問題,因此可以在robot參數加入以下參數,去濾掉不必要的報表內容:

--RemoveKeywords WUKS
PS. output.xml中依然會有這些東西,但report.html中是被濾掉的。