本帖最后由 孟凡凯老师 于 2016-5-30 10:32 编辑
【济南校区】基础第二天笔记总结 基础第二天笔记总结基础第二天笔记总结测试分类: 一、根据是否知道源码 黑盒测试:不知道源码,是以用户的角度,从输入数据与输出数据的对应关系出发进行测试的。 白盒测试:知道源码,又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。 二、根据测试粒度分类 方法测试:FunctionTest,粒度最低,测试单个方法。 单元测试:JunitTest方法里面会调用其他的方法。 联调测试:IntegrationTest后台与前台集成,各模块之间的集成测试。 三、根据测试次数分类 冒烟测试:顾名思义,把设备一直测试到冒烟为止。Android 下提供给我们一种冒烟测试的功能: Monkey Test 猴子测试,在命令行输入adb shell,进入Linux 命令行。测试整个系统命令:monkey 1000(事件的数量);测试某个程序:monkey -p 包名事件的数量 压力测试:PressureTest,给后台用的,主体向被观察者布置一定量任务和作业,借以观察个体完成任务的行为。 Android Junit: Android Junit的使用分为两种情形: 一、在已有的工程中添加单元测试功能 1. 创建一个类继承AndroidTestCase类。 2. 在AndroidManifest.xml 中添加指令集和测试库 - 指令集位于application 节点之外
- <instrumentation
- android:name="android.test.InstrumentationTestRunner"
- android:targetPackage="com.itheima.android.junit" >
- </instrumentation>
复制代码测试库位于application 节点内部。 - <uses-libraryandroid:name="android.test.runner"/>
复制代码二、创建测试工程测试其他工程 1.创建一个Android TestProject 工程 2. 在测试工程中编写测试类继承AndroidTestCase 3. 在该类中编写测试方法,不需要手动在AndroidManifest.xml中添加指令集和测试库
Log 日志工具类的使用Log.v(tag,msg); 全部信息 Log.d(tag,msg); 调试信息 Log.i(tag,msg); 通知信息 Log.w(tag,msg); 警告信息 Log.e(tag, msg); 错误信息 存储数据/data/data目录是应用程序的私有目录,默认只有本应用程序才能操作。 getFilesDir():获取/data/data/包名/files文件 openFileInput(String):获取data目录下指定文件的的输入流,直接打开/data/data/包名/files/String文件 openFileOutput("String",MODE_PRIVATE):获取data目录下指定文件的的输出流创建/data/data/包名/files/ String 文件 CheckBox.setChecked()设置checkBox的勾选状态 往SD卡中存储数据 Environment.getExternalStorageDirectory.getPath()可以直接返回sdcard的根目录路径 添加权限 - <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
复制代码获取sdcard的状态 - //获取SD卡的状态
- Environment.getExternalStorageState();
- //根据获取的状态判断是否挂载了SD卡
- Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()))
- File file = Environment.getExternalStorageDirectory();
- // 获取总字节数
- longtotalSpace = file.getTotalSpace();
- // 获取可用字节数
- longfreeSpace = file.getFreeSpace();
- Formatter.formatFileSize(Context,long);该类可以根据当前上下文将字节长度转换为用户易读的字符串文本。
复制代码SharedPreferences 一个轻量级的存储类,一般应用程序都会提供“设置”或者“首选项”等界面的设置就可以通过sp来保存。在Android 系统中该文件保存在:/data/data/包名/shared_prefs目录下。
获取SharedPreferences的三种方法: 1. context.getSharedPreferences("info",MODE_PRIVATE); 2. PreferenceManager.getDefaultSharedPreferences(context); 3. context.getPreferences(MODE_PRIVATE);
SharedPreferences的用法: 保存数据:context.getSharedPreferences("info",MODE_PRIVATE).edit().putString("name", name).commit(); 读取数据: context.getSharedPreferences("info",MODE_PRIVATE.getString("name", "admin");
文件的权限在Linux 中一个文件一共有三个组别:用户、群组、其它。其中每个组包含三种权限:读r、写w、执行x ,也就是说一个文件共有9 个权限属性 文件类型: d文件夹 ,l快捷方式,-文件
file:///C:/Users/Somnus/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png Xml 格式数据的生成和解析 生成XML文件 第一种拼接字符串方式: - public static booleanbackupSms(Context context,ArrayList<SmsBean> lists) {
-
- StringBuffersb = new StringBuffer();
- //1.拼装一个xml的声明头
- sb.append("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>");
- //2.拼装一个根节点
- sb.append("<Smss>");
- //3.循环遍历list集合拼装一条条短信
- for (SmsBean bean : lists) {
- sb.append("<Sms id = \""+bean.id+"\">");
-
- sb.append("<num>");
- sb.append(bean.num);
- sb.append("</num>");
-
- sb.append("<msg>");
- sb.append(bean.msg);
- sb.append("</msg>");
-
- sb.append("<date>");
- sb.append(bean.date);
- sb.append("</date>");
-
- sb.append("</Sms>");
- }
- //4.拼装根节点的结束节点
- sb.append("</Smss>");
- //5.将xml字符串写入文件。
- try{
- FileOutputStreamopenFileOutput = context.openFileOutput("backupSms.xml", Context.MODE_PRIVATE);
- openFileOutput.write(sb.toString().getBytes());
- openFileOutput.close();
- return true;
- }catch (Exception e) {
- e.printStackTrace();
- }
- return false;
- }
复制代码
第二种使用XmlSerializer生成Xml 文件 - public static boolean backupSmsForAndroid(Context context,ArrayList<SmsBean> lists) {
- try{
- //1.通过xml创建一个XmlSerializer对象
- XmlSerializer newSerializer = Xml.newSerializer();
- //2.设置XmlSerializer对象要写入哪个xml文件 os:流信息 encoding:流的编码
- newSerializer.setOutput(context.openFileOutput("backupSms2.xml", Context.MODE_PRIVATE), "utf-8");
- //3.序列化一个xml声明头 encoding:xml文件的编码 standalone:是否独立
- newSerializer.startDocument("utf-8", true);
- //4.序列化一个根几点 namespace:命名空间 name:标签名称
- newSerializer.startTag(null, "Smss");
- //5.循环遍历list集合序列化一条条短信
- for (SmsBean bean : lists) {
- newSerializer.startTag(null, "Sms");
- newSerializer.attribute(null, "id", bean.id);//序列化一个属性
-
- newSerializer.startTag(null, "num");
- newSerializer.text(bean.num);
- newSerializer.endTag(null, "num");
-
- newSerializer.startTag(null, "msg");
- newSerializer.text(bean.msg);
- newSerializer.endTag(null, "msg");
-
- newSerializer.startTag(null, "date");
- newSerializer.text(bean.date);
- newSerializer.endTag(null, "date");
-
- newSerializer.endTag(null, "Sms");
-
- }
- //6.序列化根节点的结束节点
- newSerializer.endTag(null, "Smss");
- //7.完成xml的写入
- newSerializer.endDocument();
- return true;
- }catch (Exception e) {
- e.printStackTrace();
- }
- return false;
- }
复制代码
使用Pull 解析Xml 格式数据 - public static int restoreSms(Context context) {
-
- ArrayList<SmsBean> list = null;
- SmsBean smsBean = null;
- try{
- //1.使用Xml创建一个XmlpullParser对象
- XmlPullParser xpp = Xml.newPullParser();
- //2.告诉XmlpullParser对象要解析的是哪个文件 inputStream:解析哪个文件的流信息 inputEncoding:流的编码
- xpp.setInput(context.openFileInput("backupSms2.xml"), "utf-8");
- //3.获取当前xml第一行的事件类型
- int type = xpp.getEventType();
- //4.循环判断事件类型是否是文档结束标记
- while (type != XmlPullParser.END_DOCUMENT) {
- //获取当前标签的名称
- String currentTagName = xpp.getName();
- //5.如果不是文档结束,解析内容,并获取下一行的事件类型
- switch (type) {
- case XmlPullParser.START_TAG:
- if("Smss".equals(currentTagName)){
- //初始化list集合
- list = new ArrayList<SmsBean>();
- }else if("Sms".equals(currentTagName)){
- //创建一个SmsBean对象来封装数据
- smsBean = new SmsBean();
- smsBean.id = xpp.getAttributeValue(null, "id");//获取id属性的值
- }else if("num".equals(currentTagName)){
- smsBean.num = xpp.nextText();//当前标签是开始标签,并且下一个标签是Text标签,获取下个Text中的值 } else if("msg".equals(currentTagName)){
- smsBean.msg = xpp.nextText();//当前标签是开始标签,并且下一个标签是Text标签,获取下个Text中的值 } else if("date".equals(currentTagName)){
- smsBean.date = xpp.nextText();//当前标签是开始标签,并且下一个标签是Text标签,获取下个Text中的值 }
- break;
- case XmlPullParser.END_TAG:
- if("Sms".equals(currentTagName)){
- //当前标签是Sms的一个结束标签,说明一条短信封装完成,可以添加到list中
- list.add(smsBean);
- }
- default:
- break;
- }
- //6.并获取下一行的事件类型
- type = xpp.next();
- }
-
- //7.短信封装完成,xml解析完了
- return list.size();
- }catch (Exception e) {
- e.printStackTrace();
- }
- return 0;
- }
复制代码
Pull 解析和SAX 解析对比 Pull 解析器的运行方式与SAX 解析器相似,都属于事件驱动模式。它提供了类似的事件,如:开始元 素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送, 因此可以使用一个switch 对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获 取下一个Text 类型元素的值。 SAX 解析器的工作方式是自动将事件推入事件处理器进行处理,因此你不能控制事件的处理主动结 束;而Pull 解析器的工作方式为允许你的应用程序代码主动从解析器中获取事件,正因为是主动获取事件, 因此可以在满足了需要的条件后不再获取事件,结束解析。
|