Android + Appium 自动化测试框架

1,258 阅读5分钟

Appium测试框架搭建

本文代码github地址:github.com/...

因为Appium网上的资料大多都是基础的,包括环境搭建、单界面的测试、单控件的测试等。 关于Appium测试框架的文章却没有查到,所以这篇文章主要是关于Appium框架的搭建

Appium环境的搭建过程就不介绍了,网上可以查一下相关文章,也可以在我的项目中看一下相关参考。

启动Android模拟器视频: 启动Android模拟器视频

appium测试视频: appium测试视频

一、appium_demo项目整体思路介绍

启动项目只需要运行项目根路径下的test.py即可。

项目启动分析

1.multi_appium.start_service()

该方法会先杀掉已经启动的 appium 进程,然后再启动 appium 服务。

2.multi_appium.con_device()

该方法会执行以下方法,通过两个参数appium服务设备参数对象创建 appium包的webdriver 对象。并赋值给基础类AppElementdriver属性。

`AppElement.driver`。 = webdriver.Remote(AppConfig.service_path, desired_caps)

3.app = App()app.test()

该方法会创建App对象,并执行界面测试方法。

二、appium_demo项目构建过程

1、基础类的创建

参考Android控件的继承思路:View->ViewGroup->Activity。创建控件基类AppElement,所有ViewGroupActivity都继承自它。

1.1 在AppElement里面写入类的基础属性webdriver

这样所有界面或布局都可以使用webdriver来查找或者操作Element元素。类似APP里面的BaseActivity里面的基础属性,在所有界面都可以调用。

因为在Appium的使用过程是先创建webdriver,所以我们在创建webdriver对象后就赋值给AppElement.driver。然后我们再创建MainActivity对象就可以使用webdriver的方法,并进行测试。

1.2 在AppElement里面添加基础查找Element元素的方法:findElementIdfindElementTextfindElementTextWait

通过findElementId方法,我们可以延迟查找Element元素,并捕捉异常等逻辑。 以及其他常用的向一定方向划动的方法,如swipeUp、swipeDown等。

1.3 创建界面的标题栏TitleLayou

TitleLayout类中初始化公共属性标题文本控件:title返回按钮:back右侧功能按钮:iv_right。编写界面标题栏的基础方法:点击返回按钮方法:finish获取标题文本控件文字方法:getTitle点击右侧功能按钮方法:rightClick

1.4 创建界面的基类Activity

在Activity基类中初始化界面的标题栏:title。根据传入的界面的class_name从全局配置的类名和包名对应数据列表activity_list中查找对应类的全路径,在初始化界面的时候使用driver.wait_activity方法等待界面出现,防止界面未加载完成就查找控件产生异常等。

1.5 将上面的Activity类名和包名的对应数据配置在module包下activity_list中,方便保存和读取:

2、界面的创建

2.1创建一个建议反馈的界面FeedbackActivity类。

该类继承自Activity基类,并使用Activity.__init__(self, self.__class__.__name__)方法复写Activity__init__方法。(和java不同这里必须复写才能执行Activity__init__方法)

在使用__init__方法时将当前类的__name__传入Acitivity中执行上面讲的wait_activity方法以及初始化界面的标题等。

2.2 在FeedbackActivity界面中编写操作、测试控件的方法和逻辑。

如上图中的建议反馈界面所示,有一个内容输入的文本框,下方还有一个添加图片的按钮。

所以我们在建议反馈界面编写【提示用户输入反馈内容】的方法-【inputContent】,以及下面的【添加图片】的方法-【selectPicture】【请输入手机号】的方法-【inputPhone】【点击提交按钮】的方法-【submitFeedBack】等。可以在初始化FeedbackActivity界面时执行所有方法,也可以在创建FeedbackActivity实例后单独调用方法。

进入FeedbackActivity界面中,我们执行方法的顺序为:inputContent->selectPicture->inputPhone->submitFeedBack->finish,执行完所有逻辑后再执行返回方法finish返回首页。

这样一个测试界面就编写完成了。

2.3 编写测试界面代码后,我们还需要编写**APP进入测试界面FeedbackActivity**的逻辑

在Appium程序的启动过程中,我们在创建webdriver对象启动APP的时候,需要在APP配置信息参数中添加启动界面信息:

# desired_caps就是APP配置信息
AppElement.driver = webdriver.Remote(AppConfig.service_path, desired_caps)
# appActivity对应的就是启动界面的信息
desired_caps = {
	.....
    'appPackage': 'com.ennova.dreamlf',
    'appActivity': 'com.ennova.dreamlf.module.main.splash.SplashActivity',
}

Appium启动APP后会自动跳转到APP的主页.module.main.MainActivity。所以我们需要编写APP的 主界面MainActivity类及相应的跳转方法

2.3.1 编写主界面MainActivity的代码

如上图所示,MainActivity主界面是由首页我的两个模块组成,所以我们先在 mainac.py 文件中创建需要的MainActivityHomeFragment类。在MainActivity类中创建homeTest方法测试首页模块逻辑。

def __init__(self):
	...
def homeTest(self, vp_test=True, grid_test=True):
    home_fragment = HomeFragment()
    if vp_test: home_fragment.viewPagerTest()
    if grid_test: home_fragment.gridClick(3)

homeTest方法中,创建HomeFragment对象并执行上方轮播图布局点击测试或者中间九宫格按钮点击测试。

进入后MainActivity界面中,执行的方法homeTest(vp_test=False, grid_test=True)我们来测试九宫格点击逻辑。

2.3.2 编写首页HomeFragment的代码

def viewPagerTest(self):
    .....
def gridClick(self, module_num=-1):
	module_rv = self.findElementId("module_rv")
	.....
	if module_num == 3 or module_num == -1:
        # 建议反馈点击
        module_rv.find_elements(by=By.CLASS_NAME, value="android.widget.LinearLayout")[3].click()
        feedbackactivity = FeedbackActivity()

gridClick方法中,判断传入参数module_num为3时,从module_rv列表布局中查找第四项子元素即建议反馈控件并点击,这样APP就进入了建议反馈界面FeedbackActivity

在首页的建议反馈控件点击后,通过创建feedbackactivity = FeedbackActivity()来测试建议反馈界面。

运行测试程序即可测试界面功能

至此测试框架已经完成。

appium_demo项目除了包含appium测试框架外,同时包含了启动Android模拟器程序,以及启动AppiumServie程序

启动Android模拟器程序所在位置

android_avd.py

start_avd()

启动AppiumServie程序所在位置

multi_appium.py

start_service()