Uiautomator--斷言的使用


一、斷言函數的使用
1、用例結構:
  自動化用例結構,一般可以分成一個用例集,然后用例集下面會有非常多的用例組成,我們可以從多個用例中抽出一些用例組成測試套件。
2、用例的標准結構:
  setUp:初始化
  Test:
    初始化場景與數據
    模擬操作步驟
    斷言(一個完整的測試用例必須要有一個斷言,作為標准來判斷用例成功或失敗)
    恢復場景
  tearDown
3、JAVA錯誤類型
  1)Error:
  一般是指與虛擬機相關的問題,如系統崩潰,虛擬機錯誤,內存空間不足,方法調用棧溢出等。對於這類錯誤導致的應用程序中斷,僅靠程序本身無法恢復和預防(斷言失敗屬於Error)
  2)Exeeption:
  表示程序可以處理的異常,可以捕獲且可能恢復。遇到這類異常,應該盡可能處理異常,使程序恢復運行,而不應該隨意終止異常(uiautomator中最常見的是UI對象找不到的異常)
  3)失敗與錯誤的區別
  失敗:用例失敗,不通過,不可恢復。
  錯誤:腳本中編寫錯誤,可以恢復,可以捕獲,可以運行。用try()catch處理,可以繼續運行下去,也可以往方法體拋。
 
二、斷言函數API解說
 
1、相關API--Equal
方法 說明
assertEquals(boolean,boolean) 如果期望(expected)和實際(actual)相等則通過,否則失敗
assertEquals(String,boolean,boolean) 如果期望(expected)和實際(actual)相等則通過,否則失敗
assertEquals(byte,byte) 如果期望(expected)和實際(actual)相等則通過,否則失敗
assertEquals(String,byte,byte) 如果期望(expected)和實際(actual)相等則通過,否則失敗
assertEquals(char,char) 如果期望(expected)和實際(actual)相等則通過,否則失敗
assertEquals(String,char,char) 如果期望(expected)和實際(actual)相等則通過,否則失敗
assertEquals(int,int) 如果期望(expected)和實際(actual)相等則通過,否則失敗
assertEquals(String,int,int) 如果期望(expected)和實際(actual)相等則通過,否則失敗
assertEquals(long,long) 如果期望(expected)和實際(actual)相等則通過,否則失敗
assertEquals(String,long,long) 如果期望(expected)和實際(actual)相等則通過,否則失敗
assertEquals(Object,Object) 如果期望(expected)和實際(actual)相等則通過,否則失敗
assertEquals(String,Object,Object) 如果期望(expected)和實際(actual)相等則通過,否則失敗
assertEquals(short,short) 如果期望(expected)和實際(actual)相等則通過,否則失敗
assertEquals(String,short,short) 如果期望(expected)和實際(actual)相等則通過,否則失敗
assertEquals(String,String) 如果期望(expected)和實際(actual)相等則通過,否則失敗
assertEquals(String,String,String) 如果期望(expected)和實際(actual)相等則通過,否則失敗

  

//斷言兩個對象是否相等
static public void asserEquals(String message,Object expected,Object actual){ //判斷兩個都為空,則相等
    if (expected==null && actual==null){ return ; } //判斷兩個相等
    if (expected!=null && expected.equals(actual)){ return } //如果以上都不符合,直接拋出異常
 failNotEquals(message,expected,actual); }
public void testDemo1() throws UiObjectNotFoundException{ //斷言相等的例子
    assertEquals(5, add(2,3)); //斷言不相等的例子
    assertEquals(6, add(2,3)); } //新建一個加法方便使用斷言函數
public int add(int a,int b){ return a+b; }
注意:
  所以的斷言函數都是靜態類型
參數說明:
  message:可選消息,在斷言失敗后會拋出這個消息
  expected:期望對象
  actual:實際對象
 
2、相關API--浮點運算
方法 說明
assertEquals(double,double,double) 如果期望(expected)和實際(actual)相差不超過精度值(delta)則通過,否則失敗
assertEquals(String,double,double,double) 如果期望(expected)和實際(actual)相差不超過精度值(delta)則通過,否則失敗
assertEquals(float,float,float) 如果期望(expected)和實際(actual)相差不超過精度值(delta)則通過,否則失敗
assertEquals(String,float,float,float) 如果期望(expected)和實際(actual)相差不超過精度值(delta)則通過,否則失敗
浮點運算不是萬全精確的,所以比較浮點數值的時候引入精確程度assertEquals(double expected,double actual,double delta)
public void testDemo1() throws UiObjectNotFoundException{ //斷言不相等的例子
    assertEquals(0.3333, Double.valueOf(1)/3,0); //斷言相等的例子
    assertEquals(0.3333, Double.valueOf(1)/3,4); //斷言相等的例子
    assertEquals(0.3333, Double.valueOf(1)/3,0.0001); } //新建一個加法方便使用斷言函數
public int add(int a,int b){ return a+b; }

 

3、相關API--same

方法 說明
assertFalse(boolean) 如果條件(condition)為False則通過,否則失敗
assertFalse(String,boolean) 如果條件(condition)為False則通過,否則失敗
assertTrue(boolran) 如果條件(condition)為True則通過,否則失敗
assertTrue(String,boolran) 如果條件(condition)為True則通過,否則失敗
assertNotNull(Object) 如果條件(condition)為非空則通過,否則失敗
assertNotNull(String,Object) 如果條件(condition)為非空則通過,否則失敗
assertNull(Object) 如果條件(condition)為空則通過,否則失敗
assertNull(String,Object) 如果條件(condition)為空則通過,否則失敗
assertNotSame(Object,object) 如果期望(expected)和實際(actual)引用不同的內存對象對象則通過,否則失敗
assertNoteSame(String,Object,Object) 如果期望(expected)和實際(actual)引用不同的內存對象對象則通過,否則失敗
assertSame(Object,Object) 如果期望(expected)和實際(actual)引用相同的內存對象對象則通過,否則失敗
assertSame(String,Object,Object) 如果期望(expected)和實際(actual)引用相同的內存對象對象則通過,否則失敗
/示例一: public void testDemo1() throws UiObjectNotFoundException{ //自己聲明一個布爾值為了測試斷言函數的使用 
     boolean is=true; //斷言成功的例子 
 assertTrue(is); //斷言失敗的例子 
 assertFalse(is); } //示例二:
public void testDemo1() throws UiObjectNotFoundException{ int a = 100; int b = 100; Integer c=new Integer(100); //斷言成功的例子,值的比較
    assertSame(a, b);//a和b的值相等,內存指向也相等 //斷言失敗的例子
 assertNotSame(a, b); //斷言失敗的例子,內存地址比較
    assertSame(a, c);//a和c的值相等,內存指向不相等 //斷言成功的例子
    assertSame((Object)a, c);//a和c的類型不一樣,所以要把a強制轉換成對象,才可以比較
}

 

4、相關API--fali

方法 說明
fail() 用例立即失敗
fail(String) 用例立即失敗,且拋出指定消息
failNotEquals(String,Object,Object) 用例立即失敗,且拋出指定消息與期望、實際值不相等的消息
failNotSame(String,String,String) 用例立即失敗,且拋出指定消息與期望、實際值不相等的消息
failSame(String) 用例立即失敗,且拋出指定消息
public void testDemo1() throws UiObjectNotFoundException{ UiDevice.getInstance().pressBack(); UiDevice.getInstance().pressMenu(); UiDevice.getInstance().pressHome(); //用例失敗,且拋出異常
    fail("Failed"); }

 

三、結合實例

//開始
protected void setUp() throws Exception{ super.setUp(); } public void testDemo1() throws UiObjectNotFoundException{ //初始化場景
 UiDevice.getInstance().pressBack(); UiDevice.getInstance().pressBack(); UiDevice.getInstance().pressBack(); UiDevice.getInstance().pressHome(); //打開文件管理
    UiObject app=new UiObject(new UiSelector().description("應用")); UiObject file=new UiObject(new UiSelector().text("文件管理器")); app.clickAndWaitForNewWindow(); file.clickAndWaitForNewWindow(); //驗證開啟成功
    String packageName=UiDevice.getInstance().getCurrentPackageName(); assertEquals("File open succes!","com.cyanogenmod.filemanager", packageName); //檢查目錄名為test的目錄
    UiObject test=new UiObject(new UiSelector().text("test")); UiScrollable listView=new UiScrollable(new UiSelector().className("android.widget.ListView")); boolean FindResult=listView.scrollIntoView(test); //如果有該目錄則停止執行用例
    if (FindResult==true){ fail("test目錄已經存在"); } //如果沒有該目錄則新建test目錄
    UiObject dos=new UiObject(new UiSelector().description("操作")); dos.clickAndWaitForNewWindow(); UiObject newFile=new UiObject(new UiSelector().text("新建文件夾")); newFile.clickAndWaitForNewWindow(); UiObject input=new UiObject(new UiSelector().className("android.widget.EditText")); input.setText("test"); UiObject ok=new UiObject(new UiSelector().text("確定")); ok.click(); //驗證新建成功 
    boolean FindResult2=listView.scrollIntoView(test); assertTrue("test目錄創建成功",FindResult2); } //完成
protected void tearDown() throws Exception{ super.tearDown(); UiDevice.getInstance().pressBack(); UiDevice.getInstance().pressBack(); UiDevice.getInstance().pressBack(); UiDevice.getInstance().pressHome(); }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM