這是我在編寫編碼UI測試時經常處理的東西。我幾乎總是最終編寫一個簡單的擴展方法來處理重試特定操作(不是整個測試!)。有時,特別是在頁面上出現奇怪的非標準標記或發生大量AJAX事件時,您只會遇到行動將失敗一秒的情況,因爲尚未準備好,然後傳遞下一個。
public static class TestRetryExtensions
{
public static void WithRetry<T>(this Action thingToTry, int timeout = 30) where T: Exception
{
var expiration = DateTime.Now.AddSeconds(timeout)
while (true)
{
try
{
thingToTry();
return;
}
catch (T)
{
if (DateTime.Now > expiration)
{
throw;
}
Thread.Sleep(1000);
}
}
}
}
然後,我的實際測試中:
uiMap.ClickSomeThing();
uiMap.EnterSomeText();
Action clickSomeOtherThingAction =() => uiMap.ClickSomeOtherThingThatFailsForNoReason();
clickSomeOtherThingAction.WithRetry<UITestControlHiddenException>(60);
它試圖執行的操作。如果它失敗了,並且你沒有意識到這是一個偶然的「正常」事件,它就會像往常一樣拋出異常。如果它失敗了,並且您告訴它重試,那麼它將繼續嘗試該操作(重試之間的延遲爲1秒),直到超過超時,此時它只是放棄並重新拋出異常。
是的。但是,如果拋出異常,那麼爲什麼只要重試測試會做得更好?我建議你做一些網絡搜索來調試編碼的UI測試和處理報告的錯誤消息。把完整的錯誤信息放在這裏的問題將是一個好主意。 – AdrianHHH 2014-10-02 08:16:39
錯誤在我的問題中並不重要。我可以儘量避免它。我對重新開始測試的可能性很感興趣。 – 2014-10-02 08:59:29
'[TestMethod]'只是C#代碼。你可以做任何你可以用C#寫的東西。這個問題看起來似乎是否對您的測試應用程序(AUT)有意義;只有你可以決定。您需要考慮「重試測試」代碼的功能。它是否正確地重新啓動AUT,還是將它留在執行中的某個未知位置?通常,「偶發的異常*失敗」意味着AUT中的錯誤或測試套件中的錯誤。只是重試測試有點像「*希望重新啓動計算機將修復它*」。 – AdrianHHH 2014-10-02 09:58:58