安卓單元測試 八 Junit Rule的使用

2021-09-19 06:15:05 字數 1994 閱讀 8473

乙個junit rule就是乙個實現了testrule的類,這些類的作用類似於@before@after,是用來在每個測試方法的執行前後執行一些**的乙個方法。

如果你不清楚@before@after這些annotation的意思,chances are你還不了解junit的使用,建議先看這篇文章。

那為什麼不直接用這些annotation呢?這是因為它們都只能作用於乙個類,如果同乙個setup需要在兩個類裡面同時使用,那麼你就要在兩個測試類裡面定義相同的@before方法,然後裡面寫相同的**,這就造成了**重複。有的人說你可以用繼承啊,首先我想說,我很討厭繼承這個東西,所以如果可以不用繼承的話,我就不會用;再次我想說,如果你不討厭繼承的話,從現在開始,你也應該慢慢的討厭它了。

此外,junit rule還能做一些@before這些annotation做不到的事情,那就是他們可以動態的獲取將要執行的測試類、測試方法的資訊。這個在接下來的乙個例子裡面可以看到。

使用框架自帶的rule

很多測試框架比如junit、mockito自帶給我們很多已經實現過好了的junit rule,我們可以直接拿來用。比如timeouttemporaryfolder,等等。這些rule的使用方法非常簡單。定義乙個這些類的public field,然後用@rule修飾一下就好了。比如

public class exampletest 

@test

public void testmethod2() throws exception

//other test methods

}

那麼,對於上面這個exampletest的每乙個測試方法。它們的執行時間都不能超過1秒鐘,不然就會標誌為失敗。而它的實現方式就是在每個方法測試之前都會記錄一下時間戳,然後開始倒計時,1秒鐘之後如果方法還沒有執行結束,就把結果標記為失敗。

這裡需要注意的一點是rule需要是publicfield。

實現自己的rule

public class methodnameexample implements testrule };}

}

這個rule這樣就算寫好了,現在來試試,用這個 rule的方法跟使用自帶的rule的用法是一樣的,寫乙個public field,用@rule修飾一下就好了。

public class exampleunittest 

@test

public void mulitiplication_iscorrect() throws exception

}

執行結果如下:

在右邊的框框可以看到,把測試方法的方法名和所在的類名列印出來了。

上面的例子對於testrule的實現應該說的比較清楚,但是看起來沒多大用。下面給另外的乙個例子,大家或許會覺得這個東西更有用一點。在安卓裡面,我們經常在很多地方需要用到context這個東西。我們的做法是將這個東西儲存在乙個類裡面,作為靜態變數存在:

public class contextholder 

public static context get()

}

public class contextrule implements testrule 

}

這樣,在執行一些用到context的測試方法之前,你就可以使用這個rule來給context賦值了。

這篇文章的**放在這個github repo裡面。

安卓自動化單元測試 登入模組測試

參考資料 android自動化測試 從入門到入門 構建之法上說單元測試要整合到自動化框架中,要和產品 一起儲存和維護,不是很明白自動化框架是什麼。android 還需要在build.gradle中增加instrumentation testing所需要的依賴 dependencies android...

安卓開發筆記之單元測試junit

測試 黑盒測試 測試邏輯業務 白盒測試 測試邏輯方法 根據測試粒度 方法測試 function test 單元測試 unit test 整合測試 integration test 系統測試 system test 根據測試暴力程度 冒煙測試 smoke test 壓力測試 pressure test...

單元測試 單元測試文章收藏

前言 前段時間公司計畫做自動化測試,自己也打算圍繞幾個點做相關調研,現在想想呢?其實對自動化測試的概念都還不是十分清晰,當時主要還是圍繞 單元測試 向qa小夥伴學習了一段時間,現由於公司重組,學習中斷,這裡簡單記錄一些單元測試好文,留待後續參考.什麼叫自動化測試?自動化測試覆蓋率?覆蓋率如何做到的?...