单元测试+内存、SD卡、SP读写+XmlPullParser

测试:
•测试的相关概念

1、根据是否知道源代码分类:

黑盒测试: a - b - c 边值测试 测试逻辑业务
白盒测试: 根据源代码写测试方法 或者 测试用例;

2、根据测试的粒度分类:

方法测试:写完一个方法后就测试
单元测试:测试一个能够独立运行的业务逻辑单元;
集成测试:整体测试项目 联调
系统测试:对整个系统进行测试

3、根据测试的暴力程度:

冒烟测试:高频次的点击软件
压力测试:使用测试工具:LoadRunner、Jmeter

单元测试Junit:

•eclipse中的单元测试步骤:

1、写一个业务类,写一个业务方法:

public class CalcService {

public static int add(int x,int y){

return x+y;
}

}

2、写一个测试类,写一个测试方法,用来测试业务方法

public class CalcServiceTest extends AndroidTestCase{

public void testAdd(){
    int result = CalcService.add(4, 5);
    assertEquals(9, result);//断言的作用:检测运行结果和预期是否一致
  }

}

3、在清单文件中添加测试需要的包


•Android studio中单元测试步骤:(注意在AS中跟在eclipse中单元测试大有区别:省去了在清单文件中很多配置:指定指令集和要测试的应用包名,定义要使用的类库。因为AS内部集成了单元测试)

1、创建一个业务类,一个业务方法

复制代码
1 package com.ahu.androidtest;
2
3 /**
4 * Created by ahu_lichang on 2017/3/17.
5 */
6
7 public class Utils {
8 public static int add(int i,int j){
9 return i+j;
10 }
11 }

复制代码

2、选中上面的业务类Utils,右键–>Go To ---->Test---->新建测试类(勾选上下面方框中的方法)—>OK
在这里插入图片描述

3、在生成的测试类UtilsTest中,边写自己想要的测试代码(背影部分代码是自己手动写的!)

复制代码
1 package com.ahu.androidtest;
2
3 import org.junit.Test;
4
5 import static org.junit.Assert.*;
6
7 /**
8 * Created by ahu_lichang on 2017/3/17.
9 */
10 public class UtilsTest {
11 @Test
12 public void add() throws Exception {
13 System.out.println(“单元测试。。。”);
14 int result = Utils.add(4,5);
15 assertEquals(9,result);//断言:检测预期的结果和运行的结果是否一致
16 }
17
18 }

复制代码

4、最后右键测试类,运行这个类即可。

在这里插入图片描述
  5、运行结果

在这里插入图片描述

•把数据存储到文件

Android应用程序存储数据的方式:

1、保存到文件
2、SQLite数据库
3、内容提供者ContentProvider
4、sharedproferrences保存数据
5、网络

/data/data/应用包名/info.txt

•从内存中读写文件(先把数据写入内存文件中,在从内存文件中读取数据并显示到界面上)

1、创建一个文件,目录data/data/<包名>/文件名(eclipse中和AS中的内存文件的存储目录一样)
2、创建一个文件输出流,把数据写到文件上
3、关闭输出流。

4、读取文件中的数据,并显示到界面上

复制代码
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android
3 xmlns:tools=“http://schemas.android.com/tools
4 android:id="@+id/activity_main"
5 android:layout_width=“match_parent”
6 android:layout_height=“match_parent”
7 android:paddingBottom="@dimen/activity_vertical_margin"
8 android:paddingLeft="@dimen/activity_horizontal_margin"
9 android:paddingRight="@dimen/activity_horizontal_margin"
10 android:paddingTop="@dimen/activity_vertical_margin"
11 tools:context=“com.example.ahu_lichang.myapplication.MainActivity”
12 android:orientation=“vertical”
13 >
14
15 <EditText
16 android:id="@+id/et_name"
17 android:layout_width=“match_parent”
18 android:layout_height=“wrap_content”
19 android:hint=“请输入用户名”
20 />
21 <EditText
22 android:id="@+id/et_pass"
23 android:layout_width=“match_parent”
24 android:layout_height=“wrap_content”
25 android:inputType=“textPassword”
26 android:hint=“请输入密码”
27 />
28 <RelativeLayout
29 android:layout_width=“match_parent”
30 android:layout_height=“wrap_content”
31 android:orientation=“horizontal”
32 >
33 <CheckBox
34 android:id="@+id/cb"
35 android:layout_width=“wrap_content”
36 android:layout_height=“wrap_content”
37 android:text=“记住用户名和密码”
38 android:layout_centerVertical=“true”
39 />
40 <Button
41 android:layout_width=“wrap_content”
42 android:layout_height=“wrap_content”
43 android:layout_gravity=“right”
44 android:text=“登录”
45 android:layout_alignParentRight=“true”
46 android:onClick=“login”
47 />
48
49
50

复制代码

复制代码
1 package com.example.ahu_lichang.myapplication;
2
3 import android.os.Bundle;
4 import android.support.v7.app.AppCompatActivity;
5 import android.view.View;
6 import android.widget.CheckBox;
7 import android.widget.EditText;
8 import android.widget.Toast;
9
10 import java.io.BufferedReader;
11 import java.io.File;
12 import java.io.FileInputStream;
13 import java.io.FileOutputStream;
14 import java.io.InputStreamReader;
15 /**
16 * 在内存中读写文件中数据
17 /
18 public class MainActivity extends AppCompatActivity {
19 private EditText et_name;
20 private EditText et_pass;
21 @Override
22 protected void onCreate(Bundle savedInstanceState) {
23 super.onCreate(savedInstanceState);
24 setContentView(R.layout.activity_main);
25
26 et_name = (EditText) findViewById(R.id.et_name);
27 et_pass = (EditText) findViewById(R.id.et_pass);
28
29 readAccount();
30
31 }
32
33 /
*
34 * 从内存文件中读取数据
35 /
36 public void readAccount(){
37 File file = new File(“data/data/com.example.ahu_lichang.myapplication/info.txt”);//Tools->ADM->DDMS,在里面的文件浏览里能找到
38 if(file.exists()){
39 try {
40 FileInputStream fis = new FileInputStream(file);
41 //把字节流转换成字符流
42 BufferedReader br = new BufferedReader(new InputStreamReader(fis));
43 //读取txt文件里的用户名和密码
44 String text = br.readLine();
45 String[] s = text.split("##");
46
47 et_name.setText(s[0]);
48 et_pass.setText(s[1]);
49 } catch (Exception e) {
50 e.printStackTrace();
51 }
52 }
53 }
54 /
*
55 * 先登录,将name和pass保存在内存中
56 */
57 public void login(View v){
58
59 String name = et_name.getText().toString();
60 String pass = et_pass.getText().toString();
61
62 CheckBox cb = (CheckBox) findViewById(R.id.cb);
63 //判断选框是否被勾选
64 if(cb.isChecked()){
65 //data/data/com.ahu.androidtest:这就是内部存储空间的路径
66 File file = new File(“data/data/com.example.ahu_lichang.myapplication/info.txt”);
67 FileOutputStream fos;
68 try {
69 fos = new FileOutputStream(file);
70 fos.write((name + “##” + pass).getBytes());
71 fos.close();
72 } catch (Exception e) {
73 e.printStackTrace();
74 }
75 }
76
77 //创建并显示吐司对话框
78 Toast.makeText(this, “登录成功”, 0).show();
79 }
80 }

复制代码

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
读写SD卡中的文件(重点—Android studio实现)

注意:SD卡路径变化:
◦sdcard:2.3之前的
◦mnt/sdcard:4.3之前的
◦storage/sdcard:4.3之后的

1、必须先要创建虚拟SD卡文件镜像,然后添加到AVD中(或者用命令让指定模拟器在启动时增加虚拟SD卡镜像文件)。

1)、在Android studio使用mksdcard命令创建SD卡镜像文件:

adb shell

mksdcard 64M D:\sdcard.img -----在D:\目录下创建了一个64M大小的虚拟SD卡

2)、将SD卡镜像文件添加到模拟器中:

第一种方式:直接在创建AVD的时候,就想已有的SD卡镜像文件添加到模拟器中

第二种方式:使用命令让指定模拟器在启动时就添加SD卡镜像文件 emulator -avd AVD5.1 -sdcard D:\sdcard.img

2、在SD卡上先写入文件,然后在读取里面的数据显示在界面上

View Code

View Code
  3、添加权限:(在Android studio中读写SD卡上文件要添加创建与删除文件权限、写入数据权限,不需要读权限。eclipse中则是要添加读权限、写权限)

View Code

•获取SD的大小及可用空间

View Code

•文件的权限概念

文件的4种操作模式:
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND

Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件

Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。

MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。

如果希望文件被其他应用读和写,可以传入: 

openFileOutput(“itcast.txt”, Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);

android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,sharedpreferences,数据库都应该是私有的(位于/data/data//files),其他程序无法访问。除非在创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有这样其他程序才能正确访问。

•SharedPreferences存储方式(重点)

在SharedPreferences中文件读写数据:

View Code

•使用StringBuffer拼接字符串完成短信备份

View Code

View Code

•使用序列化器生成一个xml文件,完成短信备份

View Code

短信备份完成后,将SD卡中的xml文件pull出来,然后用浏览器打开该文件,就能很清晰的看见如下结果:

•使用pull解析xml格式的数据 (重要-AS实现)

注意:1、Android studio和eclipse中的资源文件的存放位置不一样

2、Android studio中获取资源文件的方法跟eclipse中不一样

先在main目录下新建文件夹assets,然后再将资源文件weather.xml。

View Code

编写要用到的javabean,City.java

View Code
  布局文件

View Code

最后编写用XmlPullParser解析XML文件的具体代码

View Code

运行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值