我们在测试一些项目会自动保存到文件夹中,如:录音、录像、拍照等,都自动保存到指定路径中,我们该如何判断是否已经保存到指定目录中呢?或者说指定目录中是否含有我们要的文件呢?
首先考虑一个就是保存到指定文件夹,肯定已知哪个文件夹、文件名称是什么,保存后会自动提示,但是代码如何去做;
保存文件路径,那肯定是固定的,这个不用考虑了。我们考虑是:先获取当前文件的文件名,然后根据文件名去指定路径去查找,看看该文件在否;
ps:如下图所示(图片可能加载不出来,就想象下吧),这是我录音后的界面,已经弹出toast提示我该录音文件保存到了指定文件夹中,注意toast在uiautomator是获取不了的,我们不能根据这个toast去获取;
我们直接先获取它自动生成的录音名称,根据它的resource-id去获取get出来:
UiObject RecordName = new UiObject(new UiSelector().resourceId("cn.dsy.recorder:id/audio_name_text"));//录音后的文件名
w=RecordName.getText();//获取录音后的文件名称"Voice_20171025_104129"存到w中;
然后到指定文件目录中,用w去查找该文件夹中是否存在这个文件名;先操作录音这个动作还有把结果保存文件中,其他文章已经讲过了,这个就不细讲,我们看重点部分;
第一步,我们先得有个查找的方法,uiautomator方法中没有自动,我们要自己写,什么,你不会写?没关系,百度有,直接先copy百度查找对比文件的方法,我也是直接copy了:
先新建一个公共的文件查找方法和类
package dengshengyu.Util;
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.List;
/*
* 项目名称:PublicPressureScript
* 类名称:FileUtil
* 类描述:写文件的父类,为了查找文件
* 创建人:享有盛誉之名
* 创建时间:2017年8月16日 上午9:00
* 备注:1.录音文件调用(NewRecord)
*
* */
//操作查找文件的类
public class TextSearchFile {
public static int countFiles = 0;// 声明统计文件个数的变量
public static int countFolders = 0;// 声明统计文件夹的变量
public static File[] searchFile(File folder, final String keyWord) {// 递归查找包含关键字的文件
File[] subFolders = folder.listFiles(new FileFilter() {// 运用内部匿名类获得文件
public boolean accept(File pathname) {// 实现FileFilter类的accept方法
if (pathname.isFile())// 如果是文件
countFiles++;
else
// 如果是目录
countFolders++;
if (pathname.isDirectory()
|| (pathname.isFile() && pathname.getName().toLowerCase().contains(keyWord.toLowerCase())))// 目录或文件包含关键字
return true;
return false;
}
});
List<File> result = new ArrayList<File>();// 声明一个集合
for (int i = 0; i < subFolders.length; i++) {// 循环显示文件夹或文件
if (subFolders[i].isFile()) {// 如果是文件则将文件添加到结果列表中
result.add(subFolders[i]);
} else {// 如果是文件夹,则递归调用本方法,然后把所有的文件加到结果列表中
File[] foldResult = searchFile(subFolders[i], keyWord);
for (int j = 0; j < foldResult.length; j++) {// 循环显示文件
result.add(foldResult[j]);// 文件保存到集合中
}
}
}
File files[] = new File[result.size()];// 声明文件数组,长度为集合的长度
result.toArray(files);// 集合数组化
return files;
}
}
以上的是查找文件的方法,具体我没有去细看,大家可以自行百度;
第二步:就是我们利用已有的方法去调用,把我们的w录音名称带入文件中查找,先附上源码在细讲;
只有部分源码,我只截如何根据录音名是否存在文件中的方法,直接复制肯定报错,大家先理解思想。
package PublicPressureScript.WIFI;
import java.io.BufferedWriter;
package PublicPressureScript.Record;
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.List;
import dengshengyu.Util.FileUtil;
import com.android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiSelector;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;
import dengshengyu.Util.TextSearchFile;
/*
* 项目名称:PublicPressureScript
* 类名称:NewRecord
* 类描述:连续播放录音文件
* 创建人:享有盛誉之名
* 创建时间:2017年8月15日 上午14:28
* 备注:播放录音文件声音质量和状况代码无法检测;
* @版本v0.0.1
*
* */
public class NewRecord extends UiAutomatorTestCase {
public void testNewRecord() throws Exception {
int i=0;
int j;
int z = 0;
int k = 0;
String w;
int count = 1 ;
int count1 = 1 ;
int count2 = 1 ;
int count3 = 1 ;
int count4 = 1 ;
int count5 = 1 ;
//home键返回主界面
getUiDevice().pressHome();
//杀掉原来进程,让录音机启动界面为初始界面
Runtime.getRuntime().exec("am force-stop cn.zte.recorder");
sleep(1000);
Runtime.getRuntime().exec("am start cn.zte.recorder");
sleep(1000);
//获取控件全局变量
UiObject newRecord = new UiObject(new UiSelector().resourceId("cn.zte.recorder:id/playingButton"));//停止后播放录音键
UiObject RecordName = new UiObject(new UiSelector().resourceId("cn.zte.recorder:id/audio_name_text"));//录音后的文件名
UiObject OnPlay = new UiObject(new UiSelector().resourceId("cn.zte.recorder:id/playingButton"));//录音后播放录音暂停
//循环录音50次
for(;i<50;i++){//第二次后的录制循环
sleep(300);
getUiDevice().click(280,1048);//录音按钮
sleep(5000);//录音5秒
getUiDevice().click(541,1155);//停止按钮
sleep(300);
//第二个测试预期结果:判断录音文件是否存储到手机目录中
w=RecordName.getText();//获取录音后的文件名称Voice_20171025_104129
System.out.print("File:"+w);
File folder = new File("sdcard/Recordings/"); //手机存储文件夹目录
String keyword = w;
File[] result = TextSearchFile.searchFile(folder, w);// 调用方法获得文件数组
// System.out.println("zai " + folder + " yijisuoyouduixiangjihe" + keyword);
// TextSearchFile.countFiles 这个是查找该目录下所有文件个数
//TextSearchFile.countFolders 这个是查找该目录下有几个文件夹
// result.length 这个是查找符合w=RecordName.getText()名的文件个数长度
//自测此块代码,其他全部屏蔽,手机在录音后有录音文件名界面,使用cmd的adb删除文件命令 rm 删除掉,测试文件存在个不存在情况 System.out.println("ALL File:" + TextSearchFile.countFiles + "geWenJian," + TextSearchFile.countFolders + " geWenJianJia " + result.length + " geFuHeWenJian:");
if (result.length!=0) {// 判断符合文件名存在目录中的长度不等于0就是含有
FileUtil.out("/sdcard/dengshengyu/Record/录音保存成功.txt", "录音保存成功:"+count2+"次在手机‘sdcard/Recordings/’目录中;");
System.out.println(" MuLucunzai:==>" + folder.getAbsolutePath());
count2=count2+1;}
else{
FileUtil.out("/sdcard/dengshengyu/Record/录音保存失败.txt", "录音保存失败:"+count3+"次在手机‘sdcard/Recordings/’目录中;");
System.out.println(folder.getAbsolutePath()+"==>MuLuBUcunzai");
count3=count3+1; }
}//for循环50次
}
}
下面我们现在分解步骤去解释,每句代码都有注释,就不啰嗦了,肯定看的懂,不懂给我留言;
这里有两小步:第一步是先获取录音名称,然后存在w中;第二步是到指定文件夹目录中,在建个文件数组赋予result中;
//第二个测试预期结果:判断录音文件是否存储到手机目录中
w=RecordName.getText();//获取录音后的文件名称Voice_20171025_104129
System.out.print("File:"+w); //打印给自己看的结果,获取的文件名是否是对的;
File folder = new File("sdcard/Recordings/"); //手机存储文件夹目录
String keyword = w;
File[] result = TextSearchFile.searchFile(folder, w);// 调用方法获得文件数组
然后我们就要做判断了,如何判断?
System.out.println("ALL File:" + TextSearchFile.countFiles + "geWenJian," +TextSearchFile.countFolders + " geWenJianJia " +result.length + " geFuHeWenJian:");
这句语句很重要,根据我们公共方法类获取的,我们先理解这是什么意思先,理解这些方法名是什么意思:
解释如下:
1.TextSearchFile.countFiles 这个是查找该目录下所有文件个数
2.TextSearchFile.countFolders 这个是查找该目录下有几个文件夹
3.result.length 这个是查找符合w=RecordName.getText()名的文件个数长度
从上面方法名我们知道,第1个TextSearchFile.countFiles 信息很重要,是文件个数,因为我们的录音文件是属于文件,而不是文件夹,所以除了第1个方法对我们有用。
那么怎么用?
刚刚我们把文件名称放到w中,又把w文件名转换为文件数组,即文件形式result。这样我们可以这么想,要是该文件夹中,存在我们录音文件的个数为0就是不存在录音文件,也就是result不等于0,说明文件夹中就含有我们的录音文件,这里先不管有几个,不可能是两个,因为文件名不允许一样,这个就不纠结。
我们用if语句判断result.length!=0就说明改文件存在于文件夹中。是不是很简单?
/自测此块代码,其他全部屏蔽,手机在录音后有录音文件名界面,使用cmd的adb删除文件命令 rm 删除掉,测试文件存在个不存在情况
System.out.println("ALL File:" + TextSearchFile.countFiles + "geWenJian," + TextSearchFile.countFolders + " geWenJianJia " + result.length + " geFuHeWenJian:");
if (result.length!=0) {// 判断符合文件名存在目录中的长度不等于0就是含有
FileUtil.out("/sdcard/dengshengyu/Record/录音保存成功.txt", "录音保存成功:"+count2+"次在手机‘sdcard/Recordings/’目录中;");
System.out.println(" MuLucunzai:==>" + folder.getAbsolutePath());
count2=count2+1;
// return;
}else{
FileUtil.out("/sdcard/dengshengyu/Record/录音保存失败.txt", "录音保存失败:"+count3+"次在手机‘sdcard/Recordings/’目录中;");
System.out.println(folder.getAbsolutePath()+"==>MuLuBUcunzai");
count3=count3+1;
}
最后把结果记录生成到指定文件夹中保存(请查看我另篇文章,uiautomator测试判断结果后保存入指定文件夹路径中 )
大家以为这样就结束了?身为一个代码编写角色,肯定要自测下代码是否有实现啊,自测都不自测怎么指定成功;
代码自测部分:
把所有含操作相关的代码都注释掉,只留判断这块,手机当前界面要是已经录音好的,如上面第一个图一样的界面,这样我们就可以开始测试了;
测试代码屏蔽后,大概是这样的
package PublicPressureScript.WIFI;
import java.io.BufferedWriter;
package PublicPressureScript.Record;
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.List;
import Gota.Util.FileUtil;
import com.android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiSelector;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;
import Gota.Util.TextSearchFile;
/*
* 项目名称:PublicPressureScript
* 类名称:NewRecord
* 类描述:连续播放录音文件
* 创建人:享有盛誉之名
* 创建时间:2017年8月15日 上午14:28
* 备注:播放录音文件声音质量和状况代码无法检测;
* @版本v0.0.1
*
* */
public class NewRecord extends UiAutomatorTestCase {
public void testNewRecord() throws Exception {
int i=0;
int j;
int z = 0;
int k = 0;
String w;
int count = 1 ;
int count1 = 1 ;
int count2 = 1 ;
int count3 = 1 ;
int count4 = 1 ;
int count5 = 1 ;
//获取控件全局变量
UiObject RecordName = new UiObject(new UiSelector().resourceId("cn.zte.recorder:id/audio_name_text"));//录音后的文件名
//第二个预期结果:判断录音文件是否存储到手机目录中
w=RecordName.getText();//获取录音后的文件名称Voice_20171014_131251
System.out.print("File:"+w);
File folder = new File("sdcard/Recordings/");// 手机存储文件夹目录
String keyword = w;
File[] result = TextSearchFile.searchFile(folder, w);// 调用方法获得文件数组
//自测此块代码,其他全部屏蔽,手机在录音后有录音文件名界面,使用cmd的adb删除文件命令 rm 删除掉,测试文件存在个不存在情况
System.out.println("ALL File:" + TextSearchFile.countFiles + "geWenJian," + TextSearchFile.countFolders + " geWenJianJia " + result.length + " geFuHeWenJian:");
if (result.length!=0) {// 判断符合文件名存在目录中的长度不等于0就是含有
FileUtil.out("/sdcard/dengshengyu/Record/录音保存成功.txt", "录音保存成功:"+count2+"次在手机‘sdcard/Recordings/’目录中;");
System.out.println(" MuLucunzai:==>" + folder.getAbsolutePath());
count2=count2+1;
// return;
}else{
FileUtil.out("/sdcard/dengshengyu/Record/录音保存失败.txt", "录音保存失败:"+count3+"次在手机‘sdcard/Recordings/’目录中;");
System.out.println(folder.getAbsolutePath()+"==>MuLuBUcunzai");
count3=count3+1;
}
}
}
然后先保存,执行uiautomator编译(这个不用我讲了,肯定都会)
怎么测试?
第一步:该录音文件肯定已经保存到指定文件夹中,所以我们此时就验证,当文件存在的情况,代码能不能判断出;
运行uiautomator,当前界面的结果肯定显示 ”MuLucunzai:==>xxx文件夹中“,第二个查看手机文件,我们不是把结果记录保存到文件夹中了吗,到该文件夹查看肯定有文件记录 ”录音保存成功.txt“,内容有成功次数;
当文件存在的情况,判断这块肯定成功;
第二步:我们手动从文件夹中删除掉该录音文件,记住,别动手机,采用cmd的方法,用”adb shll rem 文件路径 文件名"的方法去删除该录音文件(不会这adb删除方法请自行百度)。文件删除后,那就是当文件不存在的情况,代码是否能判断出结果:
运行uiautomator,当前界面的结果肯定显示 ”xxx文件夹中==>MuLuBUcunzai“,第二个查看手机文件,我们不是把结果记录保存到文件夹中了吗,到该文件夹查看肯定有文件记录 ”录音保存失败.txt“,内容有失败次数;
以上两步验证的结果都符合,那恭喜你,你的代码通过验证了。
---------------------------------完,不明白的给我留言·······················
作者:享有盛誉之名
转载请著名出处