51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 1718|回复: 0
打印 上一主题 下一主题

关于robotium的那些事

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-4-9 16:00:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
接触robotium真的不久,关键是公司要开发一款自动化测试工具,不幸的是,我以小白的身份,被拉了进来,
不得已,只好学了。

不多不少,大概有一个多月了吧,多多少少有些收获,打算总结下,发出来晒晒。当然,也是有感与自动化测
试,网上实际的例子比较上,所以贴几个例子进来。我是小白,我的例子也就很小白,所以,高手和专业请绕道。

首先,要搞robotium,必须要下载robotium-solo-4.1.jar和robotium-solo-4.1-javadoc.jar,这是前提。不过好
像现在已经到4.2了吧。

其次,就是创建测试工程。这里,我将介绍给大家三种不同的创建方法。

一、最简单的创建方法:

先创建一个android工程(TestedProject),做为被测工程。在这个工程里,我做了三个activity,第一个
activity里只有一个按钮,点击跳转,第二个activity里有一个按钮,一个editText,一个listView,一个Spinner,点
击按钮实现跳转。第三个activity只有一个TextView(包名为根路径.third)。我相信,看这个博客的人,都知
道这个工程怎么建,不贴代码了,以免浪费篇幅。

创建测试工程。右键点击TestedProject,new --> other --> android test project,点next -->输入工程名(本人
用TestProject),next -->注意这个界面有个单选按钮,记得选This Project,finish.

src 下有一个空包,右键,创建类(本人用Test),这个工程继承ActivityInstrumentationTestCase2。

代码如下:

  1. public class Test extends ActivityInstrumentationTestCase2<MainActivity> {
  2. private Solo solo;
  3. private Solo2 solo2;

  4. public Test() {
  5.   super(MainActivity.class);
  6. }

  7. @Override
  8. protected void setUp() throws Exception {
  9.   // setUp() is run before a test case is started.
  10.   // This is where the solo object is created.
  11.   solo = new Solo(getInstrumentation(), getActivity());

  12. }

  13. @Override
  14. protected void tearDown() throws Exception {
  15.   // tearDown() is run after a test case has finished.
  16.   // finishOpenedActivities() will finish all the activities that have
  17.   // been opened during the test execution.
  18.   solo.finishOpenedActivities();
  19. }

  20. /**
  21.   * 测试点击事件
  22.   *
  23.   * @throws InterruptedException
  24.   */
  25. public void testClick() throws InterruptedException {
  26.   solo.assertCurrentActivity("进入MainActivity", "MainActivity");
  27.   Thread.sleep(1000);//这个必须有,不然会找不到组件的错误
  28.   solo.clickOnButton(0);//这里的“0”,是在界面上数的。当然,clickOnButton总共有三种方法,第二种是跟
  29. 据button的text找,第三种是跟据 button在原工程中的id找。
  30.   //根据id找的方法如下
  31.   /**
  32.    * Activity currentActivity = solo.getCurrentActivity();
  33.    * int id = currentActivity.getResources().getIdentifier("btn", "id", currentActivity.getPackageName());"bt
  34. n"是button的id,“id”是btn的类型,这里是根据id找,所以不用改
  35.    * Button btn = (Button) solo.getView(id);
  36.    * solo.clickOnView(btn);
  37.    *
  38.    *4.2有个新方法,solo.getView("btn")是对上面的内容进行了封装,更简单了。
  39.    * */
  40.   Thread.sleep(1000);
  41.   solo.enterText(0, "这只是个例子");
  42.   Thread.sleep(1000);
  43.   solo.pressSpinnerItem(0, 2);//(“0”)是第一个spinner,2是第二行。
  44.   Thread.sleep(1000);
  45.   solo.clickInList(2);//点第1个listView的第二行
  46.   solo.clickOnButton("下一个");
  47.   solo.sendKey(KeyEvent.KEYCODE_POWER);
  48.   Thread.sleep(1000);

  49. }

  50. }

  51. 作为一个例子,这里,我只是简单的写了几个函数。对于solo类中的一些重要的函数,我也做下说明。当然,
  52. 因为在家里,手头上没有robotium源码,所以,只能写上一些自己记下的方法。上面用到的就不说了。

  53. 1、solo.sendKey(),这个方法,主要是一些系统定义的按钮。如HOME,MENU,BACK,音量,还有键盘上的所
  54. 有键。当然,它只能发命令,不能模似用户点击键盘。因为点击键盘会牵扯到跨进程操作。(跨进程,万恶
  55. 的跨进程)

  56. 2、isSearch...这一类的方法,主要是判断一些控件是不是存在。

  57. 3.is..checked这一类的方法,主要是用来判断一些可选的组件,如checkBox是不是被选中

  58. ……

  59. 第二种方法,当只有APK,没有源码时(众所周知,一般都没有源码)创建方法

  60. 创建测试工程。右键点击TestedProject,new --> other --> android test project,点next -->输入工程名(本人
  61. 用TestProject),next -->注意这个界面有个单选按钮,记得这里不是选This Project,先万注意,finish.

  62. 创建工程之后,会出现一个空包,在包下建立类(我依旧用TestSettings)这个例子是我写的测试settings模
  63. 块的例子,当然,依旧继承的是ActivityInstrumentationTestCase2类。但是,这个时候,该类的代码如下

  64. public class TestSettings extends ActivityInstrumentationTestCase2{//这里注意,后面没有<Activity>

  65. private static final String PKG_NAME = "com.android.settings";//根目录
  66. private static Class activityClass;
  67. private Solo solo;

  68. static{
  69.   try {
  70.    activityClass = Class.forName(PKG_NAME+".Settings");//你要测的类。当然,如果你的类是根目录.xxx.Ac
  71. tivity,那么,这里就写activityClass = Class.forName(PKG_NAME+"xxx.Activity");
  72.   } catch (ClassNotFoundException e) {
  73.   }
  74. }

  75. public TestSettings() {
  76.   super(PKG_NAME,activityClass);
  77. }

  78. @Override
  79. protected void setUp() throws Exception {
  80.   solo = new Solo(getInstrumentation(), getActivity());
  81. }

  82. @Override
  83. protected void tearDown() throws Exception {
  84.   solo.finishOpenedActivities();
  85. }

  86. public void testClick() throws InterruptedException {

  87. //略

  88. }

  89. }

  90. 第二种方法,比第一种方法好的地方是不需要源码也可以进行测试。但是,缺点很明显,没有界面,只能
  91. 通过发指令或在eclipse中右键来启动,不能像其它apk一样运行,很不方便

  92. 第三种方法,正好解决这个问题。

  93. 这个工程其实就是一个一般的应用,建工程时,和其它工程也样,也是建一个android application project.

  94. 工程建好之后,在main_activity.xml中,加入一个按钮(本例中的控件id是settings).

  95. 在MainActivity中加入如下代码,便可以在点击这个按钮后,启动测试类,进行测试。测试完了,如果没报错,
  96. 会返回至这个类。

  97. 此类的源码如下(我特意把package com.settings.display.test也贴了出来,注意它哦!!):

  98. package com.settings.display.test;

  99. public class MainActivity extends Activity {

  100. @Override
  101. protected void onCreate(Bundle savedInstanceState) {
  102.   super.onCreate(savedInstanceState);
  103.   setContentView(R.layout.activity_main);

  104.   ((Button) this.findViewById(R.id.settings))
  105.     .setOnClickListener(new Button.OnClickListener() {
  106.      @Override
  107.      public void onClick(View v) {
  108.       MainActivity.this
  109.         .startInstrumentation(
  110.           new ComponentName(
  111.             "com.settings.display.test",//是不是似曾相识?它就是这个类的package,当然,你也要注意,让它和
  112. AndroidManifest.xml中的 package="com.settings.display.test"一致,如果不一致,请你改成一致。不然,

  113.                                                    //后果你可以试试
  114.             "android.test.InstrumentationTestRunner"),//这里不用改。这个参数,也是与AndroidManifest.xml中
  115. 的android:name="android.test.InstrumentationTestRunner"一致的。请不要修改。
  116.           null, null);
  117.      }
  118.     });
  119. }

  120. }

  121. AndroidManifest.xml中要做修改,源码如下:

  122. <?xml version="1.0" encoding="utf-8"?>
  123. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  124.     package="com.settings.display.test"
  125.     android:versionCode="1"
  126.     android:versionName="1.0" >

  127.     <uses-sdk
  128.         android:minSdkVersion="8"
  129.         android:targetSdkVersion="17" />

  130.     <application
  131.         android:allowBackup="true"
  132.         android:icon="@drawable/ic_launcher"
  133.         android:label="@string/app_name"
  134.         android:theme="@style/AppTheme" >
  135.         <activity
  136.             android:name="com.settings.display.test.MainActivity"
  137.             android:label="@string/app_name" >
  138.             <intent-filter>
  139.                 <action android:name="android.intent.action.MAIN" />

  140.                 <category android:name="android.intent.category.LAUNCHER" />
  141.             </intent-filter>
  142.         </activity>
  143.         <uses-library android:name="android.test.runner" /><!-- 注意,这里是后来加入的,表明这个类是个
  144. 测试类-->
  145.     </application>
  146.     <instrumentation android:targetPackage="com.android.settings"<!--这里,是你要测的APK的根路径,我
  147. 测的是settings,所以,这里写的是settings的根路径-->

  148.            android:name="android.test.InstrumentationTestRunner" /><!-- 也注意这里-->
  149. </manifest>
复制代码

这里于一般的应用不一样的地方在于加入了两处代码,功能也有说明:

1、 <uses-library android:name="android.test.runner" />

2、<instrumentation android:targetPackage="com.android.settings"<!--这里,是你要测的APK的根路径,我
测的是settings,所以,这里写的是settings的根路径-->

           android:name="android.test.InstrumentationTestRunner" /><!-- 也注意这里-->

也请注意,这两处代码放的位置。一个是application的量,一个是manifest的量,别搞错哦。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-5-3 19:37 , Processed in 0.060464 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表