• PO封装设计模式 -- App移动端测试


    前言:

    一、App_Po 封装 (用互联网上随便一个app进行)

     base 存放的是页面基础类,后续的类需继承基础类

    common 存放的是公共部分,测试固件分离部分,新增截图功能部分

    Data 存放的是测试数据部分

    Image 存放的是每次执行一个动作都需要进行截图,以时间戳的形式存储

    log 存放的每次执行一个动作产生的日志

    page 页面对象元素进行封装,继承base下的基础类

    report 存放的用例执行结束后生成的测试报告

    testcase 测试用例编写部分

    Utils 存放的是对数据读取方法进行封装,对日志方法进行封装

    readme.md 供读者阅读,方便查阅

    runallcase.py 执行所有测试用例,程序的入口

    二、base -->BasePage 基础类封装如下

    #基础类的方法封装

    class BasePage(object):
    #构造方法
    def __init__(self,driver):
    self.driver = driver

    #构造By_id 定位的改写
    def by_id(self,loc):
    try:
    return self.driver.find_element_by_id(loc)
    except Exception as message:
    print('元素定位抛出异常,异常原因为:{}'.format(message))

    # 构造By_name 定位的改写
    def by_name(self, loc):
    try:
    return self.driver.find_element_by_name(loc)
    except Exception as message:
    print('元素定位抛出异常,异常原因为:{}'.format(message))

    # 构造By_xpath 定位的改写
    def by_xpath(self, loc):
    try:
    return self.driver.find_element_by_xpath(loc)
    except Exception as message:
    print('元素定位抛出异常,异常原因为:{}'.format(message))

    #构造By_classname 定位的改写
    def by_classname(self,loc):
    try:
    return self.driver.find_element_by_classname(loc)
    except Exception as message:
    print('元素定位抛出异常,异常原因为:{}'.format(message))

    三、page -->Page_login.py 封装如下
    from TestCase.App_Po.base.BasePage import BasePage
    from time import sleep

    class PageItest(BasePage):
    #元素定位实例化属性
    input_username_text_loc = ('xxxxx') # 输入账号
    input_password_text_loc = ('xxxxx') # 输入密码
    click_login_button_loc = ('登录') # 点击登录
    login_success_info_loc = ('xxxx') # 获取登录成功后的断言信息
    login_error_info_loc = ('xxxxx') # 获取登录失败的断言信息

    #输入账号封装
    def input_username(self,username):
    self.by_id(self.input_username_text_loc).send_keys(username)

    #输入密码封装
    def input_password(self,password):
    self.by_id(self.input_password_text_loc).send_keys(password)

    #点击登录封装
    def click_login(self):
    self.by_name(self.click_login_button_loc).click()

    #获取登录成功后的断言文本
    def login_success(self):
    return self.by_id(self.login_success_info_loc).text

    #获取登录失败的断言文本
    def login_error(self):
    return self.by_id(self.login_error_info_loc).text

    #登录ITest流程封装
    def Itest_login_liucheng(self,username,password):
    sleep(2)
    self.input_username(username)
    self.input_password(password)
    self.click_login()

    四、common -->Myunit.py 测试固件分离封装如下
    #测试固件分离

    from TestCase.App_Po.page.Page_login import PageItest
    from appium import webdriver
    from time import sleep
    import unittest
    import os

    class myunit(unittest.TestCase):
    sleep(60) #强制等待60s左右,避免用例跑起来失败
    def setUp(self) -> None:
    # apk 路径
    PATH = lambda x: os.path.join(os.path.dirname(os.path.realpath(__file__)), x)

    # 下载itest
    print(PATH("iTest4.7.0.apk"))

    desired_caps = {
    "platformName": "Android",
    "platformVersion": "9",
    "deviceName": "127.0.0.1:62001",
    "app": PATH("toutiao.apk"),
    "appPackage": "iflytek.testTech.propertytool",
    "appActivity": "iflytek.testTech.propertytool.activity.BootActivity",
    "noReset": True,
    "autoAcceptAlerts": "true",
    'unicodeKeyboard':True, #使用unicode编码发送字符串
    'resetKeyboard':True #将软键盘藏起来
    }

    self.driver = webdriver.Remote("http://localhost:4723/wd/hub", desired_caps)
    #等待app首页出现
    self.driver.wait_activity('xxxxxxx',20)
    #实例化对象
    self.ITest = PageItest(self.driver)

    def tearDown(self) -> None:
    self.driver.close_app()

    新增截图功能方法封装

    #截图功能

    import os
    import time

    def insert_image(driver,picturetype):
    image_path = os.path.join(os.path.dirname(os.path.dirname(__file__)),'Image')
    timer = time.strftime('%Y_%m_%d_%H_%M_%S')
    new_path = image_path + '\' + timer + picturetype
    # return new_path
    driver.get_screenshot_as_file(new_path)


    五、Utils -->helper.py 测试工具封装(日志存放、读取Data下的测试数据):
    #封装工具类

    import os
    import xlrd
    import logging

    class Helper(object):
    def Readpath(self,filename='',filepath=''):
    '''定义存储数据的文件路径'''
    return os.path.join(os.path.dirname(os.path.dirname(__file__)),filepath,filename)

    def ReadExcels(self,rows):
    '''读取excel文件xx行的数据'''
    book = xlrd.open_workbook(self.Readpath('Itestinfo.xlsx','Data'),'r')
    table = book.sheet_by_index(0)
    return table.row_values(rows)

    def log(self,log_content):
    '''日志定义级别'''
    # 定义文件
    logFile = logging.FileHandler(self.Readpath('logInfo.md','log'), 'a',encoding='utf-8')
    # log格式
    fmt = logging.Formatter(fmt='%(asctime)s-%(name)s-%(levelname)s-%(module)s:%(message)s')
    logFile.setFormatter(fmt)

    # 定义日志
    logger1 = logging.Logger('logTest', level=logging.DEBUG)
    logger1.addHandler(logFile)
    logger1.info(log_content)

    def Readusername(self,rows):
    '''读取文件中的用户数据'''
    return str(self.ReadExcels(rows)[0])

    def Readpassword(self,rows):
    '''读取文件中的密码数据'''
    return str(self.ReadExcels(rows)[1])

    def Readresult(self,rows):
    '''读取文件中的预期结果数据'''
    return self.ReadExcels(rows)[2]


    # D:/Project/TestCase/App_PoDataItestinfo.xlsx
    per = Helper()
    print(per.log('这是一个日志'))

    六、测试用例封装 继承 PageItest、myunit、Helper
    from TestCase.App_Po.common.Myunit import myunit
    from TestCase.App_Po.common.function import *
    from TestCase.App_Po.page.Page_login import PageItest
    from TestCase.App_Po.Utils.helper import Helper
    import unittest

    #类的继承
    class Itest_Login(PageItest,myunit,Helper):
    def test_Itest_success(self):
    '''验证登录成功:账号和密码输入正确'''
    self.log('logging日志信息:输入账号和密码')
    self.ITest.Itest_login_liucheng(self.Readusername(1),self.Readpassword(1))
    self.log('logging日志信息:对登录结果进行验证')
    self.assertEqual(self.ITest.login_success(), self.Readresult(1), '测试用例成功')
    self.log('logging日志信息:对登录成功进行截图')
    #实现截图功能 必须是png格式(官方指定)
    insert_image(self.driver,'success_info.png')

    def test_Itest_error2(self):
    '''验证登录失败:账号正确密码为空'''
    self.log('logging日志信息:输入账号和密码为空')
    self.ITest.Itest_login_liucheng(self.Readusername(2),self.Readpassword(2))
    self.log('logging日志信息:对登录结果进行验证')
    self.assertEqual(self.ITest.login_error(), self.Readresult(2), '测试用例失败')
    self.log('logging日志信息:对登录失败进行截图')
    # 实现截图功能 必须是png格式(官方指定)
    insert_image(self.driver, 'passwd_null.png')

    def test_Itest_error3(self):
    '''验证登录失败:账号为空密码正确'''
    self.log('logging日志信息:输入账号为空和密码正确')
    self.ITest.Itest_login_liucheng(self.Readusername(3),self.Readpassword(3))
    self.log('logging日志信息:对登录结果进行验证')
    self.assertEqual(self.ITest.login_error(), self.Readresult(3), '测试用例失败')
    self.log('logging日志信息:对登录失败进行截图')
    # 实现截图功能 必须是png格式(官方指定)
    insert_image(self.driver, 'username_null.png')

    def test_Itest_error4(self):
    '''验证登录失败:账号非法密码正确'''
    self.log('logging日志信息:输入账号非法和密码正确')
    self.ITest.Itest_login_liucheng(self.Readusername(4),self.Readpassword(4))
    self.log('logging日志信息:对登录结果进行验证')
    self.assertEqual(self.ITest.login_error(), self.Readresult(4), '测试用例失败')
    self.log('logging日志信息:对登录失败进行截图')
    # 实现截图功能 必须是png格式(官方指定)
    insert_image(self.driver, 'username_Fail.png')

    def test_Itest_error5(self):
    '''验证登录失败:账号为空密码为空'''
    self.log('logging日志信息:输入账号和密码都为空')
    self.ITest.Itest_login_liucheng(self.Readusername(5),self.Readpassword(5))
    self.log('logging日志信息:对登录结果进行验证')
    self.assertEqual(self.ITest.login_error(), self.Readresult(5), '测试用例失败')
    self.log('logging日志信息:对登录失败进行截图')
    # 实现截图功能 必须是png格式(官方指定)
    insert_image(self.driver, 'username_passwd_null.png')

    if __name__ == '__main__':
    unittest.main(verbosity=2)

    七、执行测试用例
    import unittest
    import os
    import time
    from HTMLTestRunner import HTMLTestRunner

    def alltest():
    '''获取testcase下的所有测试模块'''
    suite = unittest.defaultTestLoader.discover(
    start_dir=os.path.join(os.path.dirname(__file__),'testcase'),
    pattern='Itest_login.py',
    top_level_dir=None
    )
    return suite

    def getNowtime():
    '''获取当前的时间'''
    return time.strftime('%Y_%m_%d %H_%M_%S')

    def run():
    '''主函数入口'''
    fp = open(os.path.join(os.path.dirname(__file__),'report',getNowtime() + 'report.html'),'wb')
    HTMLTestRunner(
    stream=fp,
    title='Appium自动化测试框架设计',
    description='基于python语言的appium自动化测试框架设计'
    ).run(alltest())

    if __name__ == '__main__':
    run()

  • 相关阅读:
    vi文本编辑器常用指令功能
    如何利用U盘进行重装win10系统(2020.11亲测可行)
    技术文档:用户和文件权限管理
    把树莓派变身无线AP
    循环控制结构程序03 零基础入门学习C语言18
    循环控制结构程序03 零基础入门学习C语言18
    循环控制结构程序01 零基础入门学习C语言16
    循环控制结构程序04 零基础入门学习C语言19
    循环控制结构程序01 零基础入门学习C语言16
    循环控制结构程序02 零基础入门学习C语言17
  • 原文地址:https://www.cnblogs.com/Teachertao/p/11893072.html
Copyright © 2020-2023  润新知