Android 3分鐘帶你入門開發測試

vivo網際網路技術發表於2020-09-24

作者:Zhu Yifei

作為一名合格的開發人員,基本的開發測試能力必不可少,開發測試分單元測試和UI測試,透過開發測試可以減少開發人員自測時間,提升開發質量。本篇文章可以幫助初級開發人員快速瞭解開發測試,快速上手測試編碼。本篇文章同樣適用於應用軟體初級測試工程師,快速上手編碼測試用例。

一、Android 3分鐘帶你入門開發測試

在正式學習Android應用測試之前,我們先來了解以下幾個概念。

1、JUnit

JUnit是一個Java語言的單元測試框架。

2、Instrumentation

該框架基於JUnit,因此既可以直接使用Junit 進行測試。又其為Android 應用的每種元件提供了測試基類,因此也可以使用Instrumentation 來測試Android 元件。

Instrumentation和Activity有點類似,只不過Activity是需要一個介面的,而Instrumentation並不是這樣的,我們可以將它理解為一種沒有圖形介面的,具有啟動能力的,用於監控其他類(用Target Package宣告)的工具類。

3、Espresso

自動化測試使用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所示:

Android 3分鐘帶你入門開發測試

(圖1-1)

新增一個新測試

在寫單元測試之前,務必確定gradle中做好相應的配置。如圖1-2所示:

Android 3分鐘帶你入門開發測試

(圖1-2)

接下來就正式入門啦,表激動,一步步來會很簡單哦~

1、建立一個本地單元測試

第一步 :開啟包含您想測試的程式碼的 Java 檔案。如Calculator.java。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
* [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)。

Android 3分鐘帶你入門開發測試

(圖2)

選擇create test如圖3所示,並選擇setUp/@Before和需要測試的方法,然後點選OK。

Android 3分鐘帶你入門開發測試

(圖3)

在 Choose Destination Directory 對話方塊中,點選與您想建立的測試型別對應的源集:androidTest 對應於儀器測試,test 對應於本地單元測試。然後點選 OK。如圖4所示:

Android 3分鐘帶你入門開發測試

(圖4)

這時在module-name/src/test/java/下出現了CalculatorTest.java。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* [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()'。

Android 3分鐘帶你入門開發測試

(圖5)

於是一個本地單元測試就完成啦,是不是比較簡單呢?

2、建立一個Espresso測試

在建立測試之前,我們建立一個待測試的TestActivity.java,新增一下簡單的互動。在EditText中輸入任意字串,點選Button在TextView中顯示出來,如圖6、7所示:

Android 3分鐘帶你入門開發測試

(圖6)

Android 3分鐘帶你入門開發測試

(圖7)

 

為了照顧到更多小夥伴,這裡儘量寫的細點,對應的Activity/xml檔案如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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() +  "!" );
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?xml version= "1.0"  encoding= "utf-8" ?>
<android.support.design.widget.CoordinatorLayout xmlns:android= "
xmlns:app= "
xmlns: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)方法。下面將逐行解釋都做了什麼:

  1. 首先,找到ID為editText的view,輸入Peter,然後關閉鍵盤;
  2. 接下來,點選Hello world!的View,我們既可以使用ID來找到一個控制元件,還可以透過搜尋它上面的文字來找到它;
  3. 最後,將TextView上的文字同預期結果對比,如果一致則測試透過;

你也可以右鍵點選域名執行測試,選擇Run> TestActivityInstrumentationTest...如圖8所示:

Android 3分鐘帶你入門開發測試

(圖8)

這樣就會在模擬器或者連線的裝置上執行測試,你可以在手機螢幕上看到被執行的動作(比如在EditText上打字)如下影片所示。


最後會在Android Studio輸出透過和失敗的測試結果。

Android 3分鐘帶你入門開發測試

(圖9)

最後恭喜你,你也入門了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69912579/viewspace-2722922/,如需轉載,請註明出處,否則將追究法律責任。

相關文章