一、斷言函數的使用
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(); }
