本文首發於 vivo互聯網技術 微信公衆號
連接: https://mp.weixin.qq.com/s/-TW7p3z3vJ3GJw7X9u7dVg
做者:Zhu Yifei
做爲一名合格的開發人員,基本的開發測試能力必不可少,開發測試分單元測試和UI測試,經過開發測試能夠減小開發人員自測時間,提高開發質量。本篇文章能夠幫助初級開發人員快速瞭解開發測試,快速上手測試編碼。本篇文章一樣適用於應用軟件初級測試工程師,快速上手編碼測試用例。javascript
在正式學習Android應用測試以前,咱們先來了解如下幾個概念。java
JUnit是一個Java語言的單元測試框架。
該框架基於JUnit,所以既能夠直接使用Junit 進行測試。又其爲Android 應用的每種組件提供了測試基類,所以也可使用Instrumentation 來測試Android 組件。Instrumentation和Activity有點相似,只不過Activity是須要一個界面的,而Instrumentation並非這樣的,咱們能夠將它理解爲一種沒有圖形界面的,具備啓動能力的,用於監控其餘類(用Target Package聲明)的工具類。android
自動化測試使用Android的Instrumentation API,這些API的調用在一個與UI線程不一樣的線程中運行,所以,使用自動化方法測試用戶界面會致使嚴重的併發問題,進而產生不一致不可靠的測試結果。Google對這個問題的解決方案是Espresso,它是一個測試框架,可以使UI測試在多線程環境中安全地運行,並移除了關於編寫測試的大部分樣板代碼。
AndroidJUnit基於JUnit,使得咱們既能夠在JVM上運行本地單元測試(local unit tests),也能夠在Android設備上進行儀器測試(instrumented tests)。測試代碼的位置取決於您要編寫的測試的類型。Android Studio 爲如下兩種測試類型提供了源代碼目錄(源集):安全
本地單元測試微信
- 位於 module-name/src/test/java/。
- 這些測試在計算機的本地 Java 虛擬機 (JVM) 上運行。當您的測試沒有 Android 框架依賴項或當您能夠模擬 Android 框架依賴項時,能夠利用這些測試來儘可能縮短執行時間。
- 在運行時,這些測試的執行對象是去掉了全部 final 修飾符的修改版 android.jar。這樣一來,您就可使用 Mockito 之類的常見模擬庫。
儀器測試多線程
- 位於 module-name/src/androidTest/java/。
- 這些測試在硬件設備或模擬器上運行。這些測試有權訪問 Instrumentation API,讓您能夠獲取某些信息(例如您要測試的應用的 Context), 而且容許您經過測試代碼來控制受測應用。能夠在編寫集成和功能 UI 測試來自動化用戶交互時,或者在測試具備模擬對象沒法知足的 Android 依賴項時使用這些測試。
- 因爲儀器測試內置於 APK 中(與您的應用 APK 分離),所以它們必須擁有本身的 AndroidManifest.xml 文件。不過,因爲 Gradle 會自動在構建時生成該文件,所以它在您的項目源集中不可見。您能夠在必要時(例如須要爲 minSdkVersion 指定其餘值或註冊測試專用的運行偵聽器時)添加本身的清單文件。構建應用時,Gradle 會將多個清單文件合併成一個清單。
當您新建項目或添加應用模塊時,Android Studio 會建立以上所列的測試源集,並在每一個源集中加入一個示例測試文件。您能夠在project窗口中看到他們,如圖1-1所示:併發
(圖1-1)app
在寫單元測試以前,務必肯定gradle中作好相應的配置。如圖1-2所示:框架
(圖1-2)ide
接下來就正式入門啦,表激動,一步步來會很簡單哦~
第一步 :打開包含您想測試的代碼的 Java 文件。如Calculator.java。
/** * [description] * author: yifei * created at 17/6/8 下午12:00 */ public class Calculator { public double sum(double a, double b){ return a + b; } public double substract(double a, double b){ return a - b; } public double divide(double a, double b){ return a * b; } public double multiply(double a, double b){ return a / b; } }
第二步:點擊您想測試的類或方法,而後右擊如圖2所示,或按 Ctrl+Shift+T (⇧⌘T)。
(圖2)
選擇create test如圖3所示,並選擇setUp/@Before和須要測試的方法,而後點擊OK。
(圖3)
在 Choose Destination Directory 對話框中,點擊與您想建立的測試類型對應的源集:androidTest 對應於儀器測試,test 對應於本地單元測試。而後點擊 OK。如圖4所示:
(圖4)
這時在module-name/src/test/java/下出現了CalculatorTest.java。
/** * [description] * author: yifei * created at 17/6/8 下午12:01 */ public class CalculatorTest { private Calculator mCalculator; @Before public void setUp() throws Exception { mCalculator = new Calculator(); } @Test public void sum() throws Exception { //expected: 6, sum of 1 and 5 assertEquals(6d, mCalculator.sum(1d, 5d), 0); } @Test public void substract() throws Exception { assertEquals(1d, mCalculator.substract(5d, 4d), 0); } @Test public void divide() throws Exception { assertEquals(4d, mCalculator.divide(20d, 5d), 0); } @Test public void multiply() throws Exception { assertEquals(10d, mCalculator.multiply(2d, 5d), 0); } }
此時選中方法名,右擊run'method()'。
(圖5)
因而一個本地單元測試就完成啦,是否是比較簡單呢?
在建立測試以前,咱們創建一個待測試的TestActivity.java,添加一下簡單的交互。在EditText中輸入任意字符串,點擊Button在TextView中顯示出來,如圖六、7所示:
(圖6)
(圖7)
爲了照顧到更多小夥伴,這裏儘可能寫的細點,對應的Activity/xml文件以下所示:
import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.EditText; import android.widget.TextView; public class TestActivity extends AppCompatActivity implements View.OnClickListener { private TextView textView; private EditText editText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); init(); } public void init(){ textView = (TextView) findViewById(R.id.textView); editText = (EditText) findViewById(R.id.editText); findViewById(R.id.btnText).setOnClickListener(this); } @Override public void onClick(View view) { int id = view.getId(); if (id == R.id.btnText) { textView.setText("Hello, " + editText.getText().toString() + "!"); } } }
<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context="com.example.testing.androidtest.TestActivity"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" /> </android.support.design.widget.AppBarLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <TextView android:id="@+id/textView" android:text="@string/hello_world" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <EditText android:hint="Enter your name here" android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/textView"/> <Button android:id="@+id/btnText" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Hello world!" android:layout_below="@+id/editText"/> </RelativeLayout> </android.support.design.widget.CoordinatorLayout>
作完以上工做後,咱們一塊兒來建立並運行Espresso測試。在module-name/src/androidTest/java/下建立TestActivityInstrumentationTest.java
測試類經過AndroidJUnitRunner運行,並執行button的onClick(View)方法。下面將逐行解釋都作了什麼:
- 首先,找到ID爲editText的view,輸入Peter,而後關閉鍵盤;
- 接下來,點擊Hello world!的View,咱們既可使用ID來找到一個控件,還能夠經過搜索它上面的文字來找到它;
- 最後,將TextView上的文本同預期結果對比,若是一致則測試經過;
你也能夠右鍵點擊域名運行測試,選擇Run> TestActivityInstrumentationTest...如圖8所示:
(圖8)
這樣就會在模擬器或者鏈接的設備上運行測試,你能夠在手機屏幕上看到被執行的動做(好比在EditText上打字)以下視頻所示。
最後會在Android Studio輸出經過和失敗的測試結果。
(圖9)
最後恭喜你,你也入門了。
更多內容敬請關注vivo 互聯網技術微信公衆號
注:轉載文章請先與微信號:Labs2020聯繫