• Android基础2(包含测试、保存数据、获取目录等)


    #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;     }

  • 相关阅读:
    RHEL iptables
    搭建类似生产环境的RAC
    [大数据入门] Cloudera-Hadoop 理论
    js中的正则表达式【常用】
    html-css-js基本理解和简单总结
    python的socket.recv函数陷阱
    python异步编程--回调模型(selectors模块)
    python并发学习总结
    python描述符学习
    python网络编程基础
  • 原文地址:https://www.cnblogs.com/kingqinwang/p/5104529.html
Copyright © 2020-2023  润新知