开发者社区> 问答> 正文

帐号池功能都有什么体现?



什么是账号池?


为了解决一些应用的账号体系只能单点登录的问题(多人登录相同账号会互踢,比如“手机淘宝”),我们提供了账号池功能。所谓账号池,实际就是要求用户在测试单点登录的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. [backcolor=transparent]package[backcolor=transparent] com[backcolor=transparent].[backcolor=transparent]alibaba[backcolor=transparent].[backcolor=transparent]mqc[backcolor=transparent].[backcolor=transparent]test[backcolor=transparent];
  2. [backcolor=transparent]import[backcolor=transparent] android[backcolor=transparent].[backcolor=transparent]os[backcolor=transparent].[backcolor=transparent]Bundle[backcolor=transparent];
  3. [backcolor=transparent]import[backcolor=transparent] android[backcolor=transparent].[backcolor=transparent]test[backcolor=transparent].[backcolor=transparent]InstrumentationTestRunner[backcolor=transparent];
  4. [backcolor=transparent]public[backcolor=transparent] [backcolor=transparent]class[backcolor=transparent] [backcolor=transparent]MqcTestRunner[backcolor=transparent] [backcolor=transparent]extends[backcolor=transparent] [backcolor=transparent]InstrumentationTestRunner[backcolor=transparent] [backcolor=transparent]{
  5. [backcolor=transparent]     [backcolor=transparent]private[backcolor=transparent] [backcolor=transparent]String[backcolor=transparent] username [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]null[backcolor=transparent];
  6. [backcolor=transparent]     [backcolor=transparent]private[backcolor=transparent] [backcolor=transparent]String[backcolor=transparent] password [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]null[backcolor=transparent];
  7. [backcolor=transparent]     [backcolor=transparent]@Override
  8. [backcolor=transparent]     [backcolor=transparent]public[backcolor=transparent] [backcolor=transparent]void[backcolor=transparent] onCreate[backcolor=transparent]([backcolor=transparent]Bundle[backcolor=transparent] arguments[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
  9. [backcolor=transparent]            [backcolor=transparent]super[backcolor=transparent].[backcolor=transparent]onCreate[backcolor=transparent]([backcolor=transparent]arguments[backcolor=transparent]);
  10. [backcolor=transparent]            [backcolor=transparent]if[backcolor=transparent]([backcolor=transparent]arguments [backcolor=transparent]!=[backcolor=transparent] [backcolor=transparent]null[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
  11. [backcolor=transparent]                   [backcolor=transparent]if[backcolor=transparent]([backcolor=transparent]arguments[backcolor=transparent].[backcolor=transparent]containsKey[backcolor=transparent]([backcolor=transparent]"username"[backcolor=transparent]))[backcolor=transparent] [backcolor=transparent]{
  12. [backcolor=transparent]                          username [backcolor=transparent]=[backcolor=transparent] arguments[backcolor=transparent].[backcolor=transparent]getString[backcolor=transparent]([backcolor=transparent]"username"[backcolor=transparent]);
  13. [backcolor=transparent]                   [backcolor=transparent]}
  14. [backcolor=transparent]                   [backcolor=transparent]if[backcolor=transparent]([backcolor=transparent]arguments[backcolor=transparent].[backcolor=transparent]containsKey[backcolor=transparent]([backcolor=transparent]"password"[backcolor=transparent]))[backcolor=transparent] [backcolor=transparent]{
  15. [backcolor=transparent]                          password [backcolor=transparent]=[backcolor=transparent] arguments[backcolor=transparent].[backcolor=transparent]getString[backcolor=transparent]([backcolor=transparent]"password"[backcolor=transparent]);
  16. [backcolor=transparent]                   [backcolor=transparent]}
  17. [backcolor=transparent]            [backcolor=transparent]}
  18. [backcolor=transparent]     [backcolor=transparent]}
  19. [backcolor=transparent]     [backcolor=transparent]public[backcolor=transparent] [backcolor=transparent]String[backcolor=transparent] getUsername[backcolor=transparent]()[backcolor=transparent] [backcolor=transparent]{
  20. [backcolor=transparent]            [backcolor=transparent]return[backcolor=transparent] username[backcolor=transparent];
  21. [backcolor=transparent]     [backcolor=transparent]}
  22. [backcolor=transparent]     [backcolor=transparent]public[backcolor=transparent] [backcolor=transparent]String[backcolor=transparent] getPassword[backcolor=transparent]()[backcolor=transparent] [backcolor=transparent]{
  23. [backcolor=transparent]            [backcolor=transparent]return[backcolor=transparent] password[backcolor=transparent];
  24. [backcolor=transparent]     [backcolor=transparent]}
  25. [backcolor=transparent]}

之后,我们需要修改测试脚本APK的AndroidManifest.xml文件,使用我们定制后的TestRunner:
  1. [backcolor=transparent]<?[backcolor=transparent]xml version[backcolor=transparent]=[backcolor=transparent]"1.0"[backcolor=transparent] encoding[backcolor=transparent]=[backcolor=transparent]"utf-8"[backcolor=transparent]?>
  2. [backcolor=transparent]<manifest[backcolor=transparent] [backcolor=transparent]xmlns:android[backcolor=transparent]=[backcolor=transparent]"http://schemas.android.com/apk/res/android"
  3. [backcolor=transparent]    [backcolor=transparent]package[backcolor=transparent]=[backcolor=transparent]"com.alibaba.mqc.test"
  4. [backcolor=transparent]    [backcolor=transparent]android:versionCode[backcolor=transparent]=[backcolor=transparent]"1"
  5. [backcolor=transparent]    [backcolor=transparent]android:versionName[backcolor=transparent]=[backcolor=transparent]"1.0"[backcolor=transparent] [backcolor=transparent]>
  6. [backcolor=transparent]    [backcolor=transparent]<uses-sdk[backcolor=transparent] [backcolor=transparent]android:minSdkVersion[backcolor=transparent]=[backcolor=transparent]"14"[backcolor=transparent] [backcolor=transparent]/>
  7. [backcolor=transparent]      // 在这里使用我们定制的MqcTestRunner.
  8. [backcolor=transparent]    [backcolor=transparent]<instrumentation
  9. [backcolor=transparent]        [backcolor=transparent]android:name[backcolor=transparent]=[backcolor=transparent]"com.alibaba.mqc.test.MqcTestRunner"
  10. [backcolor=transparent]        [backcolor=transparent]android:targetPackage[backcolor=transparent]=[backcolor=transparent]"com.alibaba.mts.mtsdemoapp"[backcolor=transparent] [backcolor=transparent]/>
  11. [backcolor=transparent]    [backcolor=transparent]<application
  12. [backcolor=transparent]        [backcolor=transparent]android:icon[backcolor=transparent]=[backcolor=transparent]"@drawable/ic_launcher"
  13. [backcolor=transparent]        [backcolor=transparent]android:label[backcolor=transparent]=[backcolor=transparent]"@string/app_name"[backcolor=transparent] [backcolor=transparent]>
  14. [backcolor=transparent]        [backcolor=transparent]<uses-library[backcolor=transparent] [backcolor=transparent]android:name[backcolor=transparent]=[backcolor=transparent]"android.test.runner"[backcolor=transparent] [backcolor=transparent]/>
  15. [backcolor=transparent]    [backcolor=transparent]</application>
  16. [backcolor=transparent]</manifest>

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

本地测试功能脚本时,可以通过如下命令进行测试, 比如用户名和密码都为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. [backcolor=transparent]#!/usr/bin/env python
  2. [backcolor=transparent]def[backcolor=transparent] get_desired_capabilities[backcolor=transparent]():
  3. [backcolor=transparent]    desired_caps [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]{
  4. [backcolor=transparent]        [backcolor=transparent]'platformName'[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'Android'[backcolor=transparent],
  5. [backcolor=transparent]        [backcolor=transparent]'platformVersion'[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'4.0.4'[backcolor=transparent],
  6. [backcolor=transparent]        [backcolor=transparent]'deviceName'[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'V889F'[backcolor=transparent],
  7. [backcolor=transparent]        [backcolor=transparent]'appPackage'[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'com.alibaba.mts.mtsdemoapp'[backcolor=transparent],
  8. [backcolor=transparent]        [backcolor=transparent]'appWaitPackage'[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'com.alibaba.mts.mtsdemoapp'[backcolor=transparent],
  9. [backcolor=transparent]        [backcolor=transparent]'app'[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]"/tmp/task.apk"[backcolor=transparent],
  10. [backcolor=transparent]        [backcolor=transparent]'newCommandTimeout'[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]30[backcolor=transparent],
  11. [backcolor=transparent]        [backcolor=transparent]'automationName'[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'Selendroid'
  12. [backcolor=transparent]    [backcolor=transparent]}
  13. [backcolor=transparent]    [backcolor=transparent]return[backcolor=transparent] desired_caps
  14. [backcolor=transparent]def[backcolor=transparent] get_uri[backcolor=transparent]():
  15. [backcolor=transparent]    [backcolor=transparent]return[backcolor=transparent] [backcolor=transparent]"http://localhost:666/wd/hub"
  16. [backcolor=transparent]def[backcolor=transparent] get_username[backcolor=transparent]():
  17. [backcolor=transparent]    [backcolor=transparent]return[backcolor=transparent] [backcolor=transparent]"admin"
  18. [backcolor=transparent]def[backcolor=transparent] get_password[backcolor=transparent]():
  19. [backcolor=transparent]    [backcolor=transparent]return[backcolor=transparent] [backcolor=transparent]"admin"

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

展开
收起
猫饭先生 2017-10-25 10:20:23 1534 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
《用管控策略设定多账号组织全局访问边界》 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载