zoukankan      html  css  js  c++  java
  • appium+python+unittest+HTMLRunner编写UI自动化测试集

    简介

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

    下载与安装

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


    获取AppPackage和AppActivity

    参考:https://juejin.im/post/5c3809a451882524c84ebabe

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

    1 appPackage:com.nbi.aquatic
    2 appActivity:.ui.login.LoginActivity

    定位UI控件的工具

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

    脚本结构

    somke_test.py 存放测试集

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

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

    base.py 页面基础层,供page层继承

    HTMLTestRunner.py 生成测试报告的模块,可集成到代码里不需在环境中安装该模块,也可在电脑python环境里安装配置
    (参考:https://blog.csdn.net/weixin_38981172/article/details/82389416)


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

    1 settings = {
    2    'admin': {
    3       'number': '13600000000',
    4       'password': 'qaz123'
    5    },
    6    'default_password': 'a123456'
    7 }
    8 ADMIN_NUMBER = settings['admin']['number']
    9 ADMIN_PASSWORD = settings['admin']['password']

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

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

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

    1 def setUp(self):
    2    # 初始化测试平台
    3    self.driver = driver

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

    1 def test_36_end_testing(self):
    2     """结束测试"""
    3     self.driver.quit()

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

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

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

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

     1 from appium import webdriver
     2 from test_case.page_object.admin.pool import PoolPage
     3 import unittest
     4 import config
     5 import time
     6 class SmokeTest(unittest.TestCase):
     7   def setUp(self):
     8       # 初始化测试平台
     9       self.driver = driver
    10   def test_10_admin_login(self):
    11       """手机登录"""
    12       LoginPage(self.driver).PhoneNumberlogin_action(
    13          config.ADMIN_NUMBER,
    14          config.ADMIN_PASSWORD,
    15      )
    16   def test_16_creat_aquatype(self):
    17       """添加水产类型"""
    18       PoolPage(self.driver).creat_aquatype(new_aquatype_name)
    19   def test_17_creat_aquatic(self):
    20       """养殖池添加养殖"""
    21       PoolPage(self.driver).creat_aquatic()
    22   def test_36_end_testing(self):
    23       """结束测试"""
    24       self.driver.quit()
    25 if __name__ == '__main__':
    26      # 定义一个单元测试容器
    27      suite = unittest.TestSuite()
    28      # addTest添加case到suite容器中,构造测试集
    29      suite.addTest(SmokeTest('test_10_admin_login'))
    30      suite.addTest(SmokeTest('test_16_creat_aquatype'))
    31      suite.addTest(SmokeTest('test_17_creat_aquatic'))
    32      suite.addTest(SmokeTest('test_36_end_testing'))
    33      # 执行case
    34      runner.run(suite)

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

     1 from selenium.webdriver.common.by import By
     2 from test_case.page_object.base import BasePage
     3 import time
     4 class PoolPage(BasePage):
     5     """定位元素"""
     6     creataquatic_btn_loc = (By.ID, 'com.nbi.aquatic:id/tv_add_breed')
     7     select_starttime_btn_loc = (By.ID, 'com.nbi.aquatic:id/textView158')
     8     # 添加水产类型(水产名称最长10个字符)
     9     def creat_aquatype(self, aquatype_name):
    10         time.sleep(3)
    11         self.find_element(*self.creataquatic_btn_loc).click()
    12     .......
    13     # 养殖池添加养殖
    14     def creat_aquatic(self):
    15         self.find_element(*self.select_starttime_btn_loc).click()

    5.页面基础层BasePage

     1 from selenium.webdriver.support.ui import WebDriverWait
     2 from selenium.webdriver.support import expected_conditions as EC
     3 class BasePage(object):
     4    """页面基础类,用于所有页面的继承"""
     5    def __init__(self, selenium_driver):
     6       self.driver = selenium_driver
     7       self.timeout = 30
     8       self.poll_frequency = 0.1
     9 
    10    def find_element(self, *loc):
    11       return self.driver.find_element(*loc)
    12 
    13    def find_elements(self, *loc):
    14       return self.driver.find_elements(*loc)
    15 
    16    def content_appeared(self):
    17       self.find_element()
    18 
    19    def wait(self, loc):
    20       WebDriverWait(self.driver, 10, 0.005).until(
    21       EC.visibility_of_element_located(loc)
    22    )
    23 
    24    def wait_and_compare(self, loc, text):
    25       WebDriverWait(self.driver, 30, 0.5).until(
    26       EC.text_to_be_present_in_element(loc, text)
    27    )

    生成HTML测试结果报告

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

     1 import HTMLTestRunner
     2 if __name__ == '__main__':
     3     suite = unittest.TestSuite()
     4     suite.addTest(SmokeTest('test_*_*'))
     5     # 写法一
     6     timestr = time.strftime('%Y%m%d', time.localtime(time.time())) # 本地日期作为报告名字
     7     filename = 'F:\folder_data\' # 文件名字及保存路径
     8     fp = open(filename + (timestr + '.html'), 'wb')
     9     runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title='冒烟测试报告', description='用例执行情况: ')
    10 
    11    # 写法二
    12    timestr = time.strftime('%Y%m%d', time.localtime(time.time()))
    13    filename = '../_reports/' + timestr + '.html'
    14    fp = open(filename, 'wb')
    15    runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title='冒烟测试报告', description='用例执行情况: ')
    16 
    17    # 执行case,并生成一份测试报告
    18    runner.run(suite)
    19    fp.close()

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

    模块下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html

     1 from packages.HTMLTestRunner import HTMLTestRunner
     2 if __name__ == '__main__':
     3     suite = unittest.TestSuite()
     4     suite.addTest(SmokeTest('test_*_*'))
     5     # 写法三
     6     fp = open('../_reports/result.html', 'wb')
     7     runner = HTMLTestRunner(stream=fp, title='冒烟测试报告', description='用例执行情况: ')
     8     # 执行case,并生成一份测试报告
     9     runner.run(suite)
    10     fp.close()

    启动appium server服务

    参考:https://juejin.im/post/5c25c6b5f265da612c5df54c


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

    参考:https://juejin.im/post/5c21e4d26fb9a049fd0fdf80

  • 相关阅读:
    预备作业03
    2017-2018-2《程序设计与数据结构》实验2报告
    2017-2018-2 《程序设计与数据结构》第7周学习总结
    2017-2018-2 《程序设计与数据结构》第六周学习总结
    20172312 《程序设计与数据结构》第五周学习总结
    20172312 《程序设计与数据结构》第四周学习总结
    20172312 《程序设计与数据结构》第三周学习总结
    20172312 实验一《Java开发环境的熟悉》实验报告
    第二周作业
    第一周作业
  • 原文地址:https://www.cnblogs.com/kristin/p/10322644.html
Copyright © 2011-2022 走看看