本文介绍通过python实现APP自动化的框架,对通讯录软件进行测试,文末有实操源码。
具体业务逻辑可基于框架补充。
预备知识:
APP移动端自动化基础及appium环境搭建
appium元素定位
框架功能:
业务功能封装、测试用例封装、测试包管理、截图出来、断言处理、日志获取、测试报告生成、测试驱动、数据配置
项目目录
如下部分,截图为教学案例,因没有教学案例所用APP安装包,实操部分,使用夜神模拟器自带的通讯录软件进行操作。
框架执行顺序:
run执行入口,收集用例->执行test_login,测试类TestAdd继承StartEnd->执行StartEnd的setup,进行driver设置->执行test_login 下的test_get_zhangsan->
执行StartEnd中的teardown
->执行StartEnd的setup>执行test_login下的test_login_001->执行StartEnd中的teardown->生成测试报告
封装元素基本操作
class BaseView(object):
def __init__(self,driver):
self.driver=driver
def find_element(self,*loc):
return self.driver.find_element(*loc)
def find_elemets(self,*loc):
return self.find_elemets(*loc)
def get_window_size(self):
return self.driver.get_windows_size()
def swipe(self,start_x,start_y,end_x,end_y,duration):
return self.driver.swipe(self,start_x,start_y,end_x,end_y,duration)
定义一些页面元素/相关操作
APP设备相关信息及连接
from appium import webdriver
import yaml
import logging
import logging.config
import os
CON_LOG='../config/log/conf'
def appium_desired():
"""
yaml是一种简洁的非标记语言,以数据为中心,使用空白,分行组织数据
:return:
"""
with open('../config/config.yaml','r',encoding='utf-8')as file:
data=yaml.load(file, Loader=yaml.FullLoader)
#创建设备信息
desired_caps={}
desired_caps['platformName']=data['platformName']
desired_caps['platformVersion']=data['platformVersion'] # #在手机设置,关于平板电脑可以找到版本
desired_caps['deviceName']=data['deviceName'] #模拟器上设备的名称 在cmd下用adb devices显示的地址
desired_caps['appPackage']=data['appPackage']#通讯录包名
desired_caps['appActivity']=data['appActivity']#app活动名
#连接
driver=webdriver.Remote(data['url'],desired_caps)#连接的是appium
driver.implicitly_wait(5)
return driver
初始化和结束测试固件
import unittest
from common.desired_caps import appium_desired
import logging
from time import sleep
class StartEnd(unittest.TestCase):
def setUp(self):
logging.info("---------------setup-------------")
self.driver=appium_desired()
def tearDown(self):
logging.info("---------------tearDown---------")
sleep(5)
self.driver.close_app()
需要注意的点是,如上代码的setup和teardown会导致在测试类的每一个test方法前都初始化一次driver,所以每次test前后APP都会关闭启动,消耗时间。
如何使在在一个测试类中只启动一次APP呢?
可以使用 setupClass
import unittest
from common.desired_caps import appium_desired
import logging
from time import sleep
class StartEnd(unittest.TestCase):
@classmethod
def setUpClass(cls):
logging.info("---------------setup-------------")
cls.driver=appium_desired()
@classmethod
def tearDownClass(cls):
logging.info("---------------tearDown---------")
sleep(5)
# self.driver.close_app()
配置信息文件
platformName: Android
platformVersion: 7.1.2
deviceName: 127.0.0.1:62001
appPackage: com.android.contacts
appActivity: .activities.PeopleActivity
url: http://127.0.0.1:4723/wd/hub
测试数据文件
业务逻辑封装
测试用例组织
执行入口,包含测试报告生成
初级水平,可入面试,深层次的,需要继续学习。
该软件为夜深模拟器上自带的通讯录软件。
运行结果一条通过一条不通过
测试报告
源码:GitHub - 2504973175/API_UIAuto: APP移动端UI自动化
总结:APP移动端自动化与webUI自动化很像,只是一些基础的知识不同,如appium使用,元素定位相关,但selenium的使用是类似的。
各种自动化测试框架,都大同小异,甚至包括接口自动化测试。
框架只是入门,能够实战落地,并在工作中运用,提高测试效率才是根本。
如何结合实践,修改框架,如何封装业务逻辑,以及框架的优化,会更考验能力。