Android测试&权限机制&数据存储

 

测试

  • 黑盒测试 -测试人员不知道源代码
  • 白盒测试 -测试人员知道源代码,能写一些测试用例

根据测试的粒度

  • 方法测试 function test

  • 单元测试 unit test junit测试框架

  • 集成测试 integration test

  • 系统测试 system test

根据测试的暴力程度

  • 冒烟测试 smoke test
  • 压力测试 pressure test

单元测试框架(JUnit)

Android代码只能运行在手机中的Dalvik虚拟机里,在PC机的JVM下会报错异常,写测试用例,通常把上传到Android手机或模拟器中运行。

Android下单元测试流程

  • 1.写业务逻辑代码

  • 2.写测试用例继承AndroidTestCase类

  • 3.写测试方法public void testAdd() throw Exception{}

  • 4.配置清单文件

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.itheima.junit"
    android:versionCode="1"
    android:versionName="1.0" >
    
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
    <!-- 在根节点 manifest节点下放置  指令集 instrumentation -->
    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:label="Tests for My App"
        android:targetPackage="com.itheima.junit" />
    
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
       <!--  使用的函数库  application节点的下面-->
    <uses-library android:name="android.test.runner" />
    <activity
        android:name="com.itheima.junit.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
    
    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    </activity>
    </application>
    </manifest>
    
  • 5.选中测试方法,右键Run as -->Android JUnit Test

LogCat

LogCat面板

  • Filter过滤器

日志等级

  • verbose 提醒 黑色
  • debug 调试 蓝色
  • info 信息 绿色
  • warn 警告 橙色
  • error 错误 红色

天天就爱撸代码~~

  • 注意配置合适的权限
  • 写sd卡 必须要声明权限的.如: 写文件,删除文件
  • 读sd卡 默认是不需要权限的.
  • 如果用户设置了读取sd卡必须使用权限,应用程序需要加上权限
  • 基本概念: 手机内部存储空间, 手机的一块微硬盘,手机内存 ROM 断电了, 数据还是存在的 手机内存: 相当于电脑上的内存条 RAM 断点数据就没了. 外部存储空间: sd卡

保存数据到sdcard

//获取sdcard剩余空间
long usableSpace = Environment.getExternalStorageDirectory().getUsableSpace();
// 获取外置sdcard目录
File path = Environment.getExternalStorageDirectory();
// 获取sdcard的状态(是否挂载)
String state = Environment.getExternalStorageState();

保存数据到内部存储设备(应用私有文件夹,不需要写入权限)(安全)

每一个安装的应用程序 默认情况下操作系统都会给这个应用程序分配一个单独的用户私有的文件,别的应用程序是不可以读取/修改的。

  • 应用私有文件夹默认情况下,其他应用无法访问,保证其数据安全
  • 应用私有文件路径:/data/data/包名/
  • 获取路径方法:

    File path = 当前类名.this.getFilesDir();//获取目录是会自动创建files文件夹
                     Context.getFilesDir();
    
    返回:/data/data/包名/files
    
  • 获取临时缓存目录cache:

    File path = 当前类名.this.getCacheDir();
                     Context.getCacheDir();
    
    返回:/data/data/包名/cache
    

(文件&文件夹)权限机制

MainActivity.this.openFileOutput("private.txt", MODE_PRIVATE);

参数1:文件

参数2:

  MODE_PRIVATE 私有文件(不可读写)

  MODE_WORLD_READABLE 只读文件

  MODE_WORLD_WRITEABLE 只写文件

  MODE_WORLD_READABLE + MODE_WORLD_WRITEABLE 可读写文件

一个应用读取另一个应用的私有文件夹下的文件:

    * 私有文件:没有权限
    * 可读文件:可读
    * 可写文件:没有权限
    * 可读可写文件:可读

一个应用写入另一个应用的私有文件夹下的文件:

    * 私有文件:没有权限
    * 可读文件:没有权限
    * 可写文件:可写
    * 可读可写文件:可写

权限表示:0 123 456 789

0 表示文件类型:l(小写L)软连接,d 表示文件夹,- 表示文件
1 4 7 表示是否可读。r 可读,- 不可读
2 5 8 表示是否可写。w 可写,- 不可写
3 6 9   表示是否可执行。x 可执行,- 不可执行(一般用于开发人员常用的二进制可执行程序)

权限分组

123:应用权限,用户权限

456:所在组其他用户权限

789:其他应用,其他用户

权限值:

    r 权限值对应 4
    w 权限值对应 2
    - 权限值对应 1

更改权限命令示例:

chmod 777 file.txt 更改文件权限全局可读可写可执行

XML解析

解析步骤:

    // 获取资产管理器
    AssetManager am = this.getAssets();
    try {
    /***************************************/
        // 1. 读取xml数据
        InputStream is = am.open("weather.xml");
    /***************************************/
        // 2. 解析数据(pull解析,Android下的XML解析方式)
        // 2.1创建XML解析器
        XmlPullParser parser = Xml.newPullParser();
        // 2.2初始XML化解析器,指定解析哪个流,以什么编码解析
        parser.setInput(is, "UTF-8");
        // 2.3解析XML数据
        int type = parser.getEventType();

        while (type == XmlPullParser.START_TAG) {
            String str = parser.nextText();
                }
            }
    …………………………
    /***************************************/
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally{
    /***************************************/
        //关闭数据流
        try {
            is.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        };
    }

Android下XML生成(序列化)

XML保存数据

    …………
    // 获取应用私有目录临时缓存目录
    File path = MainActivity.this.getCacheDir();
    FileOutputStream fos = new FileOutputStream(new File(path,
            "info.xml"));
/***************************************/
    // a.创建Xml序列化器
    XmlSerializer serializer = Xml.newSerializer();
/***************************************/
    // b.初始化Xml序列化器设置输出流,和编码方式
    serializer.setOutput(fos, "UTF-87");
/***************************************/
    // c.写入xml数据
    //文档开头
    serializer.startDocument("UTF-8", true);

        serializer.startTag(null, "info");

            serializer.startTag(null, "qq");
            serializer.text(qq);
            serializer.endTag(null, "qq");

            serializer.startTag(null, "pw");
            serializer.text(pw);
            serializer.endTag(null, "pw");

        serializer.endTag(null, "info");
    //文档结束      
    serializer.endDocument();
    …………
/***************************************/
    //关闭流
    fos.close();
    …………

大招:SharedPreferences封装/读取XML数据

SharedPreferences保存数据(保存位置:/data/data/包名/shared_prefs/xxx.xml)

            // 获取应用私有目录临时缓存目录
            File path = MainActivity.this.getCacheDir();
            FileOutputStream fos = new FileOutputStream(new File(path,
                    "info.xml"));
/***************************************/
            //初始化SharedPreferences
            SharedPreferences sp = this.getSharedPreferences("config", MODE_PRIVATE);
/***************************************/
            //通过SharedPreferences获取编辑器
            Editor ed =sp.edit();
/***************************************/
            //写入数据
            ed.putString("qq",qq);
            ed.putString("pw",pw);
/***************************************/
            //提交数据
            ed.commit();
/***************************************/
            //关闭流
            fos.close();
            …………

SharedPreferences读取XML数据

        //初始化SharedPreferences
        SharedPreferences sp2 = this.getSharedPreferences("config", MODE_PRIVATE);
        //读取数据
        sp2.getString("qq", "");
        ……
        sp2.getXXX(key, defValue);

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。