Facebook Twitter LinkedIn E-mail
magnify
Home Posts tagged "测试"

Android 不通过USB数据线调试的方法

在开发Android应用时,通常情况下是通过USB数据线连接设备和计算机,但对于一些需要使用USB设备的应用,这种方法就碰到了麻烦,手机的USB接口已经和外接的USB设备连接,无法再连数据线,此时可以通过网络TCPIP的方法来进行。也就是然ADB 通过网络来连接设备,而无需USB数据线。

具体方法如下:

1.  使用USB数据线连接设备。

2.  在命令行输入adb tcpip 5555 ( 5555为端口号,可以自由指定)。

3. 断开 USB数据,此时可以连接你需要连接的|USB设备。

4. 再计算机命令行输入  adb connect <设备的IP地址>:5555

后面就可以使用ADB ,DDMS 来调试Android应用或显示Logcat 消息。

5. 如果需要恢复到USB数据线,可以在命令行输入adb usb

注: Android设备的IP地址可以在Settings->About Phone->Status 查到

 

Android测试教程(18):总结

前面基本介绍完了Android测试框架,它是以JUnit为基础,添加了针对Android的TestCase扩展,其中Instrumentation类是非常重要的一个类,它可以直接控制Activity的生命周期,测试的内容除应用的功能,单元测试外,也需要针对屏幕切换(横屏于竖屏转换),系统配置变更(如语言等),电池容量变换以及是否依赖于网络,SD卡等外部资源进行测试。

  1. Android测试教程(1):概述
  2. Android测试教程(2):测试基础
  3. Android测试教程(3):测试项目
  4. Android测试教程(4):测试相关API
  5. Android测试教程(5):第一个测试项目HelloWorldTest
  6. Android测试教程(6):测试Activity
  7. Android测试教程(7):测试Content Provider
  8. Android测试教程(8):测试Service
  9. Android测试教程(9):ApplicationTestCase示例
  10. Android测试教程(10):ActivityInstrumentationTestCase2示例(1)
  11. Android测试教程(11):ActivityUnitTestCase示例
  12. Android测试教程(12):ServiceTestCase示例
  13. Android测试教程(13):TestCase示例
  14. Android测试教程(14):ActivityInstrumentationTestCase2示例(2)
  15. Android测试教程(15):AndroidTestCase示例
  16. Android测试教程(16):monkeyrunner简介
  17. Android测试教程(17):Monkey 命令行工具
 

Android测试教程(17):Monkey 命令行工具

写完应用之后,作完单元测试和功能测试,有必要对应用的抗打击能力做个测试,最好的方法是雇个“猴子”在测试,猴子可以胡乱瞎按键,在这种情况下,你的应用是否还能正常工作呢?

Android 测试包中提供了一个Monkey工具,就提供了“猴子”功能,不过比真”猴子“还要智能一些,你还可以指挥这个猴子, 比如按键的比例,触发某个事件的频率等等。

一个简单的用法,比如你的应用程序的包名为:com.pstreets.navigator

可以使用  adb shell monkey -p com.pstreets.navigator -v 500

使用缺省的配置 向应用发送500 个随机事件(包括按键,touch事件,系统事件等),该命令会首先启动对应的Activity,然后向该应用发送随机事件:

Monkey工具的详细说明如下:

它是一个命令行工具 ,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流,实现对正在开发的应用程序进行压力测试。Monkey包括许多选项,它们大致分为四大类:

· 基本配置 选项,如设置尝试的事件数量。
· 运行约束选项,如设置只对单独的一个包进行测试。
· 事件类型 和频率。
· 调试选项。

在Monkey运行的时候,它生成事件,并把它们发给系统。同时,Monkey还对测试中的系统进行监测,对下列三种情况进行特殊处理:
· 如果限定了Monkey运行在一个或几个特定的包上,那么它会监测试图转到其它包的操作,并对其进行阻止。
· 如果应用程序崩溃或接收到任何失控异常 ,Monkey将停止并报错。
· 如果应用程序产生了应用程序不响应(application not responding)的错误,Monkey将会停止并报错。
按照选定的不同级别的反馈信息,在Monkey中还可以看到其执行过程报告和生成的事件。
Monkey基本用法

可以通过开发机器上的命令行或脚本来启动Monkey。由于Monkey运行在模拟器/设备环境中,所以必须用其环境中的shell来进行启动。可以通过在每条命令前加上adb shell来达到目的,也可以进入Shell后直接输入Monkey命令。基本语法如下:
$ adb shell monkey [options]
如果不指定options,Monkey将以无反馈模式启动,并把事件任意发送到安装 在目标环境中的全部包。下面是一个更为典型的命令行示例,它启动指定的应用程序,并向其发送500个伪随机事件:
$ adb shell monkey -p your.package.name -v 500
–v
命令行的每一个 -v 将增加反馈信息的级别。 Level 0( 缺省值 ) 除启动提示、测试完成和最终结果之外,提供较少信息。 Level 1 提供较为详细的测试信息,如逐个发送到 Activity 的事件。 Level 2 提供更加详细的设置信息,如测试中被选中的或未被选中的 Activity 。
事件
-s <seed>
伪随机数生成器的 seed 值。如果用相同的 seed 值再次运行 Monkey ,它将生成相同的事件序列。
–throttle <milliseconds>
在事件之间插入固定延迟。通过这个选项可以减缓 Monkey 的执行速度。如果不指定该选项, Monkey 将不会被延迟,事件将尽可能快地被产成。
–pct-touch <percent>
调整触摸事件的百分比 ( 触摸事件是一个 down-up 事件,它发生在屏幕上的某单一位置 ) 。
–pct-motion <percent>
调整动作事件的百分比 ( 动作事件由屏幕上某处的一个 down 事件、一系列 的伪随机事件和一个 up 事件组成 ) 。
–pct-trackball <percent>
调整轨迹事件的百分比 ( 轨迹事件由一个或几个随机的移动组成,有时还伴随有点击 ) 。
–pct-nav <percent>
调整“基本”导航事件的百分比 ( 导航事件由来自方向输入设备的 up/down/left/right 组成 ) 。
–pct-majornav <percent>
调整“主要”导航事件的百分比 ( 这些导航事件通常引发图形界面中的动作,如: 5-way 键盘的中间按键、回退按键、菜单按键 )
–pct-syskeys <percent>
调整“系统”按键事件的百分比 ( 这些按键通常被保留,由系统使用,如 Home 、 Back 、 Start Call 、 End Call 及音量控制键 ) 。
–pct-appswitch <percent>
调整启动 Activity 的百分比。在随机间隔里, Monkey 将执行一个 startActivity () 调用,作为最大程度覆盖包中全部 Activity 的一种方法。
–pct-anyevent <percent>
调整其它类型事件的百分比。它包罗了所有其它类型的事件,如:按键、其它不常用的设备按钮、等等。
约束限制
-p <allowed-package-name>
如果用此参数指定了一个或几个包, Monkey 将只允许系统启动这些包里的 Activity 。如果你的应用程序还需要访问其它包里的 Activity( 如选择取一个联系人 ) ,那些包也需要在此同时指定。如果不指定任何包, Monkey 将允许系统启动全部包里的 Activity 。要指定多个包,需要使用多个 -p 选项,每个 -p 选项只能用于一个包。
-c <main-category>
如果用此参数指定了一个或几个类别, Monkey 将只允许系统启动被这些类别中的某个类别列出的 Activity 。如果不指定任何类别, Monkey 将选择下列类别中列出的 Activity : Intent.CATEGORY_LAUNCHER 或 Intent.CATEGORY_MONKEY 。要指定多个类别,需要使用多个 -c 选项,每个 -c 选项只能用于一个类别。
调试
–dbg-no-events
设置此选项, Monkey 将执行初始启动,进入到一个测试 Activity ,然后不会再进一步生成事件。为了得到最佳结果,把它与 -v 、一个或几个包约束、以及一个保持 Monkey 运行 30 秒或更长时间的非零值联合起来,从而提供一个环境,可以监视应用程序所调用的包之间的转换。
–hprof
设置此选项,将在 Monkey 事件序列之前和之后立即生成 profiling 报告。这将会在 data/misc 中生成大文件 (~5Mb) ,所以要小心使用它。
–ignore-crashes
通常,当应用程序崩溃或发生任何失控异常时, Monkey 将停止运行。如果设置此选项, Monkey 将继续向系统发送事件,直到计数完成。
–ignore-timeouts
通常,当应用程序发生任何超时错误 ( 如“ Application Not Responding ”对话框 ) 时, Monkey 将停止运行。如果设置此选项, Monkey 将继续向系统发送事件,直到计数完成。
–ignore-security-exceptions
通常,当应用程序发生许可错误 ( 如启动一个需要某些许可的 Activity) 时, Monkey 将停止运行。如果设置了此选项, Monkey 将继续向系统发送事件,直到计数完成。
–kill-process-after-error
通常,当 Monkey 由于一个错误而停止时,出错的应用程序将继续处于运行状态。当设置了此选项时,将会通知系统停止发生错误的进程。注意,正常的 ( 成功的 ) 结束,并没有停止启动的进程,设备只是在结束事件之后,简单地保持在最后的状态。
–monitor-native-crashes
监视并报告 Android 系统中本地代码的崩溃事件。如果设置了 –kill-process-after-error ,系统将停止运行。
–wait-dbg
停止执行中的 Monkey ,直到有调试器和它相连接。

 

Android测试教程(16):monkeyrunner简介

如果你需要实现自动测试,Android的monkeyrunner 工具可以帮助你实现自动测试,它提供了一组API可以用来控制Android设备或模拟器,使用monkeyrunner,你可以编写Python 程序来安装Android应用或是测试包,运行应用或测试,发送按键消息,并可以截屏,然后保存在计算机中。monkeyrunner 主要目的是用来在应用程序或框架层次来测试应用程序或运行单元测试包,但你也可以用作其它目的。

monkeyrunner 工具包不同于UI/Application Exerciser Monkey(也称为Money),money 通过adb shell 来运行,可以模拟“猴子”随机按键或是发送系统消息给指定的应用来实现Stress 测试。

monkeyrunner API 主要通过下面三个包:

  • MonkeyRunner: 主要提供了monkeyrunner 应用的辅助方法以及,用来链接设备或是模拟器的方法,并提供UI支持等。
  • MonkeyDevice: 代表一个设备或是模拟器,提供安装,卸载应用的方法,启动一个Activity,发送按键或是Touch 事件等。
  • MonkeyImage: 代表一个截屏图像,可以截取不同格式的图像,比较两个MonkeyImage图像,保存图像等。

下面为一个 Python 写的monkeyrunner 应用, 因为涉及到Python 语言,这里不详细说明了

# Imports the monkeyrunner modules used by this program
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice

# Connects to the current device, returning a MonkeyDevice object
device = MonkeyRunner.waitForConnection()

# Installs the Android package. Notice that this method returns a boolean,
# so you can test to see if the installation worked.
device.installPackage('myproject/bin/MyApplication.apk')

# sets a variable with the package's internal name
package = 'com.example.android.myapplication'

# sets a variable with the name of an Activity in the package
activity = 'com.example.android.myapplication.MainActivity'

# sets the name of the component to start
runComponent = package + '/' + activity

# Runs the component
device.startActivity(component=runComponent)

# Presses the Menu button
device.press('KEYCODE_MENU','DOWN_AND_UP')

# Takes a screenshot
result = device.takeSnapshot()

# Writes the screenshot to a file
result.writeToFile('myproject/shot1.png','png')

详细的API说明请参考Android文档 ,如果你需要实现自动测试,编写测试代码,可以使用Python通过monkeyrunner API来实现。

 

Android测试教程(15):AndroidTestCase示例

AndroidTestCase 为一Android平台下通用的测试类,它支持所有JUnit的Assert方法和标准的setUp 和tearDown 方法。如果你的测试需要访问应用的资源或者测试方法依赖于Context,可以使用AndroidTestCase 作为基类。

它的类继承关系如下图所示:

Focus2AndroidTest 测试也是Android ApiDemos示例解析(116):Views->Focus->2. Horizontal

但测试的侧重点不一样,Focus2AndroidTest 测试的内容无需启动Activity,而是测试R.layout.focus_2 的布局(资源)中Focus 的顺序是否符合预先设计(可以看作是Activity的一些静态性能),可以通过FocusFinder的方法来测试Focus的一些静态属性,它的代码如下:

public class Focus2AndroidTest
 extends AndroidTestCase {

 private FocusFinder mFocusFinder;

 private ViewGroup mRoot;

 private Button mLeftButton;
 private Button mCenterButton;
 private Button mRightButton;

 @Override
 protected void setUp() throws Exception {
 super.setUp();

 mFocusFinder = FocusFinder.getInstance();

 // inflate the layout
 final Context context = getContext();
 final LayoutInflater inflater = LayoutInflater.from(context);
 mRoot = (ViewGroup) inflater.inflate(R.layout.focus_2, null);

 // manually measure it, and lay it out
 mRoot.measure(500, 500);
 mRoot.layout(0, 0, 500, 500);

 mLeftButton = (Button) mRoot.findViewById(R.id.leftButton);
 mCenterButton = (Button) mRoot.findViewById(R.id.centerButton);
 mRightButton = (Button) mRoot.findViewById(R.id.rightButton);
 }


 @SmallTest
 public void testPreconditions() {
 assertNotNull(mLeftButton);
 assertTrue("center button should be right of left button",
 mLeftButton.getRight() < mCenterButton.getLeft());
 assertTrue("right button should be right of center button",
 mCenterButton.getRight() < mRightButton.getLeft());
 }

 @SmallTest
 public void testGoingRightFromLeftButtonJumpsOverCenterToRight() {
 assertEquals("right should be next focus from left",
 mRightButton,
 mFocusFinder.findNextFocus(mRoot, mLeftButton,
 View.FOCUS_RIGHT));
 }

 @SmallTest
 public void testGoingLeftFromRightButtonGoesToCenter() {
 assertEquals("center should be next focus from right",
 mCenterButton,
 mFocusFinder.findNextFocus(mRoot, mRightButton,
 View.FOCUS_LEFT));
 }
}

testGoingRightFromLeftButtonJumpsOverCenterToRight 和 testGoingLeftFromRightButtonGoesToCenter

通过mFocusFinder 的 findNextFocus 来测试 mLeftButton,mRightButton 的下个可以获取焦点的控件是否符合事先的设计。

 

Android测试教程(14):ActivityInstrumentationTestCase2示例

ActivityInstrumentationTestCase2 用来测试单个的Activity,被测试的Activity可以使用InstrumentationTestCase.launchActivity 来启动,然后你能够直接操作被测试的Activity。

ActivityInstrumentationTestCase2 也支持:

  • 可以在UI线程中运行测试方法.
  • 可以注入Intent对象到被测试的Activity中

ActivityInstrumentationTestCase2 取代之前的ActivityInstrumentationTestCase ,新的测试应该使用ActivityInstrumentationTestCase2作为基类。

Focus2ActivityTest 的代码如下,用于测试Android ApiDemos示例解析(116):Views->Focus->2. Horizontal

public class Focus2ActivityTest
 extends ActivityInstrumentationTestCase2<Focus2> {

 private Button mLeftButton;
 private Button mCenterButton;
 private Button mRightButton;

 public Focus2ActivityTest() {
 super("com.example.android.apis", Focus2.class);
 }

 @Override
 protected void setUp() throws Exception {
 super.setUp();
 final Focus2 a = getActivity();
 mLeftButton = (Button) a.findViewById(R.id.leftButton);
 mCenterButton = (Button) a.findViewById(R.id.centerButton);
 mRightButton = (Button) a.findViewById(R.id.rightButton);
 }


 @MediumTest
 public void testPreconditions() {
 assertTrue("center button should be right of left button",
 mLeftButton.getRight() < mCenterButton.getLeft());
 assertTrue("right button should be right of center button",
 mCenterButton.getRight() < mRightButton.getLeft());
 assertTrue("left button should be focused", mLeftButton.isFocused());
 }

 @MediumTest
 public void testGoingRightFromLeftButtonJumpsOverCenterToRight() {
 sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
 assertTrue("right button should be focused", mRightButton.isFocused());
 }

 @MediumTest
 public void testGoingLeftFromRightButtonGoesToCenter()  {

 getActivity().runOnUiThread(new Runnable() {
 public void run() {
 mRightButton.requestFocus();
 }
 });
 // wait for the request to go through
 getInstrumentation().waitForIdleSync();

 assertTrue(mRightButton.isFocused());

 sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
 assertTrue("center button should be focused",
 mCenterButton.isFocused());
 }
}

setUp 中初始化mLeftButton,mCenterButton和mRightButton,调用每个测试方法之前,setUp 都会被调用。

testPreconditions 通常为第一个测试方法,用来检测后续的测试环境是否符合条件。

testGoingRightFromLeftButtonJumpsOverCenterToRight 中调用sendKeys 可以模拟按键消息。

testGoingLeftFromRightButtonGoesToCenter 中 ,使用runOnUiThread 来为mRightButton 请求focus ,使用runOnUiThread 的原因是因为本测试方法不在UI线程中运行。  getInstrumentation 可以取得Instrumentation对象,有了Instrumentation 对象就可以对Activity进行大部分的操作,waitForIdleSync() 等待application 回到idle 状态,之后就可以检测mRightButton 是否获得了焦点。