Uiautomator--断言的使用

时间:2021-11-02 18:22:23
一、断言函数的使用
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();
}