移動端的測試中,因為回歸一些邏輯分支比較多的功能時工作量比較大,且不太適合用UI完成,嘗試通過單元測試來完成。幾經波折終于完成了一個功能的UT用例并在CI上部署運行,現總結如下:
一、Robolectric簡介
Robolectric是一款運行在JVM之上的Android單元測試框架。傳統的Android Instrumentation單元測試框架必須運行在虛擬機上,測試速度較慢,效率低。而Robolectric模擬了Android sdk的jar包,其會在JVM加載Android.jar包的時候,重寫其中類的方法,讓這些方法有返回值,不會拋出stub異常 ,或者利用Shadow Objects來模擬方法的實現。因此,Robolectric完全脫離了Android模擬器,用例的運行速度大幅提高。
android開發環境搭建實驗報告、二、本地環境搭建
在eclipse中導入或者新建被測android工程
在android工程的根目錄下新建一個test文件夾,在test文件夾中新建src文件夾,用于存放測試代碼
創建一個新的java工程
android測試工具,把java工程下默認的src移除bulid path(點擊鼠標右鍵可見),把src刪除
把android工程下的test/src文件夾,加到java工程來(點擊鼠標右鍵,選擇build path、link souce),就可以在java工程中看到測試代碼了,但實質上代碼是放在android工程的目錄下的
Java工程,右鍵build path 、configure build path中,Projects里把android工程加進來,注意調整順序使blog_android位于robolectric的下面
configure build path中,Add Library,把juint4加進來
如何搭建安卓開發環境。java工程,把下面依賴的android包和robolectric包導入,可把依賴包存放在android工程的test/libs下。必須的包:android.jar、maps.jar、robolectric-2.4-jar-with-dependencies.jar
三、編寫并運行用例
Robolectric是基于juint4的,所以樣式類似于普通juint的單元測試,以下是一個簡單的例子
@RunWith(RobolectricTestRunner.class)
安卓studio環境搭建,@Config(emulateSdk=18)
public class ButtonTest {
ButtonActivity buttonActivity;
Button button1;
TextView textview;
@Before
public void setUp() throws Exception {
buttonActivity = Robolectric.buildActivity(ButtonActivity.class).create().get();
textview = (TextView) buttonActivity.findViewById(R.id.TextView1);
button1 = (Button) buttonActivity.findViewById(R.id.Button1);
}
@Test
public void buttontest() throws Exception {
button1.performClick();
assertEquals("你點擊了開始按鈕!", textview.getText().toString());
}
}
運行用例,run configuration設置,test下最下方Select選擇Eclipse JUnit Launcher;Arguments里Working directory選擇android工程。
當用于項目的時候還有一些需要注意的地方:
網上有的例子啟動activity,使用buttonActivity ?= new ButtonActivity(),我試了下在robolectric-2.4-jar-with-dependencies包下是不行的;
如果配置的android sdk版本比較高,比如@Config(emulateSdk=21),運行用例會提示Robolectric還不支持;
Robolectric默認采用項目根目錄下的AndroidManifest.xml和res資源文件,當采用上述方法運行用例時,則會采用android工程下的AndroidManifest.xml和res。如果不想用默認的,也可以指定文件:@Config(manifest = "",resourcesDir="")
運行用例的時候,Roblectric會先去創建Android工程的Application的實例。在實際的項目中,發現有一些清理的方法和xml的寫法robolectric不識別,一種做法是在BeforeClass中把Application的class文件和需要修改的xml文件替換掉,在AfterClass中換回來。Robolectric也提供一種替換方式:@Config(application = CustomApplication.class)
四、CI部署與持續集成
采用ant編譯運行測試代碼,編寫build構建文件。需要先編譯開發代碼,再編譯測試代碼,才能運行用例,target可以按照如下形式組織:
有幾點需要注意的地方:
如果build文件沒有放到android工程的根目錄下且代碼中沒有指定res和AndroidManifest.xml,在運行測試用例前需要把android工程的res和AndroidManifest.xml拷貝到build文件的同級目錄下;
classpath中junit.jar要位于android.jar之前;
編譯和運行測試用例的classpath中需要包含編譯開發代碼的目標路徑和開發代碼的所有依賴jar包。
Jenkins上部署運行:雖然在本地創建了一個java工程,但其實代碼源碼是存放在android工程中的,因此只需要從git上更新android工程,然后ant運行build構建文件,最后再配置發送郵件。注意:生成R文件,如果運行用例的服務器是linux的,需要在工程根目錄下手動創建gen文件,而windows下會自動創建。
本文來自網易實踐者社區,經作者陳天昊授權發布。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态