基于Appium搭建iOS/Android的UI测试框架

原创文章转载请注明出处

相对于单元测试,UI测试一直都是靠人工测试为主,为了让测试工程师可以从重复的测试工作中解脱出来,因此基于Appium搭建了一下这套测试框架,让测试工程师可以通过编写测试代码来实现自动化测试,搭配Jenkins几乎可以做到全天24小时测试。

Appium是什么就不在重复介绍了,先来看看这套框架的结构。

基于Appium搭建iOS/Android的UI测试框架_第1张图片
Paste_Image.png
  • 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其测试效果和覆盖范围还是更值得肯定的。

我是咕咕鸡,一个还在不停学习的全栈工程师。
热爱生活,喜欢跑步,家庭是我不断向前进步的动力。

你可能感兴趣的:(基于Appium搭建iOS/Android的UI测试框架)