• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • Android單元測試在蘑菇街支付金融部門的實踐(4)

    發表于:2016-06-12來源:推酷作者:鄒小創點擊數: 標簽:單元測試
    public void onSuccess(Object data) { mBus.post(new DataLoadedEvent(data)); } @Override public void onFailure(int code, String msg) { mBus.post(new DataLoadedEvent(code, msg)); } }); } } 這里,Check

      public void onSuccess(Object data) {

      mBus.post(new DataLoadedEvent(data));

      }

      @Override

      public void onFailure(int code, String msg) {

      mBus.post(new DataLoadedEvent(code, msg));

      }

      });

      }

      }

      這里,CheckoutActivity里面的mCheckoutModel、CheckoutModel里面的mApi、CheckoutModel里面的mBus,都是通過Dagger2注入進去的。在做單元測試的時候,這些都是mock。

      對于這個流程,我們做了如下的單元測試:

      CheckoutActivity啟動單元測試:通過Robolectric提供的方法,啟動一個Activity。驗證里面的mCheckoutModel的loadCheckoutData()方法得到了調用,同時參數(訂單ID等)是對的。

      CheckoutModel的loadCheckoutData單元測試1:調用CheckoutModel的loadCheckoutData()方法,驗證里面的mApi對應的get方法得到了調用,同時參數是對的。

      CheckoutModel的loadCheckoutData單元測試2:mock Api類,指定當它的get方法在收到某些調用的時候,直接調用傳入的callback的onSuccess方法,然后調用CheckoutModel的loadCheckoutData()方法,驗證Otto bus的post方法得到了調用,并且參數是對的。

      CheckoutModel的loadCheckoutData單元測試3:mock api類,指定當它的get方法在收到某些調用的時候,直接調用傳入的callback的onFailure方法,然后調用CheckoutModel的loadCheckoutData()方法,驗證Otto bus的post方法得到了調用,并且參數是對的。

      CheckoutActivity的onCheckoutDataLoaded單元測試1:啟動一個CheckoutActivity,調用他的onCheckoutDataLoaded(),傳入含有正確數據的Event,驗證相應的數據view顯示出來了

      CheckoutActivity的onCheckoutDataLoaded單元測試2:啟動一個CheckoutActivity,調用他的onCheckoutDataLoaded(),傳入含有錯誤信息的Event,驗證相應的錯誤提示view顯示出來了。

      這里需要說明的一點是,上面的每一個測試,都是獨立進行的,不是說下面的單元測試依賴于上面的?;蛘哒f必須先做上面的,再做下面的。

      這部分較為詳細的代碼放在github上,groupshare這個package里面。

      其他的問題

      以上就是我們這邊做單元測試用到的技術,以及一個基本流程,下面聊聊其他的幾個問題。

      哪些東西需要測試呢?

      所有的Model、Presenter/ViewModel、Api、Utils等類的public方法

      Data類除了getter、setter、toString、hashCode等一般自動生成的方法之外的邏輯部分

      自定義View的功能:比如set data以后,text有沒有顯示出來等等,簡單的交互,比如click事件,負責的交互一般不測,比如touch、滑動事件等等。

      Activity的主要功能:比如view是不是存在、顯示數據、錯誤信息、簡單的點擊事件等。比較復雜的用戶交互比如onTouch,以及view的樣式、位置等等可以不測。因為不好測。

      CI和code coverage: Jacoco

      要把單元測試正式化,CI是非常重要的一步,我們有一個運行Jenkins的CI server,每次開發者push代碼到master branch的時候,會運行一次單元測試的gradle task,同時使用Jacoco做code coverage。

      這里有個坑要特別注意,那就是項目里面的gradle Jacoco插件和Jenkins的Jacoco插件的兼容性問題。我們用的gradle Jacoco插件是7.1,更高版本的好像有問題。然后對應的Jenkins的Jacoco插件需要1.0.19或更低版本的,更高版本的jenkins plugin不支持低版本的gradle Jacoco項目版本。實際上,這點在Jenkins的Jacoco插件首頁就有說明:

      但是我當時沒注意,所以覆蓋率數據一直出不來,折騰了好一會,最后還是在同事的幫助下找到問題了。

      遇到的坑,以及好的practice建議

      接下來講講我們遇到的一些坑,以及一些好的practice建議。

      1. Native libary

      無論是純JUnit還是Robolectric,都不支持load native library,會報UnsatisfiedLinkError的錯。所以如果你的被測代碼里面用到了native lib,那么可能需要給System.loadLibrary加上try catch。

      如果是被測代碼用到的第三方lib,而里面用到了native lib的話,一般有兩種解決辦法,一種是將用到native lib的第三方類外面自己在包一層,然后在測試的情況下mock掉。第二種是用Robolectric,給那個類創建一個shadow class。

      第一種方法的好處是可以在測試的時候隨時改變這個類的返回值或行為,缺點是需要另外創建一個wrapper類,會有點繁瑣。第二種方式不能隨時改變這個類的行為,但是寫起來非常簡單。所以,看自己的需要,選擇相應的方法。

    原文轉自:http://www.jianshu.com/p/9f7a992fe9ec

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>