博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
appium+python+unittest+HTMLRunner编写UI自动化测试集
阅读量:5884 次
发布时间:2019-06-19

本文共 5589 字,大约阅读时间需要 18 分钟。

简介

  • 获取AppPackage和AppActivity
  • 定位UI控件的工具
  • 脚本结构
  • PageObject分层管理
  • HTMLTestRunner生成测试报告
  • 启动appium server服务
  • 以python文件模式执行脚本生成测试报告

下载与安装

下载需要自动化测试的App并安装到手机

获取AppPackage和AppActivity

参考:

最终,得到App的信息如下:

appPackage:com.nbi.aquaticappActivity:.ui.login.LoginActivity复制代码

定位UI控件的工具

使用Android SDK的uiautomatorviewer.bat(在..\sdk\tools\ 目录下),电脑开启开发者模式,可以使用adb命令的状态下使用该sdk自带的工具,可视化安卓手机的界面信息

脚本结构

somke_test.py 存放测试集

存放自动化测试所用到的数据,如账号密码,默认密码等

pool.py等 测试集中的一个测试用例的page层

页面基础层,供page层继承

生成测试报告的模块,可集成到代码里不需在环境中安装该模块,也可在电脑python环境里安装配置 (参考:

存放自动化测试所用到的数据,如账号密码,默认密码等

settings = {    'admin': {        'number': '13600000000',        'password': 'qaz123'    },    'default_password': 'a123456'}ADMIN_NUMBER = settings['admin']['number']ADMIN_PASSWORD = settings['admin']['password']复制代码

启动app的相关配置传到appium服务端和连接手机的代码写在测试集TestCase外面,如果写在初始化测试平台的测试用例里则只能启动执行一次用例

desired_caps = {}# Android自动化还是Ios自动化desired_caps['platformName'] = 'Android'# Android操作系统版本desired_caps['platformVersion'] = '5.1'# 设备名称desired_caps['deviceName'] = '127.0.0.1:62001'# 被测App包名desired_caps['appPackage'] = 'com.nbi.aquatic'# 被测App的入口Activity名desired_caps['appActivity'] = '.ui.login.LoginActivity'desired_caps['automationName'] = 'Uiautomator2'# 把以上配置传到appium服务端并连接手机driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)复制代码

启动app,用到的是unittest自带的setUp方法

def setUp(self):   # 初始化测试平台   self.driver = driver复制代码

关闭app,用到的不是unittest自带的tearDown方法,而是自定义了一个test_*_end_testing函数,这个函数负责关闭app,是在测试集里的最后一个测试用例

def test_36_end_testing(self):   """结束测试"""   self.driver.quit()复制代码

整体测试用例结构,采用PageObject分层管理

1.一个测试用例就是一个函数,后期增加用例时在后面增加新函数即可

2.为了使用unittest框架执行测试集,命名都以test开头,例如test_16_creat_aquatype

3.每个用例又分独立的page层,例如测试集里的用例test_16_creat_aquatype,其page层就是PoolPage,在编写测试集时引入该文件即可,也就是testcase层调用page层

from appium import webdriverfrom test_case.page_object.admin.pool import PoolPageimport unittestimport configimport timeclass SmokeTest(unittest.TestCase):    def setUp(self):         # 初始化测试平台         self.driver = driver    def test_10_admin_login(self):         """手机登录"""         LoginPage(self.driver).PhoneNumberlogin_action(            config.ADMIN_NUMBER,            config.ADMIN_PASSWORD,           )    def test_16_creat_aquatype(self):          """添加水产类型"""          PoolPage(self.driver).creat_aquatype(new_aquatype_name)   def test_17_creat_aquatic(self):          """养殖池添加养殖"""          PoolPage(self.driver).creat_aquatic()     def test_36_end_testing(self):          """结束测试"""          self.driver.quit()if  __name__ == '__main__':      # 定义一个单元测试容器      suite = unittest.TestSuite()      # addTest添加case到suite容器中,构造测试集      suite.addTest(SmokeTest('test_10_admin_login'))      suite.addTest(SmokeTest('test_16_creat_aquatype'))      suite.addTest(SmokeTest('test_17_creat_aquatic'))      suite.addTest(SmokeTest('test_36_end_testing'))      # 执行case      runner.run(suite)复制代码

4.测试用例test_16_creat_aquatype的page层就是PoolPage,每个page层又都继承页面基础层BasePage

from selenium.webdriver.common.by import Byfrom test_case.page_object.base import BasePageimport timeclass PoolPage(BasePage):    """定位元素"""    creataquatic_btn_loc = (By.ID, 'com.nbi.aquatic:id/tv_add_breed')    select_starttime_btn_loc = (By.ID, 'com.nbi.aquatic:id/textView158')    # 添加水产类型(水产名称最长10个字符)    def creat_aquatype(self, aquatype_name):        time.sleep(3)        self.find_element(*self.creataquatic_btn_loc).click()    .......    # 养殖池添加养殖    def creat_aquatic(self):        self.find_element(*self.select_starttime_btn_loc).click()复制代码

5.页面基础层BasePage

from selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECclass BasePage(object):    """页面基础类,用于所有页面的继承"""    def __init__(self, selenium_driver):        self.driver = selenium_driver        self.timeout = 30        self.poll_frequency = 0.1    def find_element(self, *loc):        return self.driver.find_element(*loc)    def find_elements(self, *loc):        return self.driver.find_elements(*loc)    def content_appeared(self):        self.find_element()    def wait(self, loc):        WebDriverWait(self.driver, 10, 0.005).until(            EC.visibility_of_element_located(loc)        )    def wait_and_compare(self, loc, text):        WebDriverWait(self.driver, 30, 0.5).until(            EC.text_to_be_present_in_element(loc, text)        )复制代码

生成HTML测试结果报告

引入方式一,直接电脑python环境安装HTMLTestRunner模块

import HTMLTestRunnerif  __name__ == '__main__':      suite = unittest.TestSuite()      suite.addTest(SmokeTest('test_*_*'))      # 写法一      timestr = time.strftime('%Y%m%d', time.localtime(time.time()))  # 本地日期作为报告名字      filename = 'F:\\folder_data\\'         # 文件名字及保存路径      fp = open(filename + (timestr + '.html'), 'wb')      runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title='冒烟测试报告', description='用例执行情况: ')      # 写法二     timestr = time.strftime('%Y%m%d', time.localtime(time.time()))     filename = '../_reports/' + timestr + '.html'     fp = open(filename, 'wb')     runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title='冒烟测试报告', description='用例执行情况: ')     # 执行case,并生成一份测试报告     runner.run(suite)     fp.close()复制代码

引入方式二,将HTMLTestRunner下载集成在代码内

模块下载地址:

from packages.HTMLTestRunner import HTMLTestRunnerif  __name__ == '__main__':      suite = unittest.TestSuite()      suite.addTest(SmokeTest('test_*_*'))      # 写法三      fp = open('../_reports/result.html', 'wb')      runner = HTMLTestRunner(stream=fp, title='冒烟测试报告', description='用例执行情况: ')      # 执行case,并生成一份测试报告      runner.run(suite)      fp.close()复制代码

启动appium server服务

参考:

以python文件模式执行脚本生成测试报告

参考:

转载于:https://juejin.im/post/5c49a23cf265da61483befea

你可能感兴趣的文章
Oracle之内存结构(SGA、PGA)
查看>>
Binary Search Tree IN C
查看>>
jquery之trigger()
查看>>
Spring源码浅析之事务(四)
查看>>
我的友情链接
查看>>
[APM] 2个实例+5个维度解读APM技术
查看>>
Jndi配置数据源
查看>>
华为交换机端口链路类型简析——access、trunk、hybrid
查看>>
[转载] Live Writer 配置写 CSDN、BlogBus、cnBlogs、163、sina 博客
查看>>
2013年SEO集群最新优化工具
查看>>
SQL:连表查询
查看>>
MySQL日期函数、时间函数总结(MySQL 5.X)
查看>>
c语言用尾插法新建链表和输出建好的链表
查看>>
Java基础学习总结(1)——equals方法
查看>>
高性能 Oracle JDBC 编程
查看>>
java 中ResultSet可以获取的数据类型及返回值类型列表
查看>>
ubuntu 13 安装SH程序
查看>>
支付宝升级延时到账功能
查看>>
ghost后只剩下一个盘的数据寻回方法
查看>>
输入输出练习
查看>>