一、斷言函數介紹
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)相等則通過,否則失敗 |
- API示例:
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)則通過,否則失敗 |
- API示例:
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) | 用例立即失敗,且拋出指定消息 |
- API示例:
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(); }