没有Bug是任何产品上线前都无法达到的一个目标,包括拥有资深的测试工程师也不能保证上线后100%没问题,因为我们谁也不能把所有功能的操作、运用场景想周全,做周全。

虽然不能做到完全零缺陷,但是每次发布的产品,我们需要追求缺陷越来越少,产品投诉越来越少。

下面为大家总了一些App常见Bug以及解决处理方法,希望可以帮助到大家。

#No1.UI界面方面

录入界面

1.1 输入字段要完整,且要与列表字段相符合(参照数据库进行检查)

1.2 必填项一律在后面用*表示(必填项为空在处理之前要有相关的提示信息)

1.3 字段需要做校验,如果校验不对需要在处理之前要有相关的提示信息

(1) 长度校验

(2) 数字、字母、日期等等的校验

(3) 范围的校验

1.4 录入字段的排序按照流程或使用习惯,字段特别多的时候需要进行分组显示

1.5 下拉框不选值的时候应该提供默认值

1.6 相同字段的录入方式应该统一(手动输入 、点选 、下拉选择、参照)

1.7 录入后自动计算的字段要随着别的字段修改更新(如单价变后,金额也变)

1.8 日期参照应该既能输入,又能从文本框选择

界面格式

2.1 字体颜色、大小、对齐方式(根据字段的性质确定)、加粗的一致性

2.2 文本框、按钮、滚动条、列表等控件的大小、对齐、位置的一致性

2.3 所有新增、修改、查看页面加上页面说明(如:XXX新增、XXX编辑、XXX查看等说明字样),(弹出的)界面要有标题,标题与内容要一致

2.4 不同界面显示相同字段的一致性(如列表界面和编辑界面)

2.5 界面按钮显示要求(查询、新增、删除顺序)

2.6 列表的顺序排列应该统一(按照某些特定条件排序)

2.7 下拉框中的排列顺序需要符合使用习惯或者是按照特定的规则排定

2.8 所有弹出窗口居中显示或者最大化显示

2.9 信息列表中如果某个字段显示过长用“…”或者分行显示

2.10 人员、时间的缺省值一般取当前登录人员和时间

2.11 对于带有单位的字段,需要字段的标签后面添加如下内容:“(单位)”

功能问题

3.1 按钮功能的实现(如返回按钮能否返回)

3.2 信息保存提交后系统给出“保存/提交成功”提示信息,并自动更新显示

3.3 所有有提交按钮的页面都要有保存按钮(每个界面风格一致)

3.4 凡是点选或者下拉选择的界面,如果一旦选择完了无法回到不选择的情况,需要加上“清除选择”功能按钮

3.5 没有选择记录点击删除/修改按钮要提示“请先选择记录”

3.6 选择记录后点击删除按钮要提示“确实要删除吗?”

3.7 需要考虑删除的关联性,即删除某一个内容需要同时删除其关联的某些内容

3.8 界面只读的时候(查询、统计、导入)等,应该不能编辑

查询问题

4.1 查询条件缺少一些可以查询的字段

4.2 有些查询条件需要支持模糊查询

4.3 需要考虑有些查询条件本身的关联性(即某个查询条件的取值范围是依赖于其它查询条件的取值)

4.4 查询条件名称与信息列表及信息编辑页面相应的字段名称完全统一

4.5 不同模块相同字段的查询方式应该统一(手动输入 、点选 、下拉选择)

4.6 出报表的时候,查询条件需要显示在报表标题的下面,这样看报表的时候知道数据的依据是什么

4.7 对于范围的查询采用全闭的形式(如 [2006-1-1,2006-12-30])

#No2.异常报错汇总

1.android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application

解决方案:将getApplication改成xxxx.this

2.call you are unregister onbrocastRevicer?

解决方案:忘记注销广播

3.Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE表示某个应用没有卸载完成

4.出现launch Activtiy not found ?因为这个Activity没有写main 和luncher参数

5.R.java was removed! Recreating R.java!

6.com.process.acore 表示的是这个应用程序有电话拨号进程

7.android.database.CursorIndexOutOfBoundsException解决方案:原因是应该先调用cursor.moveToFirst();。

数据库查询得到的cursor里面只有1个结果,你却查找第-1个,肯定不对

8.launcher.apk启动程序在启动动画页面卡住,原因是开机动画很暂用cpu,如果luancher里面的某部分代码阻塞了,或者某个自定义view中部分代码太占用CPU导致的。

9.java.lang.IllegalStateException: The specified child al

ready has a parent. You must call removeView() on the child's parent first,表示是缺少对象,

解决方法:查找对象是否还在,要么就是多次事例化了

10.java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. [in ListView(2131230732, class android.widget.ListView) with Adapter(class com.cardroid.sdhc.medialist.SDMediaListAdapter)]

01-01 00:51:06.320: ERROR/AndroidRuntime(4035): at android.widget.ListView.layoutChildren(ListView.java:1492)

01-01 00:51:06.320: ERROR/AndroidRuntime(4035): at android.widget.AbsListView.onTouchEvent(AbsListView.java:2124)

01-01 00:51:06.320: ERROR/AndroidRuntime(4035): at android.widget.ListView.onTouchEvent(ListView.java:3315)

01-01 00:51:06.320: ERROR/AndroidRuntime(4035): at android.view.View.dispatchTouchEvent(View.java:3918)

01-01 00:51:06.320: ERROR/AndroidRuntime(4035): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:898)

01-01 00:51:06.320: ERROR/AndroidRuntime(4035): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:937)

01-01 00:51:06.320: ERROR/AndroidRuntime(4035): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:937)

解决方案:放入主线程中运行,因为此时这个LISTVIEW 加载ADAPTER是放入AsyTask里面运行的

11.Database( 2284): sqlite returned: error code = 14, msg = prepared

> statement aborts at 4: [DELETE FROM android_metadata]

> Database( 2284): DELETE failed setting locale

> Database( 2284): Failed to setLocale() when constructing, closing the

> database

> Database( 2284): android.database.sqlite.SQLiteException: unable to open

> database file

> Database( 2284): at

> android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)

> Database( 2284): at

> android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1950)

> Database( 2284): at

> android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1818)

> Database( 2284): at

> android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817)

> Database( 2284): at

> android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851)

> Database( 2284): at

> android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844)

> Database( 2284): at

> android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:542)

> Database( 2284): at

> android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)

> Database( 2284): at

> android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)

> Database( 2284): at

> android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:158)

> Database( 2284): at

> com.android.providers.media.MediaProvider.query(MediaProvider.java:1287)

> Database( 2284): at

> com.android.providers.media.MediaProvider.attachVolume(MediaProvider.java:3045)

> Database( 2284): at

> com.android.providers.media.MediaProvider.insertInternal(MediaProvider.java:1945)

> Database( 2284): at

> com.android.providers.media.MediaProvider.insert(MediaProvider.java:1665)

> Database( 2284): at android.content.ContentProvider

> $Transport.insert(ContentProvider.java:174)

> Database( 2284): at

> android.content.ContentResolver.insert(ContentResolver.java:587)

> Database( 2284): at

> com.android.providers.media.MediaScannerService.openDatabase(MediaScannerService.java:65)

> Database( 2284): at

> com.android.providers.media.MediaScannerService.scan(MediaScannerService.java:113)

> Database( 2284): at

> com.android.providers.media.MediaScannerService.access

> $400(MediaScannerService.java:53)

> Database( 2284): at com.android.providers.media.MediaScannerService

> $ServiceHandler.handleMessage(MediaScannerService.java:283)

> Database( 2284): at

> android.os.Handler.dispatchMessage(Handler.java:99)

> Database( 2284): at android.os.Looper.loop(Looper.java:123)

> Database( 2284): at

> com.android.providers.media.MediaScannerService.run(MediaScannerService.java:197)

> Database( 2284): at java.lang.Thread.run(Thread.java:1096)

> SQLiteOpenHelper( 2284): Couldn't open external.db for writing (will try

> read-only):

> SQLiteOpenHelper( 2284): android.database.sqlite.SQLiteException: unable

> to open database file

> SQLiteOpenHelper( 2284): at

> android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)

> SQLiteOpenHelper( 2284): at

> android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1950)

> SQLiteOpenHelper( 2284): at

> android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1818)

> SQLiteOpenHelper( 2284): at

> android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817)

> SQLiteOpenHelper( 2284): at

> android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851)

> SQLiteOpenHelper( 2284): at

> android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844)

> SQLiteOpenHelper( 2284): at

> android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:542)

> SQLiteOpenHelper( 2284): at

> android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)

> SQLiteOpenHelper( 2284): at

> android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)

> SQLiteOpenHelper( 2284): at

> android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:158)

> SQLiteOpenHelper( 2284): at

> com.android.providers.media.MediaProvider.query(MediaProvider.java:1287)

> SQLiteOpenHelper( 2284): at

> com.android.providers.media.MediaProvider.attachVolume(MediaProvider.java:3045)

> SQLiteOpenHelper( 2284): at

> com.android.providers.media.MediaProvider.insertInternal(MediaProvider.java:1945)

> SQLiteOpenHelper( 2284): at

> com.android.providers.media.MediaProvider.insert(MediaProvider.java:1665)

> SQLiteOpenHelper( 2284): at android.content.ContentProvider

> $Transport.insert(ContentProvider.java:174)

> SQLiteOpenHelper( 2284): at

> android.content.ContentResolver.insert(ContentResolver.java:587)

> SQLiteOpenHelper( 2284): at

> com.android.providers.media.MediaScannerService.openDatabase(MediaScannerService.java:65)

> SQLiteOpenHelper( 2284): at

> com.android.providers.media.MediaScannerService.scan(MediaScannerService.java:113)

> SQLiteOpenHelper( 2284): at

> com.android.providers.media.MediaScannerService.access

> $400(MediaScannerService.java:53)

> SQLiteOpenHelper( 2284): at

> com.android.providers.media.MediaScannerService

> $ServiceHandler.handleMessage(MediaScannerService.java:283)

> SQLiteOpenHelper( 2284): at

> android.os.Handler.dispatchMessage(Handler.java:99)

> SQLiteOpenHelper( 2284): at android.os.Looper.loop(Looper.java:123)

> SQLiteOpenHelper( 2284): at

> com.android.providers.media.MediaScannerService.run(MediaScannerService.java:197)

> SQLiteOpenHelper( 2284): at java.lang.Thread.run(Thread.java:1096)

解决方案:DBHELPER打开数据库的链接后,没有关闭,导致下次进入有问题,同时有的把数据库放入SDCARD,要加SDCARD的权限。

12.在LINUX下面出现R。JAVA文件不生成的时候,是因为SDK下面的platforms/android-8/tools要加权限,为了方便常用

platforms/android-8/tools$ chmod a+x *

13: 问题描述:E/WindowManager( 5523): android.view.WindowLeaked: Activity com.cardroid.sdhc.medialist.SDMediaListActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@30c45e38 that was originally added here

解决方案:即未能及时销毁某个PhoneWindow。当前Activity被关闭。而在关闭的同时,却没能及时的调用dismiss来解除对ProgressDialog等的引用,从而系统抛出了标题中的错误,而掩盖了真正导致这个错误的异常信息。需要在ONDESTORY方法时候关闭一些DIALOG。

14:问题描述,在拨打电话的时候配置文件中已经添加了权限,但是提示还需要添加权限requires android.permission.CALL_PHONE

W/dalvikvm( 5709): threadid=1: thread exiting with uncaught exception (group=0x40015568)

W/ActivityManager( 201): Permission Denial: starting Intent {

act=android.intent.action.CALL dat=tel:xxx-xxx-xxxx cmp=com.android.phone/.OutgoingCall

Broadcaster } from ProcessRecord{408c2550 5709:com.um.mplus/10072} (pid=5709, uid=10072)

requires android.permission.CALL_PHONE

E/AndroidRuntime( 5709): FATAL EXCEPTION: main

E/AndroidRuntime( 5709): java.lang.SecurityException: Permission Denial: starting Intent {

act=android.intent.action.CALL dat=tel:xxx-xxx-xxxx cmp=com

.android.phone/.OutgoingCallBroadcaster } from ProcessRecord{408c2550

5709:com.um.mplus/10072} (pid=5709, uid=10072) requires android.permission.CALL_PHONE

解决问题:因为这个权限,有的系统级别作了限制,所以,添加抓取异常就可以了。

#No3.开发类常见问题汇总

1. 如果你的项目的R文件不见的话,可以试下改版本号在保存,R文件不见一般都是布局文本出错导致.

2. 布局文件不可以有大写字母

3. 抛出如下错误WARNING: Application does not specify an API level requirement!,

是由于没有指定users sdk的缘故,修改AndroidManifest.xml文件.

加入:<uses-sdkandroid:minSdkVersion=\"8\"></uses-sdk>

4. 机器内存的瓶颈,当apk大于我们的机器内存时,模拟器无情的抛出

Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE Please check logcat output for more details. Launch canceled!

让我们无法调试,现在我们来根治这个问题,解决方法有两种

第一种(仅限apk小于机器内存,并且已安装上当前apk,只是无法再次debug)

启动模拟器,然后进入菜单

settings->applications->mange

applications-> select the application->select \"unistall\".

这样就能彻底删除了,然后再重新安装这个apk就没问题了

第二种(通用)

-partition-size 128

Eclipse中在项目Target的Options中添加。

5. 启动android模拟器时候如果提示:Failed to install on device ‘emulator-5554′: timeout

这是可能因为卡的原因导致启动超时,解决办法:eclipse -> window -> Preferences -> Android -> DDMS -> ADB connection time out(ms).把这个时间设置的长一些,默认是5秒即5000ms, 我改成10秒就ok了。

这样就不用每次重启模拟器了。具体时间设置根据实际环境需要

6. 在开发的过程中经常在安装apk到模拟器上时会报出

ActivityManager: Error: Activity class {..} does not exist.

这样的错误,这里总结两种解决方式:

在AndroidManifest.xml文件中查看主Activity的名字前是否有'.'符

7.运行Eclipse时出现了这个错误

No Launcher activity found!

The launch will only sync the application package on the device!

解决办法

在AndroidManifest.xml 中添加

<category android:name=\"android.intent.category.LAUNCHER\" />

8.出现如下错误,没有写入sd卡权限 java.io.FileNotFoundException: /mnt/sdcard/update.zip (Permission denied)

解决办法,资源文件写入如下权限

<uses-permissionandroid:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>

Testin云测送大家一波超级福利!

① 价值5000元的Testin专属测试大礼包(包含120分钟自动化测试、120分钟远程真机调试、每日免费使用1次标准兼容测试、每日免费使用1次安全测试);

② 原51testing产品总监陈霁老师16年测试工作总结精华 -《软件测试入门必读》课程。

如何获取福利?

登陆或者注册您的Testin账号进行企业认证,完成认证自动获得福利大礼包,认证请戳——> http://www.testin.cn

更多精彩内容:

为什么程序员找不出自己的BUG?

9个因Bug引发的巨大灾难

如何组建一支高效的测试团队

测试员=背锅侠?测试员:这个锅我不背