#1 测试的相关概念 (了解) * SUV 开发车载系统 ,测试有问题 ,好的软件不是开发出来的 ,是测试出来的。
* 测试根据是否知道源代码
* 黑盒测试
测试者不了解程序的内部情况,不需具备应用程序的代码、内部结构和编程语言的专门知识。只知道程序的输入、输出和系统的功能,这是从用户的角度针对软件界面、功能及外部结构进行测试,而不考虑程序内部逻辑结构。测试案例是依应用系统应该做的功能,照规范、规格或要求等设计。测试者选择有效输入和无效输入来验证是否正确的输出。如集成测试(integration testing)以及系统测试(system testing)。集成测试又称组装测试,即对程序模块采用一次性或增殖方式组装起来,对系统的接口进行正确性检验的测试工作。整合测试一般在单元测试之后、系统测试之前进行。实践表明,有时模块虽然可以单独工作,但是并不能保证组装起来也可以同时工作。
* 白盒测试
白盒测试(white-box testing)又称透明盒测试(glass box testing)、结构测试(structural testing)等,软件测试的主要方法之一,也称结构测试、逻辑驱动测试或基于程序本身的测试。测试应用程序的内部结构或运作,而不是测试应用程序的功能(即黑盒测试)。在白盒测试时,以编程语言的角度来设计测试案例。测试者输入数据验证数据流在程序中的流动路径,并确定适当的输出,类似测试电路中的节点。测试者了解待测试程序的内部结构、算法等信息,这是从程序设计者的角度对程序进行的测试。
白盒测试可以应用于单元测试(unit testing)、集成测试(integration testing)和系统的软件测试流程,可测试在集成过程中每一单元之间的路径,或者主系统跟子系统中的测试。尽管这种测试的方法可以发现许多的错误或问题,它可能无法检测未使用部分的规范。
白盒测试设计技术包括以下代码覆盖标准:
- 控制流测试
- 数据流测试
- 分支测试
- 语句覆盖
- 判定覆盖
- 修正条件/判定覆盖
- 主要路径测试
- 路径测试
*根据测试的粒度
*方法测试 funtion test 写完一个方法就测试
*单元测试:测试一个能够独立运行的业务逻辑单元
*模块测试:模块开发完后测试整个模块
*集成测试 integration test 整体测试项目 联调
*系统测试 System test
Android里面还有一些测试:
* 测试暴力程度
* 冒烟测试 :自动高频次的点击软件,其实就是测试软件的极限值,找出bug。
* 压力测试 :比如12306。使用测试工具: LoadRunner、jmeter。
2.Android下的单元测试
*1如果想测试一个业务方法 我们首先定义一个类 extends AndroidTestCase
*2写测试方法
*3 要在清单文件配置:
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.qaa.unittest" android:label="Tests for My App" />
<uses-library android:name="android.test.runner" />
# 3 logcat 介绍 日志猫 (以后天天用),以下的优先级从高往低排列。
* error -----红色 最高级
* warn ----- 黄色 比较高
* info ---- 绿色 一般
* debug----蓝色 较高
* verbose---黑色 一般
log.w() 打印警告信息。
# 4Android下的数据保存 (非常重要)
* 1 画界面
* 2 点击login 按钮,判断一下 checkbox 是否已经勾选,如果勾选 我们拿到 用户名和密码的值 。
* 3 我们写了一个专门用来保存和读取的业务方法。
* 4 要在oncreate 方法中先判断一下用户名和密码是否存在,如果存在读取出来。
# 5Android把数据保存到sd卡
* 1 获取sd卡路径
Environment.getExternalStorageDirectory().getPath()
* 2 判断sd卡是否可用,是否处于挂载的状态。
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()))
{}
*3 一定不要忘记加写的权限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
* 4 只有2.3版本的有卸载和挂载的选项
# 6获取sd卡的剩余空间 (练习)
File file = Environment.getExternalStorageDirectory();
long totalSpace = file.getTotalSpace(); //返回指定目录的总大小
long usableSpace = file.getUsableSpace(); // 返回可用的空间大小 返回的类型 是byte
//格式化totalSpace,将long totalSpace转换成String totalSpaceSize,便于显示。这行语句应用的很广。
String totalSpaceSize = Formatter.formatFileSize(getApplicationContext(), totalSpace);
# 7 利用上下文获取常用的目录 Toast.(mainactivity.this)
* FileOutputStream fos = context.openFileOutput("info.txt", 0);
* FileInputStream fis = context.openFileInput("info.txt");
# 9保存数据的另外一种方式 sharedperfance ***(非常重要 毕业后无处不用)
* 1拿到sp的对象 sp = getSharedPreferences("config", 0);
* 2 拿到sp 编辑器 Editor edit = sp.edit() ;
* 3 一定要 edit.commit()
* 原理 底层生成了一个xml文件
# 10xml 文件的生成(重要)
*1.利用sb,去组拼 StringBuilder
*2 利用XmlSerializer serializer = Xml.newSerializer(); // xml序列化器
*3 设置xml序列化器的参数:serializer.setOutput(fos, "utf-8");
*4 开始写xml
serializer.startDocument("utf-8", true); //namespace 命名空间
serializer.startTag(null, "smss");
for (Sms sms : smsLists) {
serializer.startTag(null, "sms");
serializer.startTag(null, "sender");
serializer.text(sms.getSender());
serializer.endTag(null, "sender");
serializer.startTag(null, "content");
serializer.text(sms.getContent());
serializer.endTag(null, "content");
serializer.startTag(null, "time");
serializer.text(sms.getTime());
serializer.endTag(null, "time");
serializer.endTag(null, "sms");
}
serializer.endTag(null, "smss");
serializer.endDocument();
fos.close();
# 11xml的解析,关于城市天气的xml的解析
*dom 把整个文档作为一个树加入到内存中
*sax基于事件
*pullparser解析
* 1 拿到一个 xmlpulparser 的解析器
* 2 设置解析器的参数 parser.setInput(in, "utf-8");
* 3 拿到解析的事件类型
* 4
int type = parser.getEventType();
while (type != XmlPullParser.END_DOCUMENT) {
type= parser.next(); }
* 5 判断开始节点和结束节点
switch (type) {
case XmlPullParser.START_TAG: // 文档的开始节点
if ("weather".equals(parser.getName())) {
// 把集合给初始化出来
weatherLists = new ArrayList<Channel>();
} else if ("channel".equals(parser.getName())) {
channel = new Channel();
String id = parser.getAttributeValue(0);// 拿到id熟悉
channel.setId(id);
} else if ("city".equals(parser.getName())) {
String city = parser.nextText(); // 拿到city的值
channel.setCity(city);
} else if ("temp".equals(parser.getName())) {
String temp = parser.nextText(); // 拿到温度的值
channel.setTemp(temp);
} else if ("wind".equals(parser.getName())) {
String wind = parser.nextText(); // 拿到温度的值
channel.setWind(wind);
} else if ("pm250".equals(parser.getName())) {
String pm250 = parser.nextText(); // 拿到温度的值
channel.setPm250(pm250);
} break;
case XmlPullParser.END_TAG: // 结束节点
if ("channel".equals(parser.getName())) {
weatherLists.add(channel);
}
break;
default:
break; }