亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

簡單談?wù)刟ndroid studio 的單元測試

 更新時間:2016年08月14日 10:53:32   作者:曾田生z  
昨天在完善項(xiàng)目的時候,需要進(jìn)行單元測試,在Eclipse環(huán)境中進(jìn)行是很簡單的,但是在Android Studio環(huán)境中進(jìn)行單元測試,在國內(nèi)找了很多資料,大都是人云亦云,本文發(fā)布出來供大家學(xué)習(xí)參考。

面對android studio Run 一次項(xiàng)目要等好幾分鐘的痛點(diǎn),不得不研究一下android studio 的單元測試。

其實(shí)我的目的很簡單,在不對視圖進(jìn)行操作的前提下,測試一些activity 的生命周期,或網(wǎng)絡(luò)拉取數(shù)據(jù)的一些處理,比如解析 json 數(shù)據(jù)啊,做網(wǎng)絡(luò)請求啊等等,也就是對 Model層的測試。這些不需要操作視圖,但在沒有單元測試環(huán)境下,比如我們網(wǎng)絡(luò)請求一些數(shù)據(jù),Log 打印看看是否請求成功,卻又要 利用模擬器或真機(jī)Run 一次項(xiàng)目,花費(fèi)好幾分鐘,這是不能容忍的。

于是乎,強(qiáng)大的 android studio 也考慮到了這一點(diǎn),給我們提供的簡單的單元測試類。

讓我們來簡單的了解學(xué)習(xí)一下吧。

首先先來了解一下一些名稱,方便下面介紹和使用:

在java中咱們有用過 JUnit 的 單元測試 ,那android 也是基于 java 語言編寫的,所以也有個 JUnit的單元測試。在做 android 的單元測試需要導(dǎo)入依賴:

androidTestCompile 'junit:junit:4.12'
testCompile 'junit:junit:4.12'

其中, test目錄為在本機(jī)執(zhí)行單元測試代碼的目錄, androidTest為在Android設(shè)備上執(zhí)行單元測試代碼的目錄。如下圖:

Android 自帶的 junit單元測試的一些測試類(androidTest測試 需要運(yùn)行在模擬機(jī)或真機(jī)上)

1、InstrumentationTestCase框架:

Instrumentation和Activity有點(diǎn)類似,只不過Activity是需要一個界面的,而Instrumentation并不是這樣的,我們可以將它理解為一種沒有圖形界面的,具有啟動能力的,用于監(jiān)控其他類(用Target Package聲明)的工具類。

舉個例子,利用InstrumentationTestCase 啟動一個activity:

在androidTest下新建一個java類,并且繼承自InstrumentationTestCase編寫一個public void的方法,但是必須要是方法名以test打頭,比如testPublishSubject,并不需要@Test注解

public class TestSubject extends InstrumentationTestCase {
  private static final String LOG_TAG = "test";
 
  public void testPublishSubject() {
 
    launchActivity("demo.zts.com.demo",SecondActivity.class,null);
  }
}

2、ApplicationTestCase——測試整個應(yīng)用程序的類。它允許你注入一個模擬的Context到應(yīng)用程序中,在應(yīng)用程序啟動之前初始化測試參數(shù),并在應(yīng)用程序結(jié)束之后銷毀之前檢查應(yīng)用程序。

使用Context,你可以瀏覽資源,文件,數(shù)據(jù)庫等等?;愂茿ndroidTestCase,一般常見的是它的子類,和特定組件關(guān)聯(lián)。

測試代碼如下:

public class MyApp extends Application {
  @Override
  public void onCreate() {
    super.onCreate();
    String app_name = getResources().getString(R.string.app_name);
    Log.i("MyApp",".........MyApp....app_name.........."+app_name);
  }
}
public class ApplicationTest extends ApplicationTestCase<MyApp> {
  public ApplicationTest() {
    super(MyApp.class);
  }
  public void testStart() {
    String str = null;
    str = mContext.getResources().getString(R.string.app_name);
    Log.i("..",".............ApplicationTest ...........app_name............."+str);
  }

Log 日志:

 07-22 23:27:10.276 32259-32259/demo.zts.com.demo I/MyApp: .........MyApp....app_name..........demo
 07-22 23:27:10.276 32259-32319/demo.zts.com.demo I/TestRunner: started: testStart(demo.zts.com.demo.ApplicationTest)
 07-22 23:27:10.286 32259-32319/demo.zts.com.demo I/..: .............ApplicationTest..........app_name..............demo

3、ActivityUnitTestCase——對單個Activity進(jìn)行單一測試的類。使用它,你可以注入模擬的Context或Application,或者兩者。它用于對Activity進(jìn)行單元測試。也就是說你可以用于測試單獨(dú)的activity ,雖然也需要利用模擬機(jī)或真機(jī)啟動,但你啟動的只是你需要做測試的activity,于其他activity無關(guān)。
測試代碼如下:

要測試的 activity

public class MainActivity extends AppCompatActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    System.out.println("...............MainActivity......onCreate............");
    Log.i("MainActivity","................onCreate............................");

  }
  @Override
  protected void onStart() {
    super.onStart();
    System.out.println("...............MainActivity......onStart............");
    Log.i("MainActivity","................onStart............................");
  }
  @Override
  protected void onStop() {
    super.onStop();
    System.out.println("...............MainActivity......onStop............");
    Log.i("MainActivity","................onStop............................");
  }
  @Override
  protected void onDestroy() {
    super.onDestroy();
    System.out.println("...............MainActivity......onDestroy............");
    Log.i("MainActivity","................onDestroy............................");
  }
}

測試類

public class TestActivity extends ActivityInstrumentationTestCase2<MainActivity> {

  private Context ctx;

  public TestActivity() {
    super(MainActivity.class);
  }

  @Override
  protected void setUp() throws Exception {
    super.setUp();
    ctx = getActivity().getApplicationContext();
  }

  public void testStart() {
    Intent intent = new Intent(ctx, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    ctx.startActivity(intent);
    Log.i("TestActivity","................startActivity............................");

  }

測試 Log 日志:

  * 07-22 23:39:44.146 3171-3171/demo.zts.com.demo I/System.out: ...............MainActivity......onCreate............
     07-22 23:39:44.146 3171-3171/demo.zts.com.demo I/MainActivity: ................onCreate............................
     07-22 23:39:44.151 3171-3171/demo.zts.com.demo D/MZPerfObserver: demo.zts.com.demo onCreate consume 153 ms
     07-22 23:39:44.151 3171-3171/demo.zts.com.demo I/System.out: ...............MainActivity......onStart............
     07-22 23:39:44.151 3171-3171/demo.zts.com.demo I/MainActivity: ................onStart............................
     07-22 23:39:44.326 3171-3171/demo.zts.com.demo D/OpenGLRenderer: Enabling debug mode 0
     07-22 23:39:44.361 3171-3171/demo.zts.com.demo I/System.out: ...............MainActivity......onStop............
     07-22 23:39:44.361 3171-3171/demo.zts.com.demo I/MainActivity: ................onStop............................
 
     07-22 23:39:44.421 3171-3224/demo.zts.com.demo I/TestActivity: ................startActivity............................

還有很多常見的測試,比如ServiceTestCase,ProviderTestCase2等,大家需要慢慢琢磨。

Android 自帶的 junit單元測試的一些測試類(test 測試 ,不需要模擬機(jī),電腦直接運(yùn)行)

比如我需要測試一段java代碼,而這段java代碼跟android沒關(guān)系,也就是不用到android的資源,如context,activity 等,說白了就是簡單的 java 測試,當(dāng)然,嘿嘿,android studio也是可以做java代碼測試的。

測試代碼如下,測試 4+4 等于幾:

public class ExampleUnitTest {
  @Test
  public void testAdd() {

    int i = 0;
    i = 4+4;
    System.out.print(".............. "+i);
    Log.i("TAG","..................."+i);
    // 比較 i 是否 等于 8 ,相等的話通過測試?。?!
    Assert.assertEquals(8, i);
  }
}

測試成功:

以上測試類的運(yùn)行是 -點(diǎn)擊測試右鍵 - 選擇 RunXXXXX

/*********************華麗分割線***********************/

看了半天好像也沒有解決文章最初提到的一個痛點(diǎn)啊,就是我需要測試android的資源,但又不想運(yùn)行笨重的模擬機(jī)或真機(jī),怎么辦呢? 媽蛋,被騙了,還錢 -_-、、、 確實(shí),上面提到的測試方法雖然沒有解決拜托模擬機(jī)測試的痛點(diǎn),但基于模擬機(jī)單元測試的 androidTest 確實(shí)方便我們做一些 單獨(dú)功能的測試,而且能做 UI 測試,因?yàn)樾枰M機(jī)或真機(jī)嘛,所以 UI 或視圖測試是沒問題的。 還有test 測試,可以做一些不需要android資源的 java代碼測試,也是在android開發(fā)當(dāng)中很方便的,不用在啟用eclipse 做測試,直接android studio 既可以了。

忽悠,接著 忽悠 -_-////

其實(shí)要想脫離 模擬機(jī)或真機(jī),又要做使用android資源的測試,如 使用Context,瀏覽資源,文件,數(shù)據(jù)庫等等。 也是可以的?。。?那 就只有第三方測試框架了 Robolectric

666,你是來做宣傳的嗎 -_-、、、不過真的很好用,也能很好的解決咱們的痛點(diǎn)。

接下來利用個需求來講解 Robolectric 測試,免得我忽悠你們。

拿到 android 目錄下的 assets 下的json01.txt文件 是一段json數(shù)據(jù),讓后進(jìn)行解析,解析后將數(shù)據(jù)顯示。 分析:這個需求就跟android下的資源有關(guān),而咱們利用 Robolectric 做單元測試,并且不需要模擬機(jī)或真機(jī)的支持。

其中json數(shù)據(jù)

{
 "name": "coolxing",
 "age": 24,
 "male": true,
 "address": {
  "street": "huiLongGuan",
  "city": "beijing",
  "country": "china"
 }
}

首先需要 Robolectric 依賴,在你的 app module 下注入依賴:

testCompile 'org.robolectric:robolectric:3.0'
注意是 testCompile 而不是 androidTestCompile ,不然你有需要啟動模擬器了。并且測試類也是 在 test 下的

測試類:

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
public class MainActivityTest2 {

  @Test
  public void testJson(){
    String str = null;
    str = RuntimeEnvironment.application.getResources().getString(R.string.app_name);

    AssetManager am = null;
    am = RuntimeEnvironment.application.getAssets();
    String strData = null;
    try {
      InputStream inputStream = am.open("json01.txt");
      byte buf[] = new byte[1024];
      inputStream.read(buf);
      strData = new String(buf);
      strData =strData.trim();
      strData.trim();
    } catch (IOException e) {

    }
    jsonBean foo = new Gson().fromJson(strData, jsonBean.class);
    System.out.println("...............json.................."+foo.name);
    System.out.println("...............json.................."+foo.address);
    System.out.println("...............json.................."+foo.age);
  }
}

測試結(jié)果:

看,咱們利用application 拿到 android 下的資源,但又不像剛才上面的 androidTestCompile 需要模擬機(jī),是不是很6,我電腦配置比較低,本次測試需要40S多,但不真機(jī)快多了。

am = RuntimeEnvironment.application.getAssets();

需要注意幾點(diǎn),類頭部需要聲明  @ 注解:

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)

并且測試方法是以 textxxx() 開頭的,如上面的 testJson() ,方法也需要@Test注解?。?!
Robolectric 還可以測試 activity ,如:

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
public class MainActivityTest2 {
  @Test
  public void testMainActivity() {

    MainActivity mainActivity = Robolectric.setupActivity(MainActivity.class);
    mainActivity.findViewById(R.id.main_tv).performClick();


    Intent expectedIntent = new Intent(mainActivity, SecondActivity.class);

    ShadowActivity openActivity = Shadows.shadowOf(mainActivity);
    Intent actualIntent = openActivity .getNextStartedActivity();

    // Assert.assertEquals(expectedIntent, actualIntent);

  }

其中

MainActivity mainActivity = Robolectric.setupActivity(MainActivity.class);

這句代碼就是啟動了MainActivity 的生命周期

Robolectric 單元測試類 的 啟動 也是跟 上面test 測試類一樣,選擇 -MainActivityTest2 --右鍵 -- 選擇 Run MainActivityTest2

好了,單元測試就介紹到這里,

其實(shí)我也只是初步理解,上面那些基本的也是我做項(xiàng)目的需要我才去學(xué)習(xí)使用的,還有好多強(qiáng)大的功能大家慢慢探索。

相關(guān)文章

  • Android實(shí)現(xiàn)音樂播放器鎖屏頁

    Android實(shí)現(xiàn)音樂播放器鎖屏頁

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)音樂播放器鎖屏頁,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Android編譯的注意事項(xiàng)

    Android編譯的注意事項(xiàng)

    今天小編就為大家分享一篇關(guān)于Android編譯的注意事項(xiàng),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Kotlin條件控制語句匯總講解

    Kotlin條件控制語句匯總講解

    條件控制是每門編程語言中必不可少的,一般就是使用我們所熟知的 ifelse ,來作為我們代碼邏輯選擇條件控制。 在 Java 中一般使用 ifelse 和 switch-case 來作為條件控制,而在 Kotlin 中則是使用 if-else 和 when 來作為條件控制
    2022-09-09
  • Android實(shí)現(xiàn)單頁面浮層可拖動view的一種方法

    Android實(shí)現(xiàn)單頁面浮層可拖動view的一種方法

    本篇文章主要介紹了Android實(shí)現(xiàn)單頁面浮層可拖動view的一種方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Flutter實(shí)現(xiàn)掃二維碼功能

    Flutter實(shí)現(xiàn)掃二維碼功能

    這篇文章主要為大家詳細(xì)介紹了Flutter實(shí)現(xiàn)掃二維碼功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Android自定義View實(shí)現(xiàn)仿1號店垂直滾動廣告條代碼

    Android自定義View實(shí)現(xiàn)仿1號店垂直滾動廣告條代碼

    這篇文章主要介紹了Android自定義View實(shí)現(xiàn)仿1號店垂直滾動廣告條代碼,實(shí)現(xiàn)步驟及實(shí)現(xiàn)原理本文給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2017-01-01
  • 詳解Android Studio如何導(dǎo)入第三方類庫、jar包和so庫

    詳解Android Studio如何導(dǎo)入第三方類庫、jar包和so庫

    這篇文章主要介紹了Android Studio如何導(dǎo)入第三方類庫、jar包和so庫的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Android實(shí)現(xiàn)顯示系統(tǒng)實(shí)時時間

    Android實(shí)現(xiàn)顯示系統(tǒng)實(shí)時時間

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)顯示系統(tǒng)實(shí)時時間,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • Android列表控件Spinner簡單用法示例

    Android列表控件Spinner簡單用法示例

    這篇文章主要介紹了Android列表控件Spinner簡單用法,結(jié)合實(shí)例形式分析了Android列表控件Spinner的布局與功能實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-12-12
  • Android編程實(shí)現(xiàn)Gallery中每次滑動只顯示一頁的方法

    Android編程實(shí)現(xiàn)Gallery中每次滑動只顯示一頁的方法

    這篇文章主要介紹了Android編程實(shí)現(xiàn)Gallery中每次滑動只顯示一頁的方法,涉及Android擴(kuò)展Gallery控件實(shí)現(xiàn)翻頁效果控制的功能,涉及Android事件響應(yīng)及屬性控制的相關(guān)技巧,需要的朋友可以參考下
    2015-11-11

最新評論