appium简单总结(一)

Life is short , play more!
本文来自lihao's Blog,转载请注明。

从最早做过一些instrumentation的android 白盒测试后,熟悉过一些robotium , monkeyrunner自动化后, 一直对android自动化没有再关注。这些日子抽空研究了下appium。

一 android其他自动化框架回顾

1. instrumentation 白盒测试
(例如需要android沙盒环境的单元测试,集成测试等。 虽然也可以用来做UI的功能自动化,但通常建议使用Android Testing Support Library中提供的uiautomator[可以跨应用] 和 Espresso)
2. monkey 和 monkeyrunner
(虽然monkeyrunner可以定位element ,但是需要手机有root权限或者应用程序加入了一些允许访问 HierarchyViewer server的权限。具体可以访问如下资料 https://github.com/romainguy/ViewServer 和 https://code.google.com/p/android/issues/detail?id=79245 )

二 appium简单总结

appium 包含server端和客户端。 而不像 uiautomator , monkeyrunner 等, 只有客户端。它通过写好的测试代码,直接运行在执行代码机器的上, 并操作与你这台机器链接的真实设备或者虚拟机。 从实际的部署和应用中, server/client 的架构更利于扩展,虽然部署的时候需要多一个服务端的事情。 其次,有了服务端,帮你做了一些二次的封装,就可以提供统一的东西。 例如appium 完全符合webdriver api。 这样我们如果对selenium client已经非常熟悉,那么只需要学习一些android或者ios 客户端的一些简单知识,就能很快的开工写UI功能自动化了。 是不是这点比较爽呢?

——————————————–
monkeyrunner -> device or virtual device |
——————————————–

—————- ———–
|appium server | <------> | client |
—————- ————
|
|
device or virutal device

appium 基于如下的测试框架。

iOS: Apple's UIAutomation
Android 4.2+: Google's UiAutomator
Android 2.3+: Google's Instrumentation. (Instrumentation support is provided by bundling a separate project, Selendroid)

所以我们基于appium开发测试代码,则不需要关心底层的实现。(前提当然是appium比较稳定的前提下)

1. appium server
(基于node.js 开发) 我们只需要安装,并运行即可。
如何安装? http://appium.io/ 进入下载页面。当然可以通过其他方式安装,例如源码安装(appium是开源软件)。

2. appium client

既然完全符合 webdriver api,所以同样client是支持各种语言的。 例如java,python,ruby等等太多了。 建议使用如下语言,因为是在主工程里进行维护。

Language	Client Version	Release Date	 	 	 
Java	2.52.0	2016-02-11	Download  	Change log  	Javadoc
C#	2.52.0	2016-02-12	Download	Change log	API docs
Ruby	2.52.0	2016-02-12	Download	Change log	API docs
Python	2.52.0	2016-02-11	Download	Change log	API docs
Javascript (Node)	2.52.0	2016-02-11	Download	Change log	API docs

其他三方支持的语言客户端 http://www.seleniumhq.org/download/#thirdPartyLanguageBindings

Third Party Language Bindings NOT DEVELOPED by seleniumhq
Perl download and docs by Gordon Child
Perl 6 by Ahmad M. Zawawi
PHP by Chibimagic (real name unknown?)
PHP by Lukasz Kolczynski
PHP by facebook
PHP by Adam Goucher (SeHQ recommended php client)
PHP by Nearsoft
Haskell by Adam Curtis
Objective-C by Dan Cuellar
Javascript by Adam Christian
Javascript by Jonathan Lipps
Javascript by Camilo Tapia, Vincent Voyer and Christian Bromann
R by John Harrison
Dart by Marc Fisher
Tcl by Tobias Koch

3. 写一个简单的client
client 例子代码
https://github.com/appium/sample-code/tree/master/sample-code/examples

如下是一个python client的一段测试代码, deviceName改为你的adb devices 显示的deviceName。
其他根据实际情况进行修改desired_caps.
一些其他的示例: https://github.com/appium/python-client


import os
from time import sleep

import unittest

from appium import webdriver

# Returns abs path relative to this file and not cwd
PATH = lambda p: os.path.abspath(
os.path.join(os.path.dirname(__file__), p)
)

class SimpleAndroidTests(unittest.TestCase):
def setUp(self):
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '4.2'
desired_caps['deviceName'] = 'Android Emulator'
desired_caps['app'] = PATH(
'../../../sample-code/apps/ApiDemos/bin/ApiDemos-debug.apk'
)

self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

def tearDown(self):
# end the session
self.driver.quit()

def test_find_elements(self):
el = self.driver.find_element_by_accessibility_id('Graphics')
el.click()
el = self.driver.find_element_by_accessibility_id('Arcs')
self.assertIsNotNone(el)

self.driver.back()

el = self.driver.find_element_by_accessibility_id("App")
self.assertIsNotNone(el)

els = self.driver.find_elements_by_android_uiautomator("new UiSelector().clickable(true)")
self.assertGreaterEqual(12, len(els))

self.driver.find_element_by_android_uiautomator('text("API Demos")')

def test_simple_actions(self):
el = self.driver.find_element_by_accessibility_id('Graphics')
el.click()

el = self.driver.find_element_by_accessibility_id('Arcs')
el.click()

self.driver.find_element_by_android_uiautomator('new UiSelector().text("Graphics/Arcs")')

if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(SimpleAndroidTests)
unittest.TextTestRunner(verbosity=2).run(suite)


发表评论

电子邮件地址不会被公开。 必填项已用*标注