全部产品

帐号池功能

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

什么是账号池?

为了解决一些应用的账号体系只能单点登录的问题(多人登录相同账号会互踢,比如“手机淘宝”),我们提供了账号池功能。所谓账号池,实际就是要求用户在测试单点登录的APP时,需要提供多个不同的测试账号。在提交账号时,用户需要注意一下几点:

  1. 同一单点登录的账号体系下的相同的账号不能同时在两个任务任务中提交。 用户在一个任务中提交了账号A和账号B,在这个任务执行完毕之前,不能再用账号A和账号B提交其他需要登录得任务。以防止两个任务在执行过程中,互相干扰。

  2. 单个任务中,您提交的账号个数越多,执行的速度将会越快。

Robotium脚本使用账号池

在之前的 如何编写Robotium脚本 这个文档中,我们知道在命令行里启动测试的命令:

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

其中,android.test.InstrumentationTestRunner是用来启动测试的。事实上,InstrumentationTestRunner远非启动测试这么简单。它负责 加载测试用例、准备测试环境(setup)、执行测试用例(run)、测试完成后的清理(tear down)等一系列的内容。

在账号池的功能中,我们需要给测试脚本APK传入一些参数,这需要我们定制我们自己的testRunner,不再使用默认的android.test.InstrumentationTestRunner。

  1. package com.alibaba.mqc.test;
  2. import android.os.Bundle;
  3. import android.test.InstrumentationTestRunner;
  4. public class MqcTestRunner extends InstrumentationTestRunner {
  5. private String username = null;
  6. private String password = null;
  7. @Override
  8. public void onCreate(Bundle arguments) {
  9. super.onCreate(arguments);
  10. if(arguments != null) {
  11. if(arguments.containsKey("username")) {
  12. username = arguments.getString("username");
  13. }
  14. if(arguments.containsKey("password")) {
  15. password = arguments.getString("password");
  16. }
  17. }
  18. }
  19. public String getUsername() {
  20. return username;
  21. }
  22. public String getPassword() {
  23. return password;
  24. }
  25. }

之后,我们需要修改测试脚本APK的AndroidManifest.xml文件,使用我们定制后的TestRunner:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.alibaba.mqc.test"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6. <uses-sdk android:minSdkVersion="14" />
  7. // 在这里使用我们定制的MqcTestRunner.
  8. <instrumentation
  9. android:name="com.alibaba.mqc.test.MqcTestRunner"
  10. android:targetPackage="com.alibaba.mts.mtsdemoapp" />
  11. <application
  12. android:icon="@drawable/ic_launcher"
  13. android:label="@string/app_name" >
  14. <uses-library android:name="android.test.runner" />
  15. </application>
  16. </manifest>

然后,我们需要在TestCase中需要登录的时候,获取到传入的用户名和密码,并填写到输入控件中。具体方法如下:

最后,本地测试功能脚本时,可以通过如下命令进行测试, 比如用户名和密码都为admin, 则启动命令为:

  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控件中输入内容,用户名为TestRunner传入的参数
  11. String username = ((MqcTestRunner)getInstrumentation()).getUsername();
  12. solo.enterText(user, username);
  13. // 图例3.3.2:索引1是密码控件
  14. EditText pwd = solo.getEditText(1);
  15. // 密码也是TestRunner传入的参数
  16. String password = ((MqcTestRunner)getInstrumentation()).getPassword();
  17. solo.enterText(pwd, password);
  18. // 点击包含“登录”文字的控件。如果Activity中包含多个“登录”,我们需要指定控件索引,像下面数字2。这个索引可能需要尝试几次获取。
  19. solo.clickOnText("登陆", 2);
  20. // 图例3.3.3: 测试完成之后,等待5s结束。一般登录需要跟后台交互,这里的等待是这个目的。
  21. solo.sleep(5000);
  22. }

本地测试功能脚本时,可以通过如下命令进行测试, 比如用户名和密码都为admin, 则启动命令为:

adb shell am instrument -w -e username admin -e password admin com.alibaba.mqc.test/com.alibaba.mqc.test.MqcTestRunner

Appium脚本使用账号池

在使用Appium 脚本测试过程中,MQC平台会为您在desired_capabilities.py注入两个函数,分别用来获取用户名和密码,示例如下:

  1. #!/usr/bin/env python
  2. def get_desired_capabilities():
  3. desired_caps = {
  4. 'platformName': 'Android',
  5. 'platformVersion': '4.0.4',
  6. 'deviceName': 'V889F',
  7. 'appPackage': 'com.alibaba.mts.mtsdemoapp',
  8. 'appWaitPackage': 'com.alibaba.mts.mtsdemoapp',
  9. 'app': "/tmp/task.apk",
  10. 'newCommandTimeout': 30,
  11. 'automationName': 'Selendroid'
  12. }
  13. return desired_caps
  14. def get_uri():
  15. return "http://localhost:666/wd/hub"
  16. def get_username():
  17. return "admin"
  18. def get_password():
  19. return "admin"

这样,我们就可以通过 get_username和get_password两个方法获取被分配的用户名和密码了。

用Appium Python脚本进行登录的示例:

  1. from appium import webdriver
  2. import desired_capabilities
  3. import time
  4. // 通过desired_capabilities.py获取本次测试的参数配置
  5. desired_caps = desired_capabilities.get_desired_capabilities()
  6. // 获取Appium Server的地址
  7. uri = desired_capabilities.get_uri()
  8. // 获取用户名
  9. username = desired_capabilities.get_username()
  10. // 获取密码
  11. password = desired_capabilities.get_password()
  12. // 初始化本次操作的会话(Session),构建连接。
  13. driver = webdriver.Remote(uri, desired_caps)
  14. // 在手机的logcat中打印一条Tag为MQC-LOG-MASTER 的info日志:
  15. // screenshot picName 用以发送截图消息。
  16. driver.shell("log -p i -t MQC-LOG-MASTER screenshot")
  17. // 找到id为tab_four_image的控件。
  18. tab4 = driver.find_element(value="tab_four_image")
  19. // 点击tab_four_image的控件
  20. tab4.click()
  21. // 等待一会儿,让Activity切换完成。
  22. time.sleep(3)
  23. // 找到id为login_user_edit的控件,是一个文本输入框控件
  24. usernameInput = driver.find_element(value="login_user_edit")
  25. // 输入被分配的用户名
  26. usernameInput.send_keys(username)
  27. // 找到id为login_password_edit的控件,是密码输入框控件
  28. passwordInput = driver.find_element(value="login_password_edit")
  29. // 输入被分配的密码
  30. passwordInput.send_keys(password)
  31. // 隐藏掉弹出的软键盘
  32. driver.hide_keyboard()
  33. // 找到id为login_login_button的控件,登录按钮。
  34. loginBtn = driver.find_element(value="login_login_button")
  35. // 点击登录按钮
  36. loginBtn.click()
  37. // 等待3s与后台服务器通信完成
  38. time.sleep(3)
  39. // 结束本次会话(Session)
  40. driver.quit()
本文导读目录
本文导读目录
以上内容是否对您有帮助?