前言:

一、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_Po\Data\Itestinfo.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()

PO封装设计模式 -- App移动端测试的更多相关文章

  1. PO封装设计模式 -- Web页面端测试

    一.已登录页面 -->新建PO封装的包 -- 以下源码适用于python3以上的版本 代码优化新增 Image -->对操作步骤进行截图 二.basepage 包基础类的封装如下: fro ...

  2. APP移动端测试

    重点: app测试的内容 add 命令  monkey命令 次重点:模拟器的安装 雷电 夜神 android 自带的模拟器 真机测试 简单了解云测Testing  腾讯云() 了解:市场有点移动端的操 ...

  3. APP端测试与web端测试的区别

    想要知道APP端测试与web端测试的区别 ,那么我们就要先来了解,web和app的区别. web项目,一般都是b/s架构,基于浏览器的,而app则是c/s的,必须要有客户端.那么在系统测试测试的时候就 ...

  4. PC/APP/H5三端测试的相同与不同

    随着手机应用的不断状态,同一款产品的移动端应用市场占相较PC端也越来越大,那么app与PC端针对这些产品的测试有什么相同与不同之处呢?总结如下: 首先谈一谈相同之处: 一,针对同一个系统功能的测试,三 ...

  5. (原创)如何对APP服务端进行压力测试

    版权声明:本文为原创文章,转载请先联系并标明出处 APP性能测试分为客户端性能测试和服务端性能测试,客户端的性能测试主要是针对启动快慢.耗电量.耗流量.内存使用等指标进行评估,目前主流的APP客户端性 ...

  6. PC、APP、H5三端测试的相同与不同

    随着手机应用的不断状态,同一款产品的移动端应用市场占相较PC端也越来越大,那么app与PC端针对这些产品的测试有什么相同与不同之处呢?笔者总结如下: 首先谈一谈相同之处... 一,针对同一个系统功能的 ...

  7. PC、APP、H5三端测试的区别

    一,针对同一个系统功能的测试,三端所测的业务流程是一样的 二,一般情况下手机端和PC端都对应一套后台服务,比如说笔者公司所开发的互联网金融平台,整个平台做了分布式服务架构,后台服务包括用户服务.交易服 ...

  8. 01- APP移动端测试怎么测试?APP测试方法大全。

    由于智能手机时代来临,很多产品都有了APP,作为一个测试人员掌握APP测试是必要的. 在展开APP测试之前,首先了解一下几个点: 1.基于软件测试框架之上.复习下软件测试框架. 2.框架的内容贯穿于A ...

  9. web端,app端,小程序端测试差异详解

    前置解释:1.单纯从功能测试的层面上来讲的话,APP 测试.web 测试和H5测试在流程和功能测试上是没有区别的2.Web项目或pc项目都是在电脑上进行测试的.常见的PC项目架构有BS架构和CS架构的 ...

随机推荐

  1. Spring Cloud系列(五):服务网关Zuul

    在前面的篇章都是一个服务消费者去调用一个服务提供者,但事实上我们的系统基本不会那么简单,如果真的是那么简单的业务架构我们也没必要用Spring Cloud,直接部署一个Spring Boot应用就够了 ...

  2. mysqldump 使用规范

    数据库很重要,没有备份,数据丢失只能跑路.所以还是做好备份吧! 目录 一.工具介绍 二.工具特点 三.备份权限 四.工具使用限制 五.已知BUG 六.备份前注意事项 6.1 需要长时间备份或导入时,请 ...

  3. 深入Netty逻辑架构,从Reactor线程模型开始

    本文是Netty系列第6篇 上一篇文章我们从一个Netty的使用Demo,了解了用Netty构建一个Server服务端应用的基本方式.并且从这个Demo出发,简述了Netty的逻辑架构,并对Chann ...

  4. Centos7拓展磁盘(逻辑增加)

    目录 第一步 第二步 第三步 以107.4G的Centos操作系统拓展20G磁盘空间,并将此20G磁盘空间分别分配给/home为例. 第一步 首先查看操作系统分区状况和磁盘占用情况.发现磁盘sda空间 ...

  5. 从零开始学架构(三)UML建模

    文章大纲 1.  文章介绍 2.  UML概述 3.  静态模型 4.  动态模型 5.  UML建模的一般过程 一.文章介绍 1.1为什么学习UML (1)UML是一种软件架构的模型表现方法,用于项 ...

  6. UNREFERENCED_PARAMETER的用处

    UNREFERENCED_PARAMETER的用处 作用:告诉编译器,已经使用了该变量,不必检测警告! 在VC编译器下,如果您用最高级别进行编译,编译器就会很苛刻地指出您的非常细小的警告.当你生命了一 ...

  7. 6.7考试总结(NOIP模拟5)

    前言 昨天说好不考试来着,昨晚就晚睡颓了一会,今天遭报应了,也没好好考,考得挺烂的就不多说了. T1 string 解题思路 比赛上第一想法就是打一发sort,直接暴力,然后完美TLE40pts,这一 ...

  8. Java程序安装失败

      检查文件路径,应该不含中文汉字,空格以及特殊字符.应将jdk的安装目录设置为纯英文路径. 是否有多个安装程序同时运行,若多点安装程序则会安装失败,打开任务管理器,查看是否有多个安装程序运行 注册表 ...

  9. Kubernetes ConfigMap详解,多种方式创建、多种方式使用

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 简介 配置是程序绕不开的话题,在Kubernetes中使用ConfigMap来配置,它本质其实就是键值对.本文讲解如何 ...

  10. 仅使用JsonUtility && File类实现Json数据读写

    using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using S ...