標籤:
一、斷言函數介紹1.斷言函數:
確定被測試的方法是否按照預期的效果正常工作
if (假設成立){ 通過測試}else{ 報錯並終止當前用例測試}2.斷言函數用例結構:
setUp//初始化//測試案例,junit4版本才可以使用多條用例test 初始化情境與資料test 類比操作步驟test 斷言test 恢複情境 tearDown//回收初始化垃圾
3.斷言函數Java錯誤類型:1)Error:
一般是指與虛擬機器相關的問題,如系統崩潰,虛擬機器錯誤,記憶體空間不足,方法調用棧溢出等。對於這類錯誤導致的應用程式中斷,僅靠程式本身無法恢複和預防(斷言)
2)Exeeption:
表示程式可以處理的異常,可以捕獲且可能恢複。遇到這類異常,應該儘可能處理異常,使程式恢複運行,而不應該隨意終止異常(最常見的是UI對象找不到的異常)
二、斷言函數API:1.斷言函數分類:
//斷言兩個對象是否相等asserEquals(String message,Object expected,Object actual){ if (expected==null && actual==null){ return ; } if (expected!=null && expected.equals(actual)){ return } failNotEquals(message,expected,actual);}
參數 |
說明 |
| Message |
可選訊息,在宣告失敗後會拋出這個訊息 |
| Expected |
期望的值 |
| Actual |
實際的值 |
2.相關API:1)
| 方法 |
說明 |
| 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)相等則通過,否則失敗 |
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;}2)
浮點運算不是萬全精確的,所以比較浮點數值的時候引入精確程度
assertEquals(double expected,double actual,double delta)
方法 |
說明 |
| 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)則通過,否則失敗 |
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)
方法 |
說明 |
| 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)引用相同的記憶體對象對象則通過,否則失敗 |
API樣本:
//樣本一: 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); //宣告失敗的例子 assertNotSame(a, b); //宣告失敗的例子,記憶體位址比較 assertSame(a, c); //斷言成功的例子 assertSame((Object)a, c);}
4)
方法 |
說明 |
| 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();}
10.Android UiAutomator Junit 斷言函數的使用