我們在做自動化的時候,偶爾會遇到測試用例莫名其妙的失敗,再次運行又OK的情況。針對這種情況我們有必要在測試用例操作失敗時自動重跑 來避免不必要的核查。
那麼針對robotium框架該如何實現自動重跑測試用例呢?
導致測試用例中止可能會有以下幾種情況:
1、我們自己的斷言 junit.framework.AssertionFailedError(有bug的情況)這個類的根類是Error
2、測試用例拋出exception
3、被測應用進程crash
對於第一種情況,是我們不需要重跑的,第三種情況crash我們今天的方法還無法重跑(個人觀點robotium針對crash的重跑是沒有意義的),那麼第二種情況纔是我們應該重跑的情況
接下來我們就來實際操作如何重跑用例,在繼承ActivityInstrumentationTestCase2的類中複寫runTest直接看到代碼(都有註釋就不多說了)
@Override protected void tearDown() throws Exception { solo.finishOpenedActivities(); } @Override protected void runTest() throws Throwable { int times = 2;//重試次數 while (true) { try { super.runTest(); Log.e("123",this.getClass().getSimpleName() + "/"+getName()+":測試成功"); break; } catch (Exception e) {//測試過程發生Exception後的處理 if (times > 0) { times--; tearDown();//釋放資源 Runtime run = Runtime.getRuntime(); try { //啓動被測app run.exec("am start --user 0 -n 被測app包名/被測app launchactivity"); } catch (Exception e1) { throw new RunTestException(e1); } setUp();//初始化重新開始 continue; } else { solo.takeScreenshot(this.getClass().getSimpleName() + "/"+getName()); Log.e("123",this.getClass().getSimpleName() + "/"+ getName() + ":測試執行過程中出現異常"); throw new RunTestException(e); } } catch (AssertionFailedError e2) { Log.e("123", this.getClass().getSimpleName() + "/"+getName() + ":測試失敗"); solo.takeScreenshot(this.getClass().getSimpleName() + "/"+getName()); throw new OperationErrorException(e2); } } }接下來我們試一試,直接在測試用例中跑出一個異常,重跑2次
public void testCase_001() { solo.sleep(5000); Log.e("123", "啓動測試123"); throw new RuntimeException("運行時異常"); }我們的logcat中打印信息爲:
02-10 15:19:17.263 26812-26849/? E/123: 啓動測試123
02-10 15:19:23.923 26812-26849/? E/123: 啓動測試123
02-10 15:19:30.273 26812-26849/? E/123: 啓動測試123
02-10 15:19:30.403 26812-26849/? E/123: TestDemo/testCase_001:測試執行過程中出現異常
先跑的一次+重跑的2次正好打印了3次,看來我們的重跑是成功的(也可以在設備上觀察是否重跑了)
那我們再來看看斷言錯誤是如何處理的,同樣重啓次數定義爲2,在測試用用例直接面斷言錯誤,
public void testCase_001() { solo.sleep(5000); Log.e("123", "啓動測試123"); assertTrue(false); }
運行後logcat的結果爲:
02-10 15:31:14.657 32393-32428/? E/123: 啓動測試123
02-10 15:31:14.657 32393-32428/? E/123: TestDemo/testCase_001:測試失敗
正常斷言失敗後並未重跑達到了我們的目的。
如果有其它問題或不清楚的地方還請留言