根据是否知道源码分类:
黑盒测试 : 不知道源码,是以用户的角度,从输入数据与输出数据的对应关
系出发进行测试的
白盒测试 : 知道源码, 又称结构测试、透明盒测试、逻辑驱动测试或基于代
码的测试
根据测试粒度分类:
方法测试 : FunctionTest,粒度最低,测试单个方法
单元测试 : JunitTest 方法里面会调用其他的方法
联调测试 : IntegrationTest 后台与前台集成,各模块之间的集成测试
根据测试次数分类:
冒烟测试 :顾名思义,把设备点冒烟的,随机的去点
Android下提供给我们一种冒烟测试的功能:猴子测试
在命令行输入adb shell ,进入Linux内核
测试整个系统:
monkey 1000(事件的数量)
测试某个程序
monkey -p 包名 事件的数量
压力测试 : PressureTest , 给后台用的,主体向被观察者布置一定量任
务和作业,借以观察个体完成任务的行为
在实际开发中,开发android软件的过程需要不断地进行测试。而使用Junit测试框架,则是正规Android开发的必用技术,在Junit中可以得到组件,可以模拟发送事件和检测程序处理的正确性
步骤:
1. 写一个测试类,继承AndroidTestCase
2. 在清单文件中追加以下信息:
在manifest节点下:
在application节点下:
3. 右键选中要测试的方法,Run AsàAndroid Junit Test
在Android中,程序运行的所有信息都会在Logcat中显示出来,而不是控制台
1. 在布局页面添加一个按钮,为其注册点击事件,点击按钮,执行方法click
2. click方法代码如下:
3. 运行程序,点击按钮,查看Logcat选项卡的内容
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的文件权限为可读可写
案例:制作一个登录界面,如果用户选择了记住密码,则通过输出流将用户名和密码保存到
手机内存中,在用户下次进入应用界面时,回显用户数据
存储数据使用的三种路径:
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文件,内容显示如下:
案例同上,实现功能即逻辑代码均相同,仅存储数据以及回显数据使用的方法不同
采用SharedPreferences来实现数据的存储以及回显
数据将存储到当前应用下的shared_prefs文件夹下,其路径信息为:
‘/data/data/当前应用程序的包名/shared_prefs/文件名’
存储数据的代码如下:
读取数据的代码如下:
运行程序,生成的文件如下:
获取SharedPreferences对象时,无需指定文件的扩展名,是因为默认会创建一个xml文件,打开info.xml,其内容如下:
案例同上,实现功能即逻辑代码均相同,仅存储&读取的业务逻辑不相同
注意:
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卡的File对象所用方法:
Environment.getExternalStorageDirectory()
获取手机存储的File对象所用方法:
Activity提供的getFilesDir()方法
获取总容量的方法:
File对象的getTotalSpace()方法
获取可用空间的方法:
File对象的getUsableSpace()方法
案例:点击指定按钮,获取指定存储空间的总容量和可用空间信息
页面布局:
逻辑代码如下:
点击”获取SD卡信息”按钮:
点击”获取内存信息”按钮:
案例:实现一个短信备份器,将联系人姓名、信息主体、联系人号码存入一个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文件如下:
除了可以使用 SAX或DOM解析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()方法即可