单元测试&Logcat&数据存储&XML的序列化和解析



一. 测试概述

1. 测试分类

根据是否知道源码分类

黑盒测试 : 不知道源码,是以用户的角度,从输入数据与输出数据的对应关

系出发进行测试的

白盒测试 : 知道源码, 又称结构测试、透明盒测试、逻辑驱动测试或基于代

码的测试

 

根据测试粒度分类

方法测试 : FunctionTest粒度最低测试单个方法

单元测试 : JunitTest 方法里面会调用其他的方法

联调测试 : IntegrationTest 后台与前台集成各模块之间的集成测试

 

根据测试次数分类

冒烟测试 :顾名思义,把设备点冒烟的,随机的去点

   Android下提供给我们一种冒烟测试的功能猴子测试

   在命令行输入adb shell ,进入Linux内核

   测试整个系统:

  monkey 1000(事件的数量)

测试某个程序

  monkey -p 包名 事件的数量

压力测试 : PressureTest , 给后台用的,主体向被观察者布置一定量任

务和作业,借以观察个体完成任务的行为    

2.Android Junit单元测试

在实际开发中,开发android软件的过程需要不断地进行测试。而使用Junit测试框架,则是正规Android开发的必用技术,在Junit中可以得到组件,可以模拟发送事件和检测程序处理的正确性

 

步骤

1. 写一个测试类,继承AndroidTestCase

2. 在清单文件中追加以下信息:

manifest节点下:

 

application节点下:

 

3. 右键选中要测试的方法Run AsàAndroid Junit Test

二.Logcat

Android程序运行的所有信息都会在Logcat中显示出来而不是控制台

1.如何使用

1. 在布局页面添加一个按钮为其注册点击事件点击按钮执行方法click

2. click方法代码如下

 

3. 运行程序点击按钮查看Logcat选项卡的内容

 

2. Log5个级别

1. veborse  黑色  啰嗦    等级最低 

2. debug  蓝色    调试信息  等级倒数第二 

3. INFO   绿色   信息    等级第三 

4. warn   黄色  警告   等级第二

5. error  红色 错误   等级最高

三.文件的权限

文件的权限信息由10个‘-’来标识

 

Context类中有4个文件的权限:

1. Context.MODE_PRIVATE 私有的(默认) - rw- rw- ---

2. Context.MODE_WORLD_READABLE 可读的 - rw- rw- r—

3. Context.MODE_WORLD_WRITEABLE  可写的 - rw- rw- -w-

4. Context.MODE_WORLD_WRITEABLE +Context.MODE_WORLD_READABLE   共有的 - rw- rw- --- 

 

命令行下使用adb shell命令,进入Linux内核,使用chmod命令来更改一个文件的权限:chmod 666 xx.txt   代表更改xx.txt的文件权限为可读可写

四.Android下的文件存储

1.保存文件到手机内存

案例制作一个登录界面如果用户选择了记住密码则通过输出流将用户名和密码保存到

手机内存中在用户下次进入应用界面时回显用户数据

 

存储数据使用的三种路径

1. 指定’/data/data/当前程序的包名/文件名作为路径信息

缺点路径被写死若更改包名则需改动代码否则将会抛错

2. 上下文给出了一个方法getFileDir()

此方法将返回当前应用程序路径下的files文件的路径信息,即该方法将返回

’/data/data/当前程序的包名/files

Activity还提供了一个openFileOutput方法,也是指向files路径

     3.上下文还给出了一个方法:getCacheDir()

 此方法将返回当前程序路径下的cache文件的路径信息,即该方法将返回

 ‘/data/data/当前程序的包名/cache

 

步骤

1. 创建登录界面为登录按钮注册一个onClick事件方法为login,效果图:

 

 

2. 添加业务逻辑,用于存储数据到手机内存以及从手机内存中取出数据,代码如下:

 

3. 添加登录逻辑,代码如下:

 

 

4. 运行程序

使用第一种路径生成文件如下

 

使用第二种路径生成文件如下

 

使用第三种路径生成文件如下

 

打开info.txt文件,内容显示如下:

 

2. SharedPreferences

案例同上,实现功能即逻辑代码均相同,仅存储数据以及回显数据使用的方法不同

采用SharedPreferences来实现数据的存储以及回显

数据将存储到当前应用下的shared_prefs文件夹下,其路径信息为:

‘/data/data/当前应用程序的包名/shared_prefs/文件名

 

存储数据的代码如下:

读取数据的代码如下

 

运行程序生成的文件如下

获取SharedPreferences对象时无需指定文件的扩展名,是因为默认会创建一个xml文件,打开info.xml,其内容如下

3.使用SD卡存储数据

案例同上,实现功能即逻辑代码均相同,仅存储&读取的业务逻辑不相同

注意

1. SD卡中写入&读取数据时要先判断SD卡是否存在

2. 操作SD卡需要向清单文件中添加两个权限,否则无法操作

android.permission.WRITE_EXTERNAL_STORAGE 写入数据权限android.permission.MOUNT_UNMOUNT_FILESYSTEMS创建&删除权限

所用方法

1.Environment.getExternalStorageState()  获取SDCard的状态

如果手机装有SDCard,并且可以进行读写,那么方法返回的状态等于Environment.MEDIA_MOUNTED

 

2.Environment.getExternalStorageDirectory() 获取SDCard的目录    要获取SDCard的目录还可以使用/mnt/sdcard这个路径

 

存储&读取数据的业务逻辑代码如下

 

其余代码逻辑相同不做改动添加权限信息后运行应用程序结果如下

 

打开info.txt文件内容如下

 

五.获取SD/内存的大小和剩余容量

获取SD卡的File对象所用方法

Environment.getExternalStorageDirectory()

获取手机存储的File对象所用方法

Activity提供的getFilesDir()方法

获取总容量的方法

File对象的getTotalSpace()方法

获取可用空间的方法

File对象的getUsableSpace()方法

 

案例点击指定按钮获取指定存储空间的总容量和可用空间信息

页面布局

逻辑代码如下

点击获取SD卡信息按钮

           

 

点击获取内存信息按钮

        

六.XML文件的序列化

案例实现一个短信备份器将联系人姓名信息主体联系人号码存入一个xml

件中,结构如下:

 

布局页面仅需一个按钮即可布局如下

 

1.使用StringBuffer生成一个xml文件

其点击事件的逻辑代码如下

2.XML的序列化

序列化就是把文件读到内存里。

一旦看到  就是文本的开始,一旦解析到最后一个,就是文本的结尾

 

方法

创建好xml序列化器

XmlSerializer serializer = Xml.newSerializer();

 

初始化serializer

serializer.setOutput(fos, "utf-8");

 

文本的开始

serializer.startDocument("utf-8", true);

 

文本的结束

serializer.endDocument();

 

文本的开始节点

serializer.startTag(null, "sms");

 

文本的结束节点

serializer.endTag(null, "sms");

 

给节点添加ID

serializer.attribute(null, "id", "1");

 

在节点内添加内容

serializer.text("文本节点");

 

点击事件的逻辑代码以及运行程序生成的info.xml文件如下

    

 

 

 

七.Pull解析XML文件

除了可以使用 SAXDOM解析XML文件之外,还可以使用Android内置的Pull解析器解析XML文件(DOM:把文件加载进内存  SAX/Pull:以事件的方式解析)

 

Pull解析器是一个开源的java项目,既可以用于android,也可以用于JavaEE。如果用在javaEE需要把其jar文件放入类路径中,因为Android已经集成进了Pull解析器,所以无需添加任何jar文件。android系统本身使用到的各种xml文件,其内部也是采用Pull解析器进行解析的。 

 

Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值

 

案例weather.xml文件中存储着天气信息,使用pull解析xml,将天气信息解析出来

并显示

步骤

1. 创建一个weather.xml,将文件放在src目录下,其内容如下:

 

2. 创建一个weather实体类,用于存储数据,其代码如下:

 

3.在布局页面添加一个获取天气信息Button为其注册点击事件getWeather

4.添加解析xml文件的业务逻辑,其代码如下:

 

5. 添加点击事件逻辑代码如下:

 

6. 运行程序结果如下

 

八.综合案例——学生管理系统

需求

实现一个学生管理系统其界面图如下

1. 添加按钮点击添加数据被添加到下方界面显示

 

 

2. 保存数据按钮点击保存数据页面数据被保存到xml文件中,页面弹出保存是否

成功的提示信息

3. 恢复数据按钮点击恢复数据调用业务逻辑解析xml文件,取出全部学生信息,

显示到页面上

4. 清除数据按钮点击清除数据清空当前页面的数据(但是不会清空xml文件)

所用知识

1.布局时可以使用线性布局来实现LinearLayout嵌套

2.添加控件到当前布局时父容器的addView方法即可,关键代码如下:

 

3.保存数据时,使用XML序列化来实现(注意:若写入SD卡,需要先添加权限),将

学生信息写入xml文件保存起来,关键代码如下:

 

4.恢复数据时使用Pull解析XMl文件将学生信息读取并添加到集合

5.清除数据时清空容器内的数据只需调用其removeAllViews()方法即可

 

 

你可能感兴趣的:(Begining,Android)