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

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

  • <strong id="5koa6"></strong>
  • 自動測試軟件的設計策略

    發表于:2014-08-13來源:uml.org.cn作者:Anpher Zhang點擊數: 標簽:
    我們的自動測試軟件無論是真的硬件性能的測試或者真的軟件功能模塊穩健性的測試,對我們來說都可以把她抽象成一個個獨立功能的Item(Process或者function),在每一項item里又會有其特定的執行過程,我們可以將這個過程抽象出一個個step,當然這些step對我們來說都是表象的step,沒必要去考慮每個step具體的運行環境和執行流程,畫個圖吧:

      在嵌入式領域和大型軟件領域,測試越來越彰顯其重要性,公司會投入更多的人力來從事測試工作,在人力成本上升的今天,自動測試軟件的需求開始變的越來越火,因為這顯然已經直接跟成本掛鉤了。

      今天寫這篇文章算是自己最近工作的一些感想和總結吧,可用于一些小型工程的自動測試軟件設計。

      首先來想一下自動測試軟件的工作的內容,即軟件需求。

      我們的自動測試軟件無論是真的硬件性能的測試或者真的軟件功能模塊穩健性的測試,對我們來說都可以把她抽象成一個個獨立功能的Item(Process或者function),在每一項item里又會有其特定的執行過程,我們可以將這個過程抽象出一個個step,當然這些step對我們來說都是表象的step,沒必要去考慮每個step具體的運行環境和執行流程,畫個圖吧:

      對于復雜的系統,每個item采用注冊機制是最好的,那需要新增一部分模塊,我們對于固定的item和固定的step的設計實現思路,即將他們放入一個固定的數組或鏈表中進行統一的處理。

      先闡述此軟件實現需系統提供的基礎:

      1)定時器,用于實現回調

      2)定位當前item是否進行step遞進的資源,如場景ID (Screen ID)或某索引ID等

      此處我們申請兩個定時器,一個用于item的切換,一個用于step的切換,我們這里用偽函數來描述。

      我們定義當前item索引為i,當前step索引為s,先闡述定時器的回調:

      void ItemHandler(void)

      {

      items[i].DeInit();

      i++;

      if(i>ItemNum)i=0;

      items[i].Init();//或者應命名為entry

      s=0;//reset step index

      }

      void StepHandler(void)

      {

      switch(i)

      {

      case ItemX:

      switch(s)

      {

      case StepX:

      {

      //do something let step going on

      s++;

      }

      break;

      ……

      }

      break;

      ……

      }

      }

      因為我們假設程序的運行對我們來說是黑盒的,所以下面我們增加timer的機制來增強整個軟件的健壯性。

      假設系統提供如下偽函數(假設time的單位為ms毫秒)

      //申請timer handle

      time_handle register_once_timer(int time_count,func callback_fun);

      //重啟timer handle,此函數用于避免重復申請導致資源消耗

      bool restart_once_timer(time_handle th, int time_count,func callback_fun);

      有上面的基礎,我們實現系統的主要函數:

      void ItemTimerStart(int time_count)

      {

      static time_handle ItemTimerId = 0;

      if(0 == ItemTimerId )

      {

      ItemTimerId = register_once_timer (time_count,(func)ItemHandler);

      }

      else

      {

      restart_once_timer (ItemTimerId, time_count,(func)ItemHandler);

      }

      }

      同理step的實現如下:

      void StepTimerStart(int time_count)

      {

      static time_handle StepTimerId = 0;

      if(0 == StepTimerId )

      {

      StepTimerId = register_once_timer (time_count,(func)StepHandler);

      }

      else

      {

      restart_once_timer (StepTimerId , time_count,(func)StepHandler);

      }

      }

      假設我們的step是使用screen id來進行判定的,并假設系統提供如下偽函數來獲取當前場景id int GetScreenID(void) ;

      以此和timer為基礎,優化上述handler如下:

      void ItemHandler(void)

      {

      ItemTimerStart(30*60*1000);//設定30分鐘超時,用于測試項出現不可預料異常不能正確完成時重啟測試項測試

      items[i].DeInit();

      i++;

      if(i>ItemNum)i=0;

      items[i].Init();//或者應命名為entry

      s=1;//reset step index

      }

      void StepHandler(void)

      {

      switch(i)

      {

      case ItemX:

      switch(s)

      {

      case StepX:

      {

      if(XXXX_ScreenID == GetScreenID())

      {//程序正確運行到此場景

    原文轉自:http://www.uml.org.cn/Test/201110273.asp

    老湿亚洲永久精品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>