android之程序调试.docx
- 文档编号:9027226
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:37
- 大小:1.08MB
android之程序调试.docx
《android之程序调试.docx》由会员分享,可在线阅读,更多相关《android之程序调试.docx(37页珍藏版)》请在冰豆网上搜索。
android之程序调试
小安:
记得以前做Java开发的时候利用Junit进行测试,利用
System.out.println()方法可以在控制台打印信息,在Android平台下如何
进行单元测试和信息输出呢?
我对单元测试的用途还不太了解,博士您能给
我讲讲吗?
大致:
那接下来我带你学习如何对Android应用进行单元测试及日志输出吧。
使用单元测试可以保证我们开发应用的质量,一般我们开发完业务层代码之
后应该对业务层进行单元测试,确保业务层不出现Bug。
对业务层测试通过之
后,控制层就可以调用业务层完成需要的功能。
另外,单元测试会加快我们
开发的速度。
如果不进行单元测试,我们需要将应用发布到模拟器上之后,
再对应用中的各项功能进行测试,这样效率较低。
(本书后面的许多例子都会
进行单元测试,希望能够掌握单元测试的方法)
1单元测试与日志输出
1.1单元测试步骤
进行单元测试需要以下几步:
第一步:
首先在AndroidManifest.xml中加入下面粗体代码:
android=" package="cn.sharp.action"android: versionCode="1"android: versionName="1.0"> icon="@drawable/icon" android: label="@string/app_name"> name="android.test.runner"/> .... minSdkVersion="6"/> name="android.test.InstrumentationTestRunner" android: targetPackage="cn.sharp.action"android: label="TestsforMyApp"/> 说明: name="android.test.runner"/> 该行代码必须位于 上面targetPackage指定的包要和应用的package相同。 如果不相同,会出现找不到单 元测试用例的错误。 第二步: 编写单元测试代码 测试类必须继承自AndroidTestCase类 第三步: 执行测试。 1.2单元测试示例 1.创建项目 创建名为“UnitTestAndLog”的项目,如下图。 需要注意的是,由于我们在本项目中并不需要使用Activity,因此我们可以不创 建Activity,只需要将【CreateActivity】前面的单选框去除选定就可以不用输入 Activity名称。 如果去除选定,在项目包下就不会创建Activity。 当然你也可以输入 一个名称,虽然我们不会用到。 2.在功能清单文件中配置单元测试的环境 打开功能清单文件,添加上面所述的代码,最终代码如下。 AndroidManifest.xml xmlversion="1.0"encoding="utf-8"? > android=" package="com.sharpandroid.junit" android: versionCode="1" android: versionName="1.0"> icon="@drawable/icon"android: label="@string/app_name"> name="android.test.runner"/> minSdkVersion="7"/> name="android.test.InstrumentationTestRunner" android: targetPackage="com.sharpandroid.junit" android: label="TestsforMyApp"/> 3.新建测试用例 首先,在项目包位置,右键单击之后点击【New】【Class】,如下图所示。 点击【Class】之后到如下界面。 填入【Name】信息为MyTest。 下面的Superclass填写的方式如下,点击其后面的【Browse】,界面如下。 在【Chooseatype】下面的文本框中输入“androidtestcase”,点击【OK】。 之后再点击【Finish】完成测试用例的创建工作。 在AndroidTestCase测试中,我们采用的Junit3,因此测试方 法的书写格式是: publicvoidtestMethodName(){} 初学者常犯的错误时为测试方法添加参数。 一定要注意测试方法是不需要传入参数的。 如果测试方法内部遇到异常,建议直接抛出,而不要捕获异常。 异常抛出后会被测试框架获取,之后在控制台显示出来,方便我们了解异常信息。 测试类内容如下: MyTest.java packagecom.sharpandroid.unitandlog; importjunit.framework.Assert; importandroid.test.AndroidTestCase; importandroid.util.Log; publicclassMyTestextendsAndroidTestCase{ privatestaticfinalStringTAG="MyTest"; publicvoidtestSave()throwsThrowable{ inti=4+8; Assert.assertEquals(5,i); } } Assert类在此的作用是判断所得到的结果与期望值的关系。 这里判断i是否等于5;如 果相等则通过,不相等,则抛出异常。 4.运行测试用例 首先,进入“大纲视图”(Outline),如果Eclipse中没有该视图,可用如下图之方式 打开. 打开之后,其位置可能不太合意,可以用鼠标拖动它的标题栏到指定的位置。 其他的视 图也可采用拖动的方式拖动到其他位置上去。 现在可以运行测试用例了。 右键单击,之后【RunAs】【AndroidJUnitTest】,操作如下图所示。 运行完成,我们观察Junit的控制台。 结果如下图。 如上图,结果条显示为红色,说明测试没有通过。 下面将测试用例中的代码修改为“Assert.assertEquals(12,i);”之后再次运行。 如图,结果条显示为绿色,说明测试通过。 1.3日志输出 前面已经提到Console控制台只能输出应用安装的信息。 比如在程序中添加一行 System.out.println(“sharpandroid”); 如果在Eclipse中进行Java程序开发,该语句会在Console中打印。 但我们开发Android应用时,该语句在Console控制台中并不会打印出字符串。 该字符串会在LogCat中打印出来。 在Android程序中进行信息输出,一般采用android.util.Log类的静态方法就可以实现。 Log类所输出的日志的内容从少到多分别是ERROR、WARN、INFO、DEBUG、VERBOSE,对应五种不同类型的首字母,分别对应有Log.e()、Log.w()、Log.i()、Log.d()、Log.v()五种静态方法,使用不同的方法输出的信息的颜色各不相同,并且如下图,在Logcat控制台右上侧有相应的按钮 ,,点击每个按钮,可以过滤出其自身类型及其右侧类型的日志信息。 如点击 按钮,会显示I、W、E三种类型的信息,而V、D类型的信息则不会显示。 1.编写日志输出测试类 修改后的代码如下: packagecom.sharpandroid.unitandlog; importjunit.framework.Assert; importandroid.test.AndroidTestCase; importandroid.util.Log; publicclassMyTestextendsAndroidTestCase{ privatestaticfinalStringTAG="MyTest"; publicvoidtestSave()throwsThrowable{ inti=4+8; Log.i(TAG,"i="+i); Assert.assertEquals(12,i); } } 说明: .Log.i(Stringtag,Stringmsg); tag: 为这条信息定义一个标签,在开发时通常采用其所在类的类名,这样方便我们追踪输出的信息。 也方便我们在看到信息时知道其由哪个类输出。 msg: 该参数为希望输出的信息的内容。 一般将第一个参数定义成一个静态常量,按照JAVA语言的规范,静态常量的命名一般全部采用大写。 书写大写字母时不太习惯的,可以先书写为小写字母,再将其选中,在Eclipse中使用“Ctrl+Shift+X”快捷键将字符串变成大写。 使用“Ctrl+Shift+Y”恰好相反,将英文字符串变成小写。 第二步执行测试 执行的方法如同单元测试一节的执行测试方法。 打开日志信息查看器“LogCat”,查看是否输出该信息。 打开步骤如下图: 选择【LogCat】后,点击【OK】,此时观察Eclipse下方,出现LogCat控制台,如下图。 我们会发现里面输出的内容非常多,要找到我们在程序中打印的那句字符串比较困难, 在这里可以添加一个过滤器,来选取我们指定标记的信息。 其中标记为我们在调用 Log.i(TAG,"i="+i)中指定过的TAG,本例中即为“MyTest”。 添加过滤器方法如下。 点击上图中的“+”,弹出添加LogFilter界面,在其中填写信息如下图: 点击【OK】。 在LogCat管理器中多出一个选项卡“MyTest”,在该选项卡中出现我们在代码中想要打印的信息。 下面介绍下LogCat管理器中几个按钮的功能。 点击上图中的“V”、“D”、“I”、“W”、“E”,可以过滤出当前选项卡中的对应级别的信息。 如在Log选项卡下点击W键后结果如下图。 另外,LogCat控制台右侧有另外三个图标,其对应含义如下: 编辑过滤器 删除过滤器 清除日志信息 2揪出程序中的臭虫——程序调试示例 大致: 小安,前面咱们已经做三个项目了,我现在给你出一道题目,做一个 项目,项目的目标很简单,一个加法器,两个EditText用于输入两个数字, 点击一个Button之后在另一个EditText中显示结果。 怎么样? 有没有信心 搞定? 小安: 小菜一碟,您等着吧,我立马搞定。 嘿嘿! 下面是小安实现的全程实录。 1.创建工程 创建一个名为“DebugDemo”的工程,如下图: 2.编写main.xml: xmlversion="1.0"encoding="utf-8"? > xmlns: android=" android: orientation="horizontal" android: layout_width="fill_parent" android: layout_height="fill_parent"》 android: layout_width="60px" android: layout_height="wrap_content" android: id="@+id/num1" /> android: layout_width="wrap_content" android: layout_height="wrap_content" android: text="@string/add" /> android: layout_width="60px" android: layout_height="wrap_content" android: id="@+id/num2" /> android: layout_width="wrap_content" android: layout_height="wrap_content" android: text="@string/equ" /> android: layout_width="80px" android: layout_height="wrap_content" android: id="@+id/result" /> 3.编写DebugActivity.java: packagecom.sharpandroid.debug; importandroid.app.Activity; importandroid.os.Bundle; importandroid.view.View; importandroid.widget.Button; importandroid.widget.EditText; importandroid.widget.TextView; publicclassDebugActivityextendsActivity{ privateEditTextnum1Edit; privateEditTextnum2Edit; privateTextViewresultText; privateButtoncalButton; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); num1Edit=(EditText)findViewById(R.id.num1); num2Edit=(EditText)findViewById(R.id.num2); calButton=(Button)findViewById(R.id.calbutton); calButton.setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewv){ Stringnum1Str=num1Edit.getText().toString(); Stringnum2Str=num2Edit.getText().toString(); Stringresult=getResult(num1Str,num2Str); resultText.setText(result); } }); } publicStringgetResult(Stringnum1Str,Stringnum2Str){ floatnum1=Float.parseFloat(num1Str); floatnum2=Float.parseFloat(num2Str); floatresult=num1+num2; return""+result; } } 做完这些,小安信心十足,非常高兴,认为大致博士怎么搞这么简单的题目,自己这么快就搞定了,心中不免暗自得意。 于是执行程序,效果如下图: 这个情况让小安大跌眼镜了,怎么出现这么一个弹出框呢? 以为是系统的Bug呢,点击 【强行关闭】,之后又重复执行了几遍,谁知道Android一点面子都不给,还是坚持给了这么个提示。 把小安给急的满头大汗,心想这么简单的程序怎么就出错了呢? 这可如何是好? 只好向大致博士求救。 小安: 博士,这是怎么了? 弹出这么个玩意儿? 什么意思啊? 大致: 我看看啊,哎呀,小安呐,你这肯定是程序中什么地方写错啊。 别急别急,由于经验不足或者一些疏忽,在开发的道路上总会遇到这样或那样的问题,即便是一些具有多年开发经验的老手也会犯一些错误。 初学者往往会被程序中出现的错误弄得焦头烂额、手足无措,你也经常在论坛或者QQ群里见有初学者发一些“十万火急、跪求大侠指点迷津”等求救的帖子吧? 其实在本博士的法眼里多数错误是非常简单和低级的,是非常容易发现的,只是这些发帖的朋友缺少一种能力,一种成为真正程序员所必备的可谓安身立命的在这个行业闯荡的基本本领,这就是——调错能力。 犯了错误并不可怕,错误是难免的,问题是要及时发现错误修正错误,伟大的领袖曾经说过知错能改还是好同志。 因而如何发现错误、如何改正错误就非常重要,接下来我传授你一套绝招,教你如何利用Eclipse工具跟踪整个程序的运行状况以及对错误的调试及纠正,让你如同福尔摩斯般的侦查出程序中的蛛丝马迹,找到程序的bug,成为一个高手! 下面是小安在大致指导下的操作流程。 1.首先,检查了main.xml文件,仔细观察之后发现小安将EditText标签,误写成EditView了,于是全部修改为EditText。 并且输入框没有添加内容限制,这样不仅会在输入框中输入数字,也有可能输入汉字或者其他非数字型字符,因此在前两个输入框中添加了一个属性,指定输入的字符必须为小数(decimal)或整数(integer),语句如下: android: numeric="decimal" android: numeric="integer" 另外,显示结果的那个输入框不需要用户进行操作,因此可以将其设置为不获得焦点, 语句如下: android: focusable="false" 修改后的main.xml文件如下: xmlversion="1.0"encoding="utf-8"? > android=" android: orientation="horizontal" android: layout_width="fill_parent" android: layout_height="fill_parent" > android: layout_width="60px" android: layout_height="wrap_content" android: numeric="decimal" android: id="@+id/num1" /> android: layout_width="wrap_content" android: layout_height="wrap_content" android: text="@string/add" /> android: layout_width="60px" android: layout_height="wrap_content" android: numeric="integer" android: id="@+id/num2" /> android: layout_width="wrap_content" android: layout_height="wrap_content" android: text="@string/equ" /> android: layout_width="80px" android: layout_height="wrap_content" android: focusable="false" android: id="@+id/result />
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- android 程序 调试