Android应用开发之单元测试之白盒巧克力

360°全景影像移动端类库--PanoramaGL 介绍         本指南将介绍一个PanoramaGL 0.1类库的简单用法,更多的细节请签出HelloPanoramaGL示例查看。 细节 1如何导入PanoramaGL类库? 1.1从源代码中导入 a下载PanoramaGL_0.1.zip或从代码仓库下载源代码 b如果你下载zip文件然后解压该文件 c在Eclipse中导入PanoramaGL项目: 点击“File”选择“ 阅读详情

传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.youkuaiyun.com/leverage_1229

        今天我们学习如何在Android应用中进行单元测试,分别测试业务方法和日志系统,并且给出相关的log记录,下面给出该场景的案例。

1案例技术要点

(1)为了使你的应用程序支持单元测试功能,需要在清单文件(AndroidManifest.xml)中添加如下配置:

<uses-library android:name="android.test.runner" />
<instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="cn.lynn.testing" android:label="Tests for My App" />

(2)相关测试类需要继承android.test.AndroidTestCase类方可进行单元测试。

2案例代码陈列

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="cn.lynn.testing"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name="cn.lynn.testing.UnitTestingMainActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <uses-library android:name="android.test.runner" />
    </application>
    <uses-sdk android:minSdkVersion="8" />
    <instrumentation android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="cn.lynn.testing" android:label="Tests for My App" />

</manifest> 

strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Android应用单元测试</string>
</resources>

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" />

</LinearLayout>

业务服务类:PersonService.java

package cn.lynn.testing;

public class PersonService {

    public void save(String username) {
        System.out.println(username);
    }

    public int add(int a, int b) {
        return a + b;
    }
}

业务测试类:PersonServiceTest.java

package cn.lynn.testing;

import junit.framework.Assert;
import android.test.AndroidTestCase;

public class PersonServiceTest extends AndroidTestCase {

    public void testSave() throws Exception {
        PersonService service = new PersonService();
        service.save("lynnli1229");
    }

    public void testAdd() throws Exception {
        PersonService service = new PersonService();
        int actual = service.add(1, 2);
        Assert.assertEquals(8, actual);// 1+2等于8为true,否则为false
    }
}

日志测试类:LogTest.java

package cn.lynn.testing;

import android.test.AndroidTestCase;
import android.util.Log;

public class LogTest extends AndroidTestCase {
    private static final String TAG = "LogTest";

    public void testOutLog1() throws Throwable {
        Log.i(TAG, "www.csdn.cn");
    }

    public void testOutLog2() throws Throwable {
        System.out.println("www.csdn.cn");
    }

    public void testOutLog3() throws Throwable {
        System.err.println("www.sohu.cn");
    }

}

UnitTestingMainActivity.java

package cn.lynn.testing;

import android.app.Activity;
import android.os.Bundle;

public class UnitTestingMainActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

3案例效果展示

 

4案例日志输出

06-02 14:45:23.410: I/TestRunner(683): started: testAdd(cn.lynn.testing.PersonServiceTest)
06-02 14:45:23.460: I/TestRunner(683): finished: testAdd(cn.lynn.testing.PersonServiceTest)
06-02 14:45:23.460: I/TestRunner(683): passed: testAdd(cn.lynn.testing.PersonServiceTest)
06-02 14:45:23.511: I/TestRunner(683): started: testSave(cn.lynn.testing.PersonServiceTest)
06-02 14:45:23.529: I/TestRunner(683): finished: testSave(cn.lynn.testing.PersonServiceTest)
06-02 14:45:23.529: I/TestRunner(683): passed: testSave(cn.lynn.testing.PersonServiceTest)
06-02 14:45:23.599: I/TestRunner(683): started: testAndroidTestCaseSetupProperly(cn.lynn.testing.PersonServiceTest)
06-02 14:45:23.610: I/TestRunner(683): finished: testAndroidTestCaseSetupProperly(cn.lynn.testing.PersonServiceTest)
06-02 14:45:23.610: I/TestRunner(683): passed: testAndroidTestCaseSetupProperly(cn.lynn.testing.PersonServiceTest)
06-02 14:45:28.329: I/TestRunner(698): started: testAdd(cn.lynn.testing.PersonServiceTest)
06-02 14:45:28.369: I/TestRunner(698): failed: testAdd(cn.lynn.testing.PersonServiceTest)
06-02 14:45:28.390: I/TestRunner(698): ----- begin exception -----
06-02 14:45:29.199: I/TestRunner(698): junit.framework.AssertionFailedError: expected:<8> but was:<3>
06-02 14:45:29.199: I/TestRunner(698): 	at junit.framework.Assert.fail(Assert.java:47)
06-02 14:45:29.199: I/TestRunner(698): 	at junit.framework.Assert.failNotEquals(Assert.java:282)
06-02 14:45:29.199: I/TestRunner(698): 	at junit.framework.Assert.assertEquals(Assert.java:64)
06-02 14:45:29.199: I/TestRunner(698): 	at junit.framework.Assert.assertEquals(Assert.java:201)
06-02 14:45:29.199: I/TestRunner(698): 	at junit.framework.Assert.assertEquals(Assert.java:207)
06-02 14:45:29.199: I/TestRunner(698): 	at cn.lynn.testing.PersonServiceTest.testAdd(PersonServiceTest.java:16)
06-02 14:45:29.199: I/TestRunner(698): 	at java.lang.reflect.Method.invokeNative(Native Method)
06-02 14:45:29.199: I/TestRunner(698): 	at java.lang.reflect.Method.invoke(Method.java:521)
06-02 14:45:29.199: I/TestRunner(698): 	at junit.framework.TestCase.runTest(TestCase.java:154)
06-02 14:45:29.199: I/TestRunner(698): 	at junit.framework.TestCase.runBare(TestCase.java:127)
06-02 14:45:29.199: I/TestRunner(698): 	at junit.framework.TestResult$1.protect(TestResult.java:106)
06-02 14:45:29.199: I/TestRunner(698): 	at junit.framework.TestResult.runProtected(TestResult.java:124)
06-02 14:45:29.199: I/TestRunner(698): 	at junit.framework.TestResult.run(TestResult.java:109)
06-02 14:45:29.199: I/TestRunner(698): 	at junit.framework.TestCase.run(TestCase.java:118)
06-02 14:45:29.199: I/TestRunner(698): 	at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
06-02 14:45:29.199: I/TestRunner(698): 	at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
06-02 14:45:29.199: I/TestRunner(698): 	at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:520)
06-02 14:45:29.199: I/TestRunner(698): 	at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1447)
06-02 14:45:29.199: I/TestRunner(698): ----- end exception -----
06-02 14:45:29.319: I/TestRunner(698): finished: testAdd(cn.lynn.testing.PersonServiceTest)
06-02 14:45:29.361: I/TestRunner(698): started: testSave(cn.lynn.testing.PersonServiceTest)
06-02 14:45:29.369: I/System.out(698): lynnli1229
06-02 14:45:29.369: I/TestRunner(698): finished: testSave(cn.lynn.testing.PersonServiceTest)
06-02 14:45:29.369: I/TestRunner(698): passed: testSave(cn.lynn.testing.PersonServiceTest)
06-02 14:45:29.380: I/TestRunner(698): started: testAndroidTestCaseSetupProperly(cn.lynn.testing.PersonServiceTest)
06-02 14:45:29.390: I/TestRunner(698): finished: testAndroidTestCaseSetupProperly(cn.lynn.testing.PersonServiceTest)
06-02 14:45:29.390: I/TestRunner(698): passed: testAndroidTestCaseSetupProperly(cn.lynn.testing.PersonServiceTest)
06-02 14:40:09.460: I/TestRunner(635): started: testOutLog1(cn.lynn.testing.LogTest)
06-02 14:40:09.589: I/TestRunner(635): finished: testOutLog1(cn.lynn.testing.LogTest)
06-02 14:40:09.589: I/TestRunner(635): passed: testOutLog1(cn.lynn.testing.LogTest)
06-02 14:40:09.644: I/TestRunner(635): started: testOutLog2(cn.lynn.testing.LogTest)
06-02 14:40:09.650: I/TestRunner(635): finished: testOutLog2(cn.lynn.testing.LogTest)
06-02 14:40:09.659: I/TestRunner(635): passed: testOutLog2(cn.lynn.testing.LogTest)
06-02 14:40:09.699: I/TestRunner(635): started: testOutLog3(cn.lynn.testing.LogTest)
06-02 14:40:09.839: I/TestRunner(635): finished: testOutLog3(cn.lynn.testing.LogTest)
06-02 14:40:09.839: I/TestRunner(635): passed: testOutLog3(cn.lynn.testing.LogTest)
06-02 14:40:09.893: I/TestRunner(635): started: testAndroidTestCaseSetupProperly(cn.lynn.testing.LogTest)
06-02 14:40:09.900: I/TestRunner(635): finished: testAndroidTestCaseSetupProperly(cn.lynn.testing.LogTest)
06-02 14:40:09.900: I/TestRunner(635): passed: testAndroidTestCaseSetupProperly(cn.lynn.testing.LogTest)
06-02 14:40:14.709: I/TestRunner(650): started: testOutLog1(cn.lynn.testing.LogTest)
06-02 14:40:14.841: I/LogTest(650): www.csdn.cn
06-02 14:40:14.841: I/TestRunner(650): finished: testOutLog1(cn.lynn.testing.LogTest)
06-02 14:40:14.893: I/TestRunner(650): passed: testOutLog1(cn.lynn.testing.LogTest)
06-02 14:40:14.900: I/TestRunner(650): started: testOutLog2(cn.lynn.testing.LogTest)
如何高效使用和管理Bitmap--图片缓存管理模块的设计与实现 传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.youkuaiyun.com/leverage_1229         上周为360全景项目引入了图片缓存模块。因为是在Android4.0平台以上运作,出于惯性,都会设计之前查阅相关资料,尽量避免拿一些以前2.3平台积累的经验来进行类比处理。开发文档中有一个BitmapFun的示例,仔细拜读了一下,虽说围绕着Bitmap的方方面面讲 阅读详情

相关推荐

DM-VIO论文精读:从‘延迟边缘化’到‘位姿图BA’,手把手拆解单目VIO性能超越双目的秘密

本文深入解析DM-VIO技术如何通过延迟边缘化和位姿图BA创新,解决单目视觉惯性里程计(VIO)的尺度不可观性问题,并在精度上超越传统双目系统。文章详细介绍了延迟边缘化的双因子图结构设计、位姿图BA的多级初始化策略,以及系统级优化带来的性能提升,为VIO研究与实践提供了重要参考。

weixin_30616969的博客 427

Android 白盒测试之单元测试(junit),黑盒测试之mokey测试

导言: 做安卓也有几个年头,对于小项目基本都不去单元测试和稳定性测试等,都是在出现异常后通过debug处理或log打印即可解决,当然对于大的项目,由于运行时效问题,加快开发效率,一些测试方法必须要做,比如白盒测试之单元测试,最新的AS都集成了junit,还有黑盒测试(功能测试)之mokey测试,都已经集成,都可以直接使用,还有灰度集成测试,测试一些网络接口访问和异步任务等,本文只是笔录,没有什么技...

Aile 1675

esp32-C3固件烧录用户手册

温馨提示:1.esp32-C3 BOOT脚为GPIO9,需要从芯片小板中焊接引出2.芯片小板中已经预留了所有烧录相关的引脚,大家可以按需焊接引线3.程序下载完,使用串口查看log时,需要使用220v供电使用(请务必准守用电安全)。原因:由于插座中包含继电器,计量计等耗电设备,所以usb转串口提供的3.3V电压和电流可能会出现供电不足,表现为usb转串口与电脑连接断断续续,导致无法查看log。

hbwang的博客 1万+

Android单元测试研究与实践

Android单元测试介绍 处于高速迭代开发中的Android项目往往需要除黑盒测试外更加可靠的质量保障,这正是单元测试的用武之地。单元测试周期性对项目进行函数级别的测试,在良好的覆盖率下,能够持续维护代码逻辑,从而支持项目从容应对快速的版本更新。单元测试是参与项目开发的工程师在项目代码之外建立的白盒测试工程,用于执行项目中的目标函数并验证其状态或者结果,其中,单元指的是测试的最小...

美团技术团队 2275

从零到一:基于PX4+Gazebo+ROS2的无人机轨迹跟踪仿真环境全栈搭建

本文详细介绍了在Ubuntu 22.04系统上,从零开始搭建基于PX4、Gazebo Garden和ROS2 Humble的无人机轨迹跟踪仿真环境的完整流程。内容涵盖PX4 SITL编译、Gazebo安装、ROS2配置、Micro XRCE-DDS Agent通信桥接以及QGroundControl地面站部署,并提供了创建自定义ROS2节点实现圆形轨迹跟踪的实战代码与关键调试技巧,帮助开发者快速构建全栈仿真开发环境。

swift5iosmith的博客 915

测绘程序设计——试题一:出租车轨迹数据计算

仅展示试题1的原文,如需了解其余内容,请自行购买图书李老师著作主页-http://ybli.users.sgg.whu.edu.cn/book/

chengzilhc的博客 891

别再死记硬背波形了!用LTspice仿真带你直观理解LLC谐振变换器的三种工作模式

本文通过LTspice仿真工具深入解析LLC谐振变换器的三种工作模式(fs>fr、fs=fr、fr1<fs<fr),帮助工程师直观理解开关电源的工作原理。从基础模型搭建到高级参数扫描,提供详实的仿真步骤和故障排查技巧,助力开发者掌握LLC变换器的核心设计要点。

weixin_30384217的博客 325

基于BP神经网络PID控制的电机转速控制器设计复现

摘要:本文提出了一种基于BP神经网络PID控制的永磁同步电机转速控制方法,通过MATLAB/Simulink平台实现了算法复现。系统采用三层BP神经网络在线调整PID参数,包含输入层(误差、误差变化率、误差积分)、5节点隐含层和输出层(Kp、Ki、Kd)。仿真结果表明,相比传统PID控制,该方案具有更快的响应速度(上升时间减少约40%)、更小的超调量(降低约60%)和更强的抗干扰能力,在电动汽车电机驱动等复杂工况下表现优异。文中详细给出了PMSM数学模型建立、BP网络设计、权值更新算法及Simulink仿真

max500600的博客 307

Android Bitmap 全面解析(一) 加载大尺寸图片 ...

 压缩原因: 1.imageview大小如果是200*300那么加载个2000*3000的图片到内存中显然是浪费可耻滴行为; 2.最重要的是图片过大时直接加载原图会造成OOM异常(out of memory内存溢出) 所以一般对于大图我们需要进行下压缩处理 权威处理方法参考 安卓开发者中心的大图片处理教程 http://developer.android.com/tr

最帅的明天专栏 986

GPU架构(1.1)--介绍 GPU的 VPU(Vision Processing Unit)架构

基于自研的 VPU(Vision Processing Unit)架构,专为高性能图形处理和深度学习设计。VPU 架构通过优化计算单元、内存层次结构、同步机制和指令流水线,提供了卓越的性能和能效。VPU 架构通过优化计算单元、内存层次结构、同步机制和指令流水线,提供了卓越的性能和能效。这种架构不仅适用于高性能图形处理,还广泛应用于深度学习、科学计算和边缘计算等领域。通过了解 VPU 架构的详细设计和工作原理,读者可以更好地利用这些先进的 GPU 技术,开发出高效、可靠的计算系统。

MHD0815的博客 1300

手把手教你学Simulink——四开关 Buck‑Boost(FSBB)变换器的无缝模式切换仿真

本文详细介绍了四开关Buck-Boost(FSBB)变换器的Simulink仿真方法,重点解决模式切换时的直通风险和输出电压波动问题。通过统一电压PI控制、迟滞比较模式仲裁(Buck/Boost/Pass-Through)和200ns死区设计,实现了Vin从26V到22V变化时Vout稳定在12V±0.15V。关键步骤包括:搭建功率级电路、Stateflow模式判断、PI控制器输出占空比映射(Buck模式D≈Vo/Vin,Boost模式D≈1-Vo/Vin),以及带死区的PWM信号分配。仿真验证了切换过程中

MHD0815的博客 116

BitmapFactory.Options.inSampleSize 的用法

BitmapFactory.decodeFile(imageFile); 用BitmapFactory解码一张图片时,有时会遇到该错误。这往往是由于图片过大造成的。要想正常使用,则需要分配更少的内存空间来存储。 BitmapFactory.Options.inSampleSize 设置恰当的inSampleSize可以使BitmapFactory分配更少的空间以消除该错误。inS

hustpzb的专栏 3万+

学Simulink——基于Simulink的Buck-Boost变换器双闭环PI+抗饱和设计建模示例

本文详细介绍了基于Simulink的非反相Buck-Boost变换器双闭环控制设计方法。针对Buck-Boost变换器特有的右半平面零点(RHPZ)和控制挑战,提出了电压-电流双闭环PI控制架构,并集成抗积分饱和机制。通过Simulink建模,实现了主电路、电流内环PI、电压外环PI、PWM及占空比限幅等模块的搭建,验证了在输入电压跌落(20V→10V)和负载突变(2A→4A)等场景下的稳定性能。仿真结果表明,输出电压波动小于0.35V,恢复时间快于1ms,电感电流有效限幅。文章还讨论了工程实践要点和扩展方

xiaoheshang_123的博客 318

Android单元测试框架Robolectric3.0介绍(二)

Android,UT,单元测试,单元测试框架,Robolectric Android单元测试框架Robolectric3.0介绍(二)

bolang789的博客 991

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Android单元测试框架Robolectric3.0(二):数据篇

作者博客http://www.jianshu.com/u/9fa7fc2f3733源码地址https://github.com/geniusmart/LoveUT由于 Robolect...

陈宇明 310

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

我也不知道标题该怎么写2

Android基础 杂谈

motionEnabled 382

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Android应用开发之图片拖拉和多点触摸缩放

传送门☞轮子的专栏☞转载请注明☞http://blog.youkuaiyun.com/leverage_1229 今天我们学习如何实现图片(理论上选取的图片实际尺寸应大于当前手机的屏幕尺寸)拖拉和多点触摸缩放功能。其中多点触摸缩放功能模拟器上不支持,需要在真机下测试。下面给出该场景的案例: 1案例技术要点 (1)图片变换矩阵(android.graphics.Matrix...

weixin_30488085的博客 128

Android Instrumentation,单元测试,白盒测试,自动化测试

  Instrumentation和Activity有点类似,只不过Activity是需要一个界面的,而Instrumentation并不是这样的,我们可以将它理解为一种没有图形界面的,具有启动能力的,用于监控其他类(用Target Package声明)的工具类。   Android 测试环境的核心是一个Instrumentation框架,在这个框架下,你的测试应用程序可以精确控制应用程序。使用I...

ShareUs的专栏 1649

spring测试

模拟测试数据: Mock测试技术能够避免你为了测试一个方法,却需要自行构建整个依赖关系的工作,并且能够让你专注于当前被测试对象的逻辑,而不是其依赖的其他对象的逻辑 举例来说,比如你需要测试Foo.methodA,而这个方法依赖了Bar.methodB,又传递依赖到了Zoo.methodC,于是它们的依赖关系就是Foo->Bar->Zoo,所以在测试代码里你必须自行new Bar和Zoo

wang2963973852的博客 2112

Android单元测试遇到的问题

使用的框架:Robolectric 3.0 1. FileNotFoundException: build\intermediates\bundles\debug\AndroidManifest.xml (系统找不到指定的路径。) 解决方法:编辑configuration,设置工作目录到对应的module即可 2. 错误: 无法访问AndroidHttpClient 找不到

misea的专栏 9237

Android定制组件之图文展示之中国好声音

传送门 ☞ Android兵器谱 ☞ 转载请注明 ☞ http://blog.youkuaiyun.com/leverage_1229         今天我们学习如何自定义TextView组件,让它既能显示文本,又能显示图像,达到“图文并茂”的效果。这种情景在新闻、文章、彩信内容中很常见。下面给出该场景的案例: 一、案例技术要点 1.创建attrs.xml文件用于设置自定义组件的属性、类型和样式。

leverli的专栏 1万+

让你的Android应用与外部元素互动起来

一个Android应用程序通常有几个activities。每个act显示一个用户接口允许用户执行一个指定的任务。用户从一个act到另一个act,你的App必须使用一个Intent对象来定义你App想做些什么事。当你通过一个Intent调用startActivity()方法时,系统会使用Intent来鉴定和启动合适的App组件。一个Intent可以明确的启动一个特定的组件(如一个特定的act实例)或

leverli的专栏 1万+

Android倚天剑之Notification之动感地带

传送门 ☞ Android兵器谱 ☞ 转载请注明 ☞ http://blog.youkuaiyun.com/leverage_1229 传送门 ☞ 系统架构设计 ☞ 转载请注明 ☞ http://blog.youkuaiyun.com/leverage_1229 传送门 ☞ GoF23种设计模式 ☞ 转载请注明 ☞ http://blog.youkuaiyun.com/leverage_1229         前

leverli的专栏 9935
上一篇: Android定制组件之Widget之昨天今天明天
下一篇: Android应用开发之图片拖拉和多点触摸缩放
innovation
博客等级 码龄14年 251粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值