全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网

脚本编写

更新时间:2017-06-07 13:26:11

刚刚我们学习了,如何使用UI Automator Viewer进行APP UI控件的查看。用Robotium框架编写测试用例,本质上就是使用Robotium的API,对找到的一个个控件进行有序的操作(点击、拖拽、滑动)。

下面我们通过一个例子(示例APP),来学习如何用Robotium编写登录APP的自动化脚本。通过这个例子也能了解到Robotium的自动化测试是如何工作的。

1. 准备Android 开发环境

如果已经有了Android开发环境就可以略过这一步,直接查看第二步。

配置Android 需要安装Eclipse和JDK,然后参考Android官方说明安装Eclipse 的adt插件。

2. 在Eclipse中创建测试用例

创建一个空白的Android测试工程。

a. 点击File -> New -> Project,然后再弹出框内选择Android->Android Test Project。

创建一个空白的Android测试工程

b. 点击Next到下一步,输入工程名称,比如MtsAutomationTest, 然后下一步,可以选择被测的APP工程,如果没有不选,如图所示:

  1. <img alt="" src="http://matp-test.cn-hangzhou.oss.aliyun-inc.com/1bb4ffc9d37125120182d21ab5ed929b.png" style="height:460px; width:414px">

c. 然后进入下一步选择Android版本,这里建议与被测APP保持一致,然后确认完成即可。然后在Eclipse的工程目录里就能看到刚刚创建的工程。

3. 一步步编写登录脚本

a. 修改AndroidManifest.xml

打开刚刚创建的工程,我们能够看到AndroidManifest.xml 文件。我们需要对其进行一些修改。

区域1是测试脚本的包名(后续测试脚本要像APP一样安装到手机上),区域2是刚刚选择的Android sdk 的版本,”14”代表Android 4.0。区域3是测试脚本的Instrumentation的名字,启动测试时要指定它。区域4是被测APP的包名,如果创建时没有选择目标APP,那么要修改区域4,把“com.jayway.test”修改为被测APP的包名。比如我们本次被测的APP的包名:“com.alibaba.mts.mtsdemoapp”

b. 加入Robotium.jar(下载地址

下载Robotium.jar,然后在测试工程目录创建一个Robotium的文件夹(其他名字也可以,但是不要使用lib这个名字,它是特殊文件夹),并将Robotium.jar拷贝过去。然后把这个jar包,加入到工程的build path中。具体方法:右键点击测试工程,选择properties,在Libraries选项中,点击Add JARs添加,如下图:

添加完毕后,如下图:

选择Order And Export,将robotium的jar包勾选上

c. 开始编写测试脚本

在空的测试包,创建一个MtsAutomationTest.java 的文件,如下所示:

然后打开MtsAutomationTest.java 并拷贝以下代码:

  1. package com.jayway.test.test;
  2. import com.robotium.solo.Solo;
  3. import android.test.ActivityInstrumentationTestCase2;
  4. public class MtsAutomationTest extends ActivityInstrumentationTestCase2 {
  5. private Solo solo;
  6. private final static String lanchActivity = "com.alibaba.mts.mtsdemoapp.MainActivity";
  7. // 通过反射的方式,找到可以启动的Activity的Class.
  8. private static Class<?> launcherActivityClass;
  9. static{
  10. try {
  11. launcherActivityClass = Class.forName(lanchActivity);
  12. } catch (ClassNotFoundException e) {
  13. throw new RuntimeException(e);
  14. }
  15. }
  16. @SuppressWarnings("unchecked")
  17. public MtsAutomationTest() throws ClassNotFoundException {
  18. super(launcherActivityClass);
  19. }
  20. @Override
  21. public void setUp() throws Exception {
  22. //setUp() 先于测试用例的执行, 用于初始化环境
  23. //solo对象在这里被创建出来
  24. solo = new Solo(getInstrumentation(), getActivity());
  25. }
  26. @Override
  27. public void tearDown() throws Exception {
  28. //tearDown() 是执行完所有的测试用例之后被执行。
  29. //finishOpenedActivities() 会终止在测试期间打开的所有的activities.
  30. solo.finishOpenedActivities();
  31. }
  32. }

launchActivity字符串替换为,被测APP的launchable-activity,比如本次使用的APP的启动Activity:"com.alibaba.mts.mtsdemoapp.MainActivity"

然后,我们在MtsAutomationTest.java文件中添加一条测试用例: 添加一个函数testLogin(所有的测试case的函数名都要以test开始,testXXX的格式):

  1. public void testLogin() throws Exception {
  2. // 启动之后,等待5s,UI界面稳定下来
  3. solo.sleep(5000);
  4. // 图例3.3.1:在文字“Tab4”上点击,进入登录页
  5. solo.clickOnText("Tab4");
  6. // Activity切换时,最好等待一会儿。否则,某些异步元素可能还没加载
  7. solo.sleep(5000);
  8. // 图例3.3.2:此Activity中只有两个EditText控件,索引0是用户名控件。
  9. EditText user = solo.getEditText(0);
  10. // enterText用于向EditText控件中输入内容,用户名为:admin
  11. solo.enterText(user, "admin");
  12. //图例3.3.2:索引1是密码控件
  13. EditText pwd = solo.getEditText(1);
  14. // 密码也是:admin
  15. solo.enterText(pwd, "admin");
  16. // 点击包含“登录”文字的控件。如果Activity中包含多个“登录”,我们需要指定控件索引,像下面数字2。这个索引可能需要尝试几次获取。
  17. solo.clickOnText("登陆", 2);
  18. // 图例3.3.3: 测试完成之后,等待5s结束。一般登录需要跟后台交互,这里的等待是这个目的。
  19. solo.sleep(5000);
  20. }

除了上面几种获取控件的方法,还有一种常用的,通过resource-id获取控件的方法:

  1. Activity act=solo.getCurrentActivity();
  2. TextView loginView = (TextView) solo.getView(act.getResources().getIdentifier("login", "id", act.getPackageName()))

“login”是一个密码框的resource-id, 我们通过上面这种方式就能获取到这个控件对象。

然后,可以用solo.enterText(loginView, “密码xxx”); 进行密码输入。

注:其他更多的Robotium API,请参见 Robotium官方文档

项目编译完之后是一个APK包。

图3.3.1 点击“Tab 4”:

图3.3.2 进入登录页:

图3.3.3 登录完成页:

4. 签名

签名就是为了标志自己,为自己的程序打上标记,让别人看到签名的时候知道这个是跟你有关的(不管是程序,还是其他的签名都是如此的作用)。

Android App签名是Android系统要求,Android系统要求每一个应用程序必须要经过数字签名才能安装到应用系统中,如果不进行数字签名,是没有办法安装到应用系统中的!Android通过数字签名来标识应用程序的作者和在应用程序之间建立信任关系,Android由应用程序的作者完成,并不需要权威认证,只是用来让应用程序包自我认证的。

为了保持被测APP和脚本APP签名一致,我们需要对被测APP进行重签或者脚本APP进行重签:

  • 我是被测APP的开发者,有被测APP的签名文件

    这种情况可以对刚刚开发的脚本APP进行重签:

    方法:Eclipse内右键测试工程 -> 选择“Android 工具”(Android Tools)-> 导出签名的应用包(Export Signed Application Package)

    重签脚本App如图:

    然后,选择自己的签名文件地址,并输入签名的密码进行导出即可。

  • 我不知道被测APP的签名信息

    如果没有被测APP的签名文件信息,我们需要对被测APP进行重签名操作。具体步骤:

    1. 找到被测APP,修改文件后缀,“apk” => “zip”

    2. 打开zip文件,不需要解压,直接删除“META-INF”目录,并恢复文件后缀为”apk”

    3. 执行重签命令:

      Jarsigner -verbose -digestalg SHA1 –sigalg MD5withRSA -keystore 用户目录/.android/debug.keystore 被测APP.apk androiddebugkey

      在弹出框内输入密码:android,然后回车。

      注意:“用户目录”指的是:win下,C:\Users\xxxx\, 类unix下:/home/xxx/

      上面我们用的是Eclipse默认的debug签名文件进行的签名,它的aliasName是androiddebugkey,密码是:android。

    4. 执行命令:jarsigner -verify 被测APP.apk

    5. 执行命令:zipalign -v 4 被测APP.apk 重签好的APP.apk。如果找不到zipalign, 可以把“adt目录/build-tools/android-xxxx”加入到环境变量中。

5. 在Android设备上启动测试

在重签名之后,我们把重签后的被测APP和脚本APP分别安装到手机或者模拟器上(可以使用adb install xxx.apk)。然后再命令行中执行命令:

adb shell am instrument -w com.jayway.test.test/android.test.InstrumentationTestRunner

测试完成后,可以看到有相应的测试结果生成。如果有错误,可以根据error trace进行测试代码修改。这里的com.jayway.test.test是测试APP的包名;android.test.InstrumentationTestRunner 是TestRunner的名字,用来启动测试。

6. 上传到MQC云端进行测试,并查看测试结果

确认在本地测试通过后,打开功能测试,先上传被测APP,然后在高级设置里上传登录脚本。并填写通知的旺旺和邮箱。

完毕后,下一步选择想要进行测试的机型,之后提交测试就可以了。

测试完成后,会用旺旺和邮箱通知您。

本文导读目录