原创文章转载请注明出处
相对于单元测试,UI测试一直都是靠人工测试为主,为了让测试工程师可以从重复的测试工作中解脱出来,因此基于Appium搭建了一下这套测试框架,让测试工程师可以通过编写测试代码来实现自动化测试,搭配Jenkins几乎可以做到全天24小时测试。
Appium是什么就不在重复介绍了,先来看看这套框架的结构。
- App目录存放待测试的apk或者ipa文件
- Data目录存放配置文件,yaml文件相比ini文件更容易阅读。
platformName: 'Android'
platformVersion: '4.4'
deviceName: 'NX507J'
app: '../App/mechanic-qa.apk'
appPackage: 'com.gg.mechanic.qa'
wdServer: 'http://127.0.0.1:4723/wd/hub'
account:
userNo: 'xxxxxx'
userPwd: 'xxxxxx'
- PO目录是Page Object的意思,这里可以根据App的页面编写对应的页面对象文件,获取页面上的元素(Label、Buttn、View等)。
- Public目录是公共资源目录,HTMLTestRunner.py是输出测试结果Html页面的工具,screenshot.py是用于截图的,针对每个测试用例都可以在测试结尾进行截图,保留现场。
- Result目录是输出测试结果的目录
- TestCase是测试用例目录
- 运行测试只需要执行run_case.py即可。
整套框架可以完整支持iOS和Android应用的测试,如果两个平台的应用界面和功能类似,那么TestCase几乎可共用,只需要针对不同平台修改PO目录下的页面元素获取代码。
base_page.py是对Appium的find_elements_xxx方法进行的封装,可以完美的兼容两个平台。部分代码如下:
class By(object):
"""
Set of supported locator strategies.
"""
ACCESSIBILITY_ID = 'accessibility_id'
ANDROID = 'android'
IOS = 'ios'
CLASS_NAME = "class_name"
ID = "id"
XPATH = "xpath"
# NAME = "name"
# LINK_TEXT = "link text"
# PARTIAL_LINK_TEXT = "partial link text"
# TAG_NAME = "tag name"
# CSS_SELECTOR = "css selector"
class BasePage(object):
def get_element_by_type(self, method, value):
if method == By.ACCESSIBILITY_ID:
return self.driver.find_element_by_accessibility_id(value)
elif method == By.ANDROID:
return self.driver.find_element_by_android_uiautomator('new UiSelector().%s' % value)
elif method == By.IOS:
return self.driver.find_element_by_ios_uiautomation(value)
elif method == By.CLASS_NAME:
return self.driver.find_element_by_class_name(value)
elif method == By.ID:
return self.driver.find_element_by_id(value)
elif method == By.XPATH:
return self.driver.find_element_by_xpath(value)
# elif method == By.NAME:
# return self.driver.find_element_by_name(value)
else:
raise Exception('Invalid locator method.')
以登录界面为例:
from PO.base_page import By, BasePage
class LoginPage(BasePage):
# 登录按钮
login_btn_loc = (By.ID, "com.xxx.xxxxx:id/bt_login")
...
# 登录
def click_login_button(self):
self.click(self.login_btn_loc)
...
在test_login.py,如果需要点击登录按钮,就可以直接调用LoginPage的click_login_button方法。
class Login(BaseTest):
def test_01_empty_name(self):
self.screen.input_pwd('123456')
self.screen.click_login_button()
当然了Appium的机制决定了测试的响应速度比较慢,但是相比Monkey其测试效果和覆盖范围还是更值得肯定的。
我是咕咕鸡,一个还在不停学习的全栈工程师。
热爱生活,喜欢跑步,家庭是我不断向前进步的动力。