最近做个项目需要测试服务端的并发性能,客户端采用安卓,接口数据采用Restul和流媒体播放。由于流媒体的接口并不清楚,所以决定采用安卓虚拟机来模拟。
正好赶上Appium2.0升级,网上的很多资料都不能用了,这里将整个环境搭建的要点记录下来与大家分享。
1. Appium2.0的安装
- node.js 下载安装npm
https://nodejs.org/zh-cn/ - npm配置国内源
查看当前源
npm config get registry
设置为淘宝源
npm config set registry https://registry.npm.taobao.org
- 安装appium 2.0 Server和安卓驱动
npm install -g appium@next
appium driver install uiautomator2
2.Appium客户端脚本
本次采用python客户端,使用python3.7以上版本。下面安装python客户端。
pip install Appium-Python-Client
编写测试脚本
import unittest
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
capabilities = dict(
platformName='Android',
automationName='uiautomator2',
deviceName='Android',
appPackage='com.android.settings',
appActivity='.Settings',
language='en',
locale='US'
)
appium_server_url = 'http://localhost:4723'
class TestAppium(unittest.TestCase):
def setUp(self) -> None:
self.driver = webdriver.Remote(appium_server_url, capabilities)
def tearDown(self) -> None:
if self.driver:
self.driver.quit()
def test_find_battery(self) -> None:
el = self.driver.find_element(by=AppiumBy.XPATH, value='//*[@text="Battery"]')
el.click()
if __name__ == '__main__':
unittest.main()
到这里运行这个脚本,就可以实现单机的自动化测试了。
3.多个安卓模拟器并行测试
使用Android Studio Bumblebee,这是最后一个支持java 8的版本 https://developer.android.google.cn/studio/archive
在device manager中创建多个模拟器
改写测试脚本,对每个模拟器添加参数
capabilitiesA = dict(
platformName='Android',
automationName='uiautomator2',
deviceName='Android',
appPackage='com.android.settings',
appActivity='.Settings',
language='en',
locale='US',
udid='emulator-5554',
mjpegServerPort='9200',
systemPort='8200'
)
其中 udid, mjpegServerPort, systemPort每个模拟器都需要定义不同端口。
并行测试脚本如下
import unittest
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
capabilitiesA = dict(
platformName='Android',
automationName='uiautomator2',
deviceName='Android',
appPackage='com.android.settings',
appActivity='.Settings',
language='en',
locale='US',
udid='emulator-5554',
mjpegServerPort='9200',
systemPort='8200'
)
capabilitiesB = dict(
platformName='Android',
automationName='uiautomator2',
deviceName='Android',
appPackage='com.android.settings',
appActivity='.Settings',
language='en',
locale='US',
udid='emulator-5556',
mjpegServerPort='9201',
systemPort='8201'
)
capabilitiesC = dict(
platformName='Android',
automationName='uiautomator2',
deviceName='Android',
appPackage='com.android.settings',
appActivity='.Settings',
language='en',
locale='US',
udid='emulator-5558',
mjpegServerPort='9202',
systemPort='8202'
)
appium_server_url = 'http://localhost:4723'
class TestAppium(unittest.TestCase):
def setUp(self) -> None:
self.driverA = webdriver.Remote(appium_server_url, capabilitiesA)
self.driverB = webdriver.Remote(appium_server_url, capabilitiesB)
self.driverC = webdriver.Remote(appium_server_url, capabilitiesC)
def tearDown(self) -> None:
if self.driverA:
self.driverA.quit()
if self.driverB:
self.driverB.quit()
if self.driverC:
self.driverC.quit()
def test_find_battery(self) -> None:
el = self.driverA.find_element(by=AppiumBy.XPATH, value='//*[@text="Display"]')
el.click()
el = self.driverB.find_element(by=AppiumBy.XPATH, value='//*[@text="Display"]')
el.click()
el = self.driverC.find_element(by=AppiumBy.XPATH, value='//*[@text="Display"]')
el.click()
if __name__ == '__main__':
unittest.main()
4.下一步计划
- 把安卓模拟器搬到docker上。
- 使用jenkins运行测试脚本。
网友评论