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