<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經轉移至github,大家請訪問 http://qaseven.github.io/

    如何去設計測試用例

     個人理解大概從3個方面去考慮:
      1. 表單,也就是最基礎的功能;
      2. 邏輯方面;
      3. 業務流程。
      今天去面試,面試官問我一個很讓我說不清的問題,她問我如何寫好Expected Result,說實話當時聽到這個問題我有點茫然,我拼命的考慮如何去詮釋這個問題,事實上,這么多年工作,這么多年的測試用例中,我并未關注這個問題,一個好的Expected Result,個人認為就是和將要實現的功能或者是需求要完全匹配。今天由于個人原因精力也不是很集中,似乎頭腦處于空白時段,聽到耳朵的問題,似乎大腦不懂得去思考。對于今天的面試我并不滿意,但是今天面試官問我的一些問題,其實都很基礎也很簡單,但是細想起來似乎又不是很容易回答,嗨,總之是個失敗的面試!
      對于一個好的測試用例,無非就是三點:
      1.易用性:對于一個即熟悉測試工作,又熟悉被測應用的測試人員,應當可以花費很少的時間就可以理解測試用例中表達的測試思路,并可以很快的執行完這個測試用例。對于不熟悉測試工作,不熟悉被測應用的人來說,也完全可以參照著該測試用例執行下去。
      2.易維護性:當開發過程中的某些因素影響了測試需求,測試用例的作者或其他測試設計人員,應該可以花費很少的時間就完成定位并維護所有相關測試用例的工作。
      3.可重用性:一個好的測試用例要保證可以隨著版本的變化它始終保持可用狀態,不能因為版本的變更,導致測試用例無效或者冗余。

    posted @ 2014-07-29 09:07 順其自然EVO 閱讀(181) | 評論 (0)編輯 收藏

    配置管理起步

      1. 配置管理
      由于公司需求,以后需要兼職配置管理工作,雖然是兼職,也應該要專業一點,最近一段時間在網上搜集了各種資料,同時今天拿到了一本書,叫做《配置管理最佳實踐》。
      書不是很厚,在豆瓣上的評論不錯,據說是配置管理入門必讀,差不多和《軟件測試的藝術》一樣重要吧,希望讀過之后對于配置管理的工作能有一個更加系統的認識, 對于配置管理、變更管理、版本管理、構建管理、發布管理等方面的理解可以更深刻一些。
      PS:新知識學習渠道
      ——找老師:花半天時間在網上胡搜,試圖找到在這方面最權威最經典最完整的資料或教程
      ——實踐:了解基本技能,并實踐,出現問題后先解決基本問題,不要顧其他的。
      ——深入: 在知乎或豆瓣找評論、找觀點、找書。
      ——總結:總結,依照當前公司現狀,為當前工作制定最佳的配置管理流程。

    posted @ 2014-07-28 10:12 順其自然EVO 閱讀(149) | 評論 (0)編輯 收藏

    缺陷上報統一模板及缺陷管理流程

      1、前置條件 :要根據對測試理論及項目業務的理解呢,對缺陷的嚴重性和優先級有個清晰思路并進行正確的劃分。
      2、統一缺陷報告的模板:
      1)編號   2)所屬模塊 3)摘要/標題(用一句話描述BUG)
      4)測試環境 、操作步驟 、實際結果 、期望結果 、備注
      5)bug優先級、嚴重性 6)測試人  7)日期  8)bug狀態
      9)截圖
      3、缺陷的管理流程或bug的生命周期(假如:發現bug,但不知道相關的開發負責人)
      提交bug-----經理/組長審核(檢查描述、優先級與嚴重性是否符合)---
      --轉交給相關的開發人員----修復bug并反饋回執給相關測試人員--
      --回歸測試驗證是否修復----根據驗證結果更改bug狀態

    posted @ 2014-07-28 10:11 順其自然EVO 閱讀(403) | 評論 (0)編輯 收藏

    用存儲過程&DataFactory準備測試數據

     假設我們有以下2張表: student , detail_info 。(MySQL版本)
      其他detail_info的外鍵是name (也就是說detail_tail 中name的值要在student中有)
      < xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />
      現在準備需要往這兩張表中插入數據供測試時使用,
      方法一,手動插入
      必須選插入一條記錄到student中,然后再插入一條到detail_info,且name要在student中有。
      方法二,利用MySQL的存儲過程
      2.1 創建存儲過程 (一次插入一條數據)
      代碼塊
      create procedure pr_add
      (
      v_id int,           -- 打算插入的id
      v_name varchar(20)  –打算插入的name
      )
      begin
      INSERT INTO `student` VALUES (v_id, v_name, 'male', '20', '2011-08-16 22:05:45' );
      INSERT INTO `detail_info` VALUES (v_id, v_name, '2011-08-16', '13881954050', 'xinjiang');
      end;
      2.2 調用存儲過程
      查詢相應的表檢查
      1.3    深入一個,創建一個一次能插入多條數據的存儲過程
      代碼塊
      create procedure proc_add
      (
      number int     -- 打算新插入多少條數據
      )
      begin
      declare v_name varchar(20);
      declare v_i int;
      set v_i=0;
      select max(id) into v_i from student;   -- 獲得當前表中最大id,并存儲進變量v_i
      set number=v_i+number;                  -- 最大id
      set v_i=v_i+1;                          -- 插入的id從當前id+1開始
      while v_i<=number do                    -- 插入的id值從id+1 ~ number
      set v_name=concat('bill' , v_i );   -- 拼接name,因為name不能相同
      INSERT INTO `student` VALUES (v_i, v_name, 'male', '20', '2011-07-16' );
      INSERT INTO `detail_info` VALUES (v_i, v_name, '2011-08-16 22:05:45', '13881954050', 'xinjiang');
      set v_i=v_i + 1;
      end while;
      end;
      調用
    方法三,利用工具DataFactory
      ……
      數據驗證
      小結:
      利用存儲過程添加數據較方便,但需要自己編寫sql語句塊。有關mysql的存儲過程只在mysql5以后才能使用,詳細的介紹請參考網絡。
      DataFactory 在創建大數據量是更有優勢,但設置起來比較麻煩,需要對每個字段進行設置。有關DataFactory的詳細操作,如有興趣,可另外討論。這里只是介紹一下。

    posted @ 2014-07-28 10:10 順其自然EVO 閱讀(206) | 評論 (0)編輯 收藏

    Ubuntu下搭建Robotframework+Selenium環境

    最近已經從Windows系統轉到了Ubuntukylin下面,所以測試工具也需要重新安裝,今天就和大家分享下安裝過程。
      我使用的環境:Ubuntu Kylin 14.04 64位系統。
      開始了吧,首先還是要安裝Python,這里我用的是Python2.7,這個可以去官網下載,安裝過程這里就不再贅述了。
      我采用的是在線安裝:
      1、安裝pip,
      sudo apt-get install python-pip
      2、安裝robotframework,
      sudo pip install robotframework
      3、安裝selenium2library,
      sudo pip install robotframework-selenium2library
      4、安裝Wxpython ,
      sudo apt-get install python-wxgtk2.8 python-wxtools wx2.8-i18n
      5、安裝ride,
      sudo pip install robotframework-ride
      6、打開ride
      在終端里面輸入
      ride.py
      7、關于RFS的使用,請參考http://blog.csdn.net/xc5683/article/details/10017915

    posted @ 2014-07-28 10:08 順其自然EVO 閱讀(761) | 評論 (0)編輯 收藏

    Spirent TestCenter Application升級到2.4的問題處理

      Spirent TestCenter Application 升級到4.24之后,原來的ROBOT ATC 跑不過了。現象是兩個,
      1)提示TCL 版本不兼容;
      2)第2個端口上收不到包。
      索性趁這個機會重構了對外接口。
      1)RunSequencerDoCheckList :使用兩個預定的端口,分別作為user-side/uplink-side。完成測試步驟并檢查結果。
      ------ 單路功能性測試
      2)MultiPortRunsequencercheckList:使用更多預定端口,完成測試步驟并檢查結果。
      ------ 多路功能性測試
      3)CheckPKGdefinedTraffic:在多個預定端口中選一個作為user-side,按參數進行流量。
      ------ QOS功能性測試,可以覆蓋CCL/remark/policing/BAC/...
      下一個項目,就用這套腳本來做回歸了!

    posted @ 2014-07-28 10:04 順其自然EVO 閱讀(461) | 評論 (0)編輯 收藏

    Android開發和測試實踐—接入友盟統計

     這兩年一直在做無線的測試,后續還會繼續去做無線的測試,但是之前因為時間的原因一直都沒有非常仔細的了解到代碼層面。近期抽空自己做了些app的開發,決定如果想把移動的測試做好做深入,有一定的app開發經驗非常的有必要,因為只有這樣很多東西才能真正理解了。另一個方面,這本身也很有趣。目前嘗試的一些東西都還比較基礎,準備持續的做下去。
      實踐的過程也想陸續整理出來,做下筆記,也給別人一些參考,遇到很多問題的時候也是到谷歌度娘的找答案,幫助很多。目前更多關注android,ios的部分稍繼續。
      基本上現在任何一個實用的app都離不開埋點統計,否則應用撒出去就兩眼一抹黑了,也難以做運營和一些決策。為了進一步了解這一塊,除了看現有產品的做法(公司內部平臺),也想自己動手寫一下,加深理解,于是選擇了業界用得比較多的友盟平臺。
      統計的維度很多,不過最基本的新增用戶和啟動次數。關于這個,可能就需要涉及到Android的activity的生命周期和狀態改變。為了更好的理解,做了個簡單的代碼嘗試。
    protectedvoid onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.e(TAG,"enter onCreate”);
    }
    protectedvoid onStart() {
    super.onStart();
    Log.e(TAG,"onStart");
    }
    @Override
    protectedvoid onResume() {
    super.onResume();
    Log.e(TAG,"onResume");
    }
    @Override
    protectedvoid onPause() {
    super.onPause();
    Log.e(TAG,"onPause");
    }
      然后做了一些實驗:
      后面看友盟的sample code后發現也是基于這個來統計活躍用戶的。好了,下面記錄下接入友盟統計的過程。
      首先,需要在AndroidManifest.xml中添加權限和一些配置,主要是appkey,這個在友盟網站注冊好賬號之后添加應用就可以獲取到,Channel ID是自己來定義。
    <uses-permissionandroid:name="android.permission.INTERNET"/>
    <uses-permissionandroid:name=“android.permission.ACCESS_NETWORK_STATE" />
    <uses-permissionandroid:name=“android.permission.READ_PHONE_STATE" />
    ……
    <meta-dataandroid:value=“535f487******"android:name="UMENG_APPKEY"></meta-data>
    <meta-dataandroid:value="Test001"android:name="UMENG_CHANNEL”/>
    </application>
      然后在activity里面添加對應的代碼,MobclickAgent class。
    import com.umeng.analytics.MobclickAgent;
    protectedvoid onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MobclickAgent.updateOnlineConfig(this);
    }
    protectedvoid onResume() {
    super.onResume();
    Log.e(TAG,"onResume");
    MobclickAgent.onResume(mContext);
    }
    protectedvoid onPause() {
    super.onPause();
    Log.e(TAG,"onPause");
    MobclickAgent.onPause(mContext);
    }
      但是在Eclipse里面做完這一步之后發現還是遇到錯誤,一執行到MobclickAgent的語句就異常了,如下面。官方文檔只是提到上面的步驟。
      解決方案是把umeng的jar包放到工程的libs目錄下。
      接下來,App跑起來,幾分鐘之后就可以看到數據了。
      啟動次數這里因為是通過onResume()統計的, 所以有一些細節需要注意,看是否需要調整。
      可以看到渠道的結果,就是之前在AndroidManifest.xml里面配置的。
      設備的一些信息目前不能查看當天的結果,要第二天來看,還是比較準確的。
      需要把umeng的jar包加到工程里面。 另外也試驗了下自定義的Event。我的demo app里面有兩段訪問HTTP接口的地方,分別通過Apache HttpClient和Android HttpClient,想統計下調用次數以及響應時間。
      在調用前后埋上對應的代碼。
      MobclickAgent.onEventBegin(this,"Android_http_visit”);
      MobclickAgent.onEventEnd(this,"Android_http_visit");
      總體來說,基本統計功能還不錯,開發也很方便,比之前想象的要方便很多。但是結合我們實際產品用的自研BI工具的數據分析,以及和朋友了解到大規模實際使用的情況,一些偏應用層面的功能還不是特別夠用。比如詳細的用戶訪問路徑方面。
      下面能給出一些基本的模型。但是如果是產品和運營要做非常細致的分析還需要自己做一些工作。
      漏斗模型等因為demo app太簡單還沒來得及繼續深入了解。這樣了解下來發現再去讀實際產品的運營數據,會感覺更容易理解一點。

    posted @ 2014-07-28 09:58 順其自然EVO 閱讀(302) | 評論 (0)編輯 收藏

    Android下Protobuff框架性能測試結果

      android 下Protobuff常用的框架有三個: protobuff自身,  square出的wire , protostuff
      由于protobuff會為每個屬性生成大量不常用的方法,當程序比較復雜時容易超過android的60K個方法的上限, 所以本次測試未包括protobuff
      測試邏輯是循環100次序列化100個元素的數組,并反序列化,求平均值,代碼如下:
      wire的測試代碼:
    public void onClickButton(View view){
    if (TestTask.isCancel){
    TestTask.isCancel = false;
    TestTask.sumDeserializeTime = 0;
    TestTask.sumTime = 0;
    TestTask.runCount = 0;
    TextView text1 = (TextView) findViewById(R.id.textView2);
    text1.setText("");
    new TestTask( (TextView) findViewById(R.id.textView2)
    , (TextView) findViewById(R.id.button1)).execute();
    ((TextView)view).setText("測試中,點擊中斷");
    }else{
    ((TextView)view).setText("正在中斷...");
    TestTask.isCancel = true;
    }
    }
    static class TestTask extends AsyncTask<Void,Void,Long>{
    long serializeTime=0;
    long deserializeTime=0;
    static long sumTime=0;
    static long sumDeserializeTime=0;
    static int runCount=0;
    static boolean isCancel=true;
    TextView text1;
    TextView btn;
    public TestTask(TextView text1,TextView btn) {
    this.text1 = text1;
    this.btn = btn;
    }
    @Override
    protected Long doInBackground(Void... params) {
    long startTime = System.currentTimeMillis();
    for (int i = 0; i < 100; i++) {
    List<ListItem> itemList = new ArrayList<ListItem>();
    ListItem.Builder itemBuilder = new ListItem.Builder();
    ListItem item;
    for (int j = 0; j < 100; j++) {
    item = itemBuilder.title("test Title"+i+":"+j)
    .remark("test Remark"+i+":"+j)
    .coverUrl("http://pic.ozreader.com/abc.pic")
    .uri("PKB:TESTURI")
    .build();
    itemList.add(item);
    }
    ScrollList.Builder listBuilder= new ScrollList.Builder();
    ScrollList list = listBuilder.haveMore(false).tags(itemList).build();
    byte[] dataBuffer = list.toByteArray();
    serializeTime = System.currentTimeMillis()-startTime;
    Wire wire = new Wire();
    try {
    ScrollList resultList = wire.parseFrom(dataBuffer, ScrollList.class);
    if (resultList == null){
    Log.e("TEST", "resultList is null");
    break;
    }else if (resultList.tags == null){
    Log.e("TEST", "resultList.tags is null");
    break;
    }else if (resultList.tags.size() <= 0){
    Log.e("TEST", "resultList.tags is empty");
    break;
    }else if (resultList.tags.size() != 100){
    Log.e("TEST", "resultList.tags is wrong");
    break;
    }else if (!resultList.tags.get(0).uri.equals("PKB:TESTURI")){
    Log.e("TEST", "resultList.tags content is wrong");
    break;
    }
    deserializeTime = System.currentTimeMillis()-startTime-serializeTime;
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    return System.currentTimeMillis() - startTime;
    }
    @Override
    protected void onPostExecute(Long result) {
    sumTime += result;
    sumDeserializeTime += deserializeTime;
    runCount ++;
    text1.append("result:"+result+", serializeTime:"+serializeTime+", deserializeTime:"+deserializeTime+", runCount:"+runCount+", avg:"+sumTime/runCount+", avg deserializeTime:"+sumDeserializeTime/runCount+"\n");
    if (isCancel){
    text1.append("測試中斷.");
    btn.setText("開始測試");
    }else if (runCount < 100){
    new TestTask(text1,btn).execute();
    }else{
    isCancel = true;
    text1.append("測試完成.");
    btn.setText("開始測試");
    }
    }
    }
    protobuff的測試代碼:
    public void onClickButton(View view){
    if (TestTask.isCancel){
    TestTask.isCancel = false;
    TestTask.sumDeserializeTime = 0;
    TestTask.sumTime = 0;
    TestTask.runCount = 0;
    TextView text1 = (TextView) findViewById(R.id.textView2);
    text1.setText("");
    new TestTask( (TextView) findViewById(R.id.textView2)
    , (TextView) findViewById(R.id.button1)).execute();
    ((TextView)view).setText("測試中,點擊中斷");
    }else{
    ((TextView)view).setText("正在中斷...");
    TestTask.isCancel = true;
    }
    }
    static class TestTask extends AsyncTask<Void,Void,Long>{
    long serializeTime=0;
    long deserializeTime=0;
    static long sumTime=0;
    static long sumDeserializeTime=0;
    static int runCount=0;
    static boolean isCancel=true;
    TextView text1;
    TextView btn;
    public TestTask(TextView text1,TextView btn) {
    this.text1 = text1;
    this.btn = btn;
    }
    @Override
    protected Long doInBackground(Void... params) {
    long startTime = System.currentTimeMillis();
    for (int i = 0; i < 100; i++) {
    List<ListItem> itemList = new ArrayList<ListItem>();
    ScrollList list = new ScrollList();
    list.setHaveMore(false);
    list.setTagsList(itemList);
    ListItem item;
    for (int j = 0; j < 100; j++) {
    item = new ListItem();
    item.setTitle("test Title"+i+":"+j);
    item.setRemark("test Remark"+i+":"+j);
    item.setCoverUrl("http://pic.ozreader.com/abc.pic");
    item.setUri("PKB:TESTURI");
    itemList.add(item);
    }
    LinkedBuffer buffer = LinkedBuffer.allocate(1024);
    byte[] dataBuffer = ProtobufIOUtil.toByteArray(list, ScrollList.getSchema(), buffer);
    serializeTime = System.currentTimeMillis()-startTime;
    ScrollList resultList = new ScrollList();
    ProtobufIOUtil.mergeFrom(dataBuffer, resultList, ScrollList.getSchema());
    if (resultList.getTagsList() == null){
    Log.e("TEST", "resultList.tags is null");
    break;
    }else if (resultList.getTagsList().size() <= 0){
    Log.e("TEST", "resultList.tags is empty");
    break;
    }else if (resultList.getTagsList().size() != 100){
    Log.e("TEST", "resultList.tags is wrong");
    break;
    }else if (!resultList.getTagsList().get(0).getUri().equals("PKB:TESTURI")){
    Log.e("TEST", "resultList.tags content is wrong");
    break;
    }
    deserializeTime = System.currentTimeMillis()-startTime-serializeTime;
    }
    return System.currentTimeMillis() - startTime;
    }
    @Override
    protected void onPostExecute(Long result) {
    sumTime += result;
    sumDeserializeTime += deserializeTime;
    runCount ++;
    text1.append("result:"+result+", serializeTime:"+serializeTime+", deserializeTime:"+deserializeTime+", runCount:"+runCount+", avg:"+sumTime/runCount+", avg deserializeTime:"+sumDeserializeTime/runCount+"\n");
    if (isCancel){
    text1.append("測試中斷.");
    btn.setText("開始測試");
    }else if (runCount < 100){
    new TestTask(text1,btn).execute();
    }else{
    isCancel = true;
    text1.append("測試完成.");
    btn.setText("開始測試");
    }
    }
    }
      測試結果為(單位豪秒):
      手機環境:魅族MX2
      1) wire 1.5.1 ,網址 https://github.com/square/wire
      avg: 1860~1907 , 最小值約為1500左右,極少出現, 全過程隨機分布
      avg deserializeTime: 9~10, 最小值約為5,極少出現,全過程隨機分布
      2) protostuff 1.0.8 ,網址 https://code.google.com/p/protostuff/
      avg: 1100~1150,非常穩定 , 最小值約為450左右,主要集中在前幾次循環,循環10次后就穩定在11XX左右,偶有600~800的情況,多次重復測試情況基本一致,觀察自動GC并無內存泄漏的問題, 暫時不確定速度變化的原因.
      avg deserializeTime: 6, 最小值約為3,極少出現,主要集中在剛開始,絕大多數為5,偶有達到16的情況.
      分析: wire的性能明顯比不上protostuff, 速度也不太穩定,起落較大.  考慮到protostuff的開發模式是普通的pojo方式,比較方便,不像protobuff和wire的builder方式,超麻煩. 所以最終推薦不是邏輯超復雜的企業app都使用protostuff .

    posted @ 2014-07-28 09:34 順其自然EVO 閱讀(1878) | 評論 (0)編輯 收藏

    使用jenkins+Emma統計Android客戶端單元測試覆蓋率

      這兩天看了一下統計Android單元測試代碼覆蓋率的知識,看了一下比較簡單。
      代碼覆蓋率的作用主要是用來查看測試用例執行完畢后,有哪些代碼尚未覆蓋到,未覆蓋到的代碼通常意味著未覆蓋到的功能或場景,選用的開源軟件Emma。
      第一步:把被測工程生成Ant build文件,andriod-app就是工程名
      android update project -p android-app
      第二步:將andriod測試工程也轉換成ant工程,-m選項指定了測試工程對應的主andriod工程的位置,而android-test就是測試工程名:
      android update test-project -m ../android-app -p android-test
      第三步:執行下面的命令,編譯、執行單元測試、收集覆蓋率:
      ant clean emma debug install test
      在jenkins 上部署:
      1. 下載Emma Line Coverage Column插件并安裝。
      2. 在jenkins 上配置上邊三步命令。如圖:
      3. 構建完成后,配置使用插件展示出報告,如圖:
      4. 展示結果如圖:
      備注:
      1. 被測試工程的要是調試版本,即Android manifest里面android:debuggable="true"
      2. 手機要有root權限。

    posted @ 2014-07-28 09:34 順其自然EVO 閱讀(728) | 評論 (0)編輯 收藏

    CTS添加新測試用例步驟

      一、CTS添加新測試用例
      前言:
      google源代碼中的cts測試用例集目錄為:source_android4.2/cts/tests/tests/ (source_android4.2表示android4.2代碼存放路徑),該目錄下有一個測試用例集example文件夾;下面就以這個用例集為例,講述怎樣編寫自己的cts測試用例集;
      結構如下:
      example
      ├── AndroidManifest.xml
      ├── Android.mk
      └── src
      └── android
      └── example
      ├── cts
      步驟:
      1、    在cts/tests/tests/目錄下創建一個自己的用例集(文件夾)名稱XXX;
      2、    在該文件夾中構建如下結構:
      XXX
      ├── AndroidManifest.xml(可以拷貝example下該文件)
      ├── Android.mk(可以拷貝example下該文件)
      └── src
      └── android
      └──XXX
      └── cts
      3、    編寫測試代碼
      前提:
      判斷測試的接口或類是屬于修改了原生代碼中的哪個包下面的類(可以參考google文檔:http://developer.android.com/intl/zh-CN/reference/packages.html);
      然后在source_android4.2/cts/tests/tests/目錄下找到對應的測試包,參考其代碼的編寫;
      具體操作:
      在src/android/XXX/cts目錄下添加自己的用例;(XXX為自己的測試用例集的名稱,例如:yunos)
      細節說明:
      1、google官方cts測試用例中,對一個類進行測試時,并沒有對該類的所有方法進行測試,而是測試了該類中使用最頻繁的一些方法;所以我們自己編程測試用例時,也可以按照這樣的原則進行操作;
      2、對于“窗口控件類”中使用的的res資源文件的目錄在source_android4\cts\tests\res
      3、最好是在eclipse中編寫,需要res文件的,可以先拷貝到當前工程下,這樣可以通過eclipse檢查編程中的語法錯誤;
      4、包名的格式:package android.XXX.cts;
      4、    修改XXX/目錄下的Android.mk文件
      LOCAL_PACKAGE_NAME := CtsXXXTestCases(這個變量是定義自己的測試用例集的名稱;編譯后會生成同名的APK文件)
      LOCAL_INSTRUMENTATION_FOR := CtsTestStubs(這個變量定位的是一些涉及到虛擬機的測試用例,使用junit框架;TestStubs這個類在目錄cts\tools\vm-tests-tf\src\dot\junit\opcodes下)
    5、修改XXX/目錄下的AndroidManifest.xml文件
      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.android.cts.XXX">
      <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
      <application>
      <uses-library android:name="android.test.runner" />
      <activity android:name=”android.XXX.cts.activity的名稱”/>(說明:這個是測試activity時容易忽略的地方)
      </application>
      <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
      android:targetPackage="com.android.cts.stub"
      android:label="CTS tests of android.XXX"/>
      </manifest>
      6、修改source_android4.2/cts目錄下的CtsTestCaseList.mk;(重要)
      在該文件中給變量cts_test_packages追加自己測試用例集名稱CtsXXXTestCases
      說明:該文件在編譯的時候會被build/core/tasks/cts.mk調用,生成最終的CTS包。
      對CtsTestCaseList.mk文件說明:
      CTS_COVERAGE_TEST_CASE_LIST(核心變量)
      ├── cts_support_packages(該變量包含的是測試依賴的一些用例,其對于代碼目錄為cts/hostsidetests)
      ├──CtsAccelerationTestStubs \
      ├──CtsDelegatingAccessibilityService \
      ├──CtsDeviceAdmin \
      ├──CtsMonkeyApp \
      ├──CtsMonkeyApp2 \
      ├──CtsSomeAccessibilityServices \
      ├──CtsTestStubs \
      ├──SignatureTest \
      ├──TestDeviceSetup \
      ├──$(cts_security_apps_list)
      ├── cts_test_packages(該變量對應的是cts/tests/tests/目錄下的測試用例)
      二、編譯自己的cts包
      執行make  cts  -j4
      三、在真機上進行測試
      由于完整進行cts測試要很長時間,所以我們可以自己創建一個測試計劃,步驟如下:
      1、將cts包解壓,在android-cts\repository\plans下創建一個名為XXX的xml文件;
      2、這個xml文件格式為:
      <?xml version="1.0" encoding="UTF-8"?>
      <TestPlan version="1.0">
      <Entry uri="android.XXX"/>
      </TestPlan>
      3、進行cts測試時執行run  cts  -- plan  XXX

    posted @ 2014-07-28 09:32 順其自然EVO 閱讀(2612) | 評論 (0)編輯 收藏

    僅列出標題
    共394頁: First 上一頁 77 78 79 80 81 82 83 84 85 下一頁 Last 
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲日韩国产精品无码av| 亚洲Aⅴ在线无码播放毛片一线天 亚洲avav天堂av在线网毛片 | 亚洲精品国产自在久久| 日韩精品在线免费观看| 亚洲三级中文字幕| 免费国产草莓视频在线观看黄| 久久亚洲国产成人精品无码区| 8x8×在线永久免费视频| 国产亚洲精品无码成人| 精品久久久久久久久免费影院| 国产精品亚洲色婷婷99久久精品| 可以免费看黄的网站| 成年大片免费视频播放一级| 国产精品二区三区免费播放心| 中国内地毛片免费高清| 亚洲精品无码国产| 毛片免费观看视频| 亚洲国产精品人久久电影| 亚洲AV中文无码乱人伦| 猫咪免费观看人成网站在线| 久久久亚洲裙底偷窥综合| 亚洲AV无码一区二区三区国产| 久久国产色AV免费看| 十八禁的黄污污免费网站| 一区二区亚洲精品精华液| 久久亚洲AV无码精品色午夜麻| 中文字幕日本人妻久久久免费| 亚洲爆乳无码一区二区三区| 超pen个人视频国产免费观看| 99ee6热久久免费精品6| 亚洲天堂一区二区三区| 日本亚洲国产一区二区三区| 久久久久久AV无码免费网站 | 天堂亚洲免费视频| 亚洲日本国产综合高清| 亚洲福利视频一区| 亚洲精品国产精品乱码不卡√| 免费国产一级特黄久久| 99在线视频免费观看| 久久精品蜜芽亚洲国产AV| 久久久久久久久免费看无码|