APP自动化测试,Appium+PO模式+Pytest框架实战—项目案例

news2024/11/17 9:55:38

目录:导读

    • 前言
    • 一、Python编程入门到精通
    • 二、接口自动化项目实战
    • 三、Web自动化项目实战
    • 四、App自动化项目实战
    • 五、一线大厂简历
    • 六、测试开发DevOps体系
    • 七、常用自动化测试工具
    • 八、JMeter性能测试
    • 九、总结(尾部小惊喜)


前言

PO模式:Page Object,PO模式是自动化测试项目开发实践的最佳设计模式之一。
核心思想:通过对界面元素的封装减少冗余代码,同时在后期维护中,若元素位置发生变化,只需要调整页面封装的代码,提高测试用例的可维护性、可读性。

优点:
减少了冗余代码;
业务代码和测试代码被分开,降低耦合性;
维护成本低;

缺点:
结构复杂:基于流程做了模块化的拆分

例子:自动发送短信

方法:Appium+PO模式+Pytest框架数据参数化
base模块:前置代码和基本操作,base_driver.py对应打开driver,base_action.py对应元素定位、点击按钮和输入。

page模块:对应操作页面,考虑手指测试的过程需要用到多少个页面,就在page模块中创建多少个文件。page.py统一入口,有多少个页面,就写多少个函数,并创建对应的对象。

scripts模块:测试脚本。
pytest.ini:配置文件。

base_action.py:

from selenium.webdriver.support.wait import WebDriverWait
 
 
class BaseAction:
 
    def __init__(self, driver):
        self.driver = driver
 
    def find_element(self, location, timeout=10, poll=1):
        """
        :param location: 元素位置
        :param timeout: 设置10秒
        :param poll: 多少秒找一次
        :return:
        """
        location_by, location_value = location
        wait = WebDriverWait(self.driver, timeout, poll)
        return wait.until(lambda x: x.find_element(location_by, location_value))
 
    def find_elements(self, location, timeout=10, poll=1):
        location_by, location_value = location
        wait = WebDriverWait(self.driver, timeout, poll)
        return wait.until(lambda x: x.find_elements(location_by, location_value))
 
    def click(self, location):
        self.find_element(location).click()
 
    def input(self, location, text):
        self.find_element(location).send_keys(text)

base_driver.py:

from appium import webdriver
 
 
def init_driver():
    desired_caps = dict()
    # 设备信息
    desired_caps["platformName"] = "Android"
    desired_caps["platformVersion"] = "5.1"
    desired_caps["deviceName"] = "192.168.56.101:5555"
    # app信息
    desired_caps["appPackage"] = "com.android.mms"
    desired_caps["appActivity"] = ".ui.ConversationList"
 
    return webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps)

message_list_page.py:

from selenium.webdriver.common.by import By
 
from base.base_action import BaseAction
 
 
class MessageListPage(BaseAction):
    # 新建短信按钮
    new_message_button = By.ID, "com.android.mms:id/action_compose_new"
 
    def click_new_message(self):
        self.click(self.new_message_button)

new_message_page.py:

from selenium.webdriver.common.by import By
 
from base.base_action import BaseAction
 
 
class NewMessagePage(BaseAction):
    # 接受者特征
    recipients_edit_text = By.ID, "com.android.mms:id/recipients_editor"
    # 内容特征
    content_edit_text = By.ID, "com.android.mms:id/embedded_text_editor"
    # 发送按钮
    send_button = By.XPATH, "//*[@content-desc='发送']"
 
    def input_recipients(self, text):
        self.input(self.recipients_edit_text, text)
 
    def input_content(self, text):
        self.input(self.content_edit_text, text)
 
    def click_send(self):
        self.click(self.send_button)

page.py:

from page.message_list_page import MessageListPage
from page.new_message_page import NewMessagePage
 
 
class Page:
 
    def __init__(self, driver):
        self.driver = driver
 
    @property
    def message_list(self):
        return MessageListPage(self.driver)
 
    @property
    def new_message(self):
        return NewMessagePage(self.driver)

test_message.py:

import time
import pytest
from base.base_driver import init_driver
from page.page import Page
 
 
class TestMessage:
 
    def setup(self):
        self.driver = init_driver()
        self.page = Page(self.driver)
 
    def teardown(self):
        time.sleep(3)
        self.driver.quit()
 
    @pytest.mark.parametrize(('phone', 'content'), [('18588888888', "HELLO"),('18577778888', "您好!")])
    def test_send_message(self, phone, content):
        # 主页-点击短信,新建短信
        self.page.message_list.click_new_message()
        # 新建短信-输入 接收人
        self.page.new_message.input_recipients(phone)
        # 新建短信-输入 内容
        self.page.new_message.input_content(content)
        # 新建短信-点击发送
        self.page.new_message.click_send()
 
 
if __name__ == '__main__':
    pytest.main([])

pytest.ini:

[pytest]
# 添加命令行参数
addopts = -vs --html=report/report.html --reruns 0
# 文件搜索路径
testpaths = ./scripts
# 文件名称
python_files = test_*.py
# 类名称
python_classes = Test*
# 方法名称
python_functions = test_*
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图

一、Python编程入门到精通

请添加图片描述

二、接口自动化项目实战

请添加图片描述

三、Web自动化项目实战

请添加图片描述

四、App自动化项目实战

请添加图片描述

五、一线大厂简历

请添加图片描述

六、测试开发DevOps体系

请添加图片描述

七、常用自动化测试工具

请添加图片描述

八、JMeter性能测试

请添加图片描述

九、总结(尾部小惊喜)

只要你愿意努力奋斗,不放弃追求自己的梦想,就一定能够取得成功。即使道路坎坷,也不要气馁,因为这正是成长和进步的机会。相信自己,勇往直前,你将创造出属于自己的辉煌!

只有不断努力拼搏,才能超越自我突破极限。每一步踏实前行,都离成功更近一步。坚持不懈追求梦想,付出总有回报。无论遇到多少挫折,也请永远保持勇敢和坚定的信念!

只有拼尽全力,才不会留下遗憾;只有超越自己,才能实现突破;只有坚持不懈,才能取得成功。无论面对什么挑战,都要勇敢向前,永不放弃,相信你一定可以成就自己的辉煌!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/634463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何解决GEE导出影像的Nodata值在ArcGIS中无法正常显示?

目录 01 ArcGIS对于GEE掩膜影像的Nodata值的说明 02 处理方法 2.1 方法1-GEE修改掩膜值 Arguments: Returns: Image 2.2 方法2-ArcGIS重新赋值Nodata(推荐) 01 ArcGIS对于GEE掩膜影像的Nodata值的说明 当在GEE中进行掩膜后,将影像在Ar…

打造极简风格动效 —— 5 分钟轻松实现惊艳、震撼人心的视觉效果

前期回顾 是不是在为 API 烦恼 ?好用免费的api接口大全呼之欲出_免流接口api_彩色之外的博客-CSDN博客APi、常用框架、UI、文档—— 整理合并https://blog.csdn.net/m0_57904695/article/details/130459417?spm1001.2014.3001.5501 👍 本文专栏&…

20道嵌入式经典面试题(附答案)

1.嵌入式系统中经常要用到无限循环,如何用C编写死循环 答:while(1){} 或者 for(;;) 2.程序的局部变量存在于哪里,全局变量存在于哪里,动态申请数据存在于哪里。 答:程序的局部变量存在于栈区;全局变量存在…

【Linux】浅谈文件原理与操作

目录 问题引入 浅谈文件原理 文件操作 文件的打开与关闭 open close write与read 再谈C库文件操作 问题引入 🌸以前我们学过C语言的文件操作,而不同语言的文件操作都是不一样的,我们该如何理解这一现象,能不能用一种统一…

有关 string 类的练习(下)

目录 一、反转字符串 II 二、反转字符串中的单词 III 三、找出字符串中第一个只出现一次的字符 四、字符串相乘 五、把字符串转换成整数 一、反转字符串 II 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转…

Spring,注解开发

Spring是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架 1、组成 spring七大模块详解 2、IOC理论推导 传统的开发 (pojo层、DAO层和业务层) (1)UserDao (2) UserDaoImpl (3)…

天狼星-大熊座 Ursa Major SIRIUS

大熊座 Ursa Major SIRIUS 键盘说明 客制化键盘: 大熊座 Ursa Major SIRIUS 配列: 75 键帽:KCA-HelloWorld-Black 双模: 蓝牙-分裂方案 驱动配置:Link Lab 驱动设置软件 键盘操作 键盘说明参考:键位配…

利用WinDbg查看堆栈中方法入参的值4(C#)

由于作者水平有限,如有写得不对的地方,请指正。 使用WinDbg的过程中,坑特别的多,对版本要求比较严格,如: 1 32位应用程序导出的Dump文件要用32位的WinDbg打开,想要没有那么多的问题&#xf…

海底光缆位置探测技术的应用概述

1. 概述 海底光缆运行在地质环境复杂的海洋环境中,地震、海床塌陷、滑坡、洋流变化、海洋生物及船只抛锚都有可能造成光缆断裂、破损,影响光缆的安全运行。海底光缆一旦遭受损坏,其造成的经济损失无法估量。因此在海洋开发工程实施前&#xf…

Web转化为APP——YonBIP(APICloud迁移版)

目录 平台注册 平台使用 设计封面(端设置) APP证书 代码上传 移动打包 运营管理和移动插件 众所周知,APP开发是一件非常麻烦的事,很多擅长Web开发的人未必擅长APP开发。那么作为一个Web开发者,可不可以有很方便…

基于prefix tuning + Bert的标题党分类器

文章目录 背景一、Prefix-Tuning介绍二、分类三、效果四、参阅 背景 近期, CSDN博客推荐流的标题党博客又多了起来, 先前的基于TextCNN版本的分类模型在语义理解上能力有限, 于是, 便使用的更大的模型来优化, 最终准确率达到了93.7%, 还不错吧. 一、Prefix-Tuning介绍 传统的…

Redis之Redisson原理详解

文章目录 1 Redisson1.1 简介1.2 与其他客户端比较1.3 操作使用1.3.1 pom.xml1.3.2 配置1.3.3 启用分布式锁 1.4 大致操作原理1.5 RLock1.5.1 RLock如何加锁1.5.2 解锁消息1.5.3 锁续约1.5.4 流程概括 1.6 公平锁1.6.1 java中公平锁1.6.2 RedissonFairLock1.6.3 公平锁加锁步骤…

50 Projects 50 Days - Form Input Wave 学习记录

项目地址 Form Input Wave 展示效果 Form Input Wave 实现思路 简单的登陆界面结构,只是在输入框聚焦时标题提示文字会有一个字母逐渐向上跳动的动画效果,这需要针对每个字符单独设置变换的延时,可以考虑在JavaScript中处理这部分逻辑&am…

2017~2018学年《信息安全》考试试题(A1卷)

北京信息科技大学 2017 ~2018 学年第二学期《信息安全》考试试题 (A 卷) 课程所在学院:计算机学院 适用专业班级:计科 1504-6、重修 考试形式:闭卷 一、单选题(本题满分 20 分,共含 10 道小题,每小题 2 分) 网络安全是指网络系统的硬件、软件及( C )的…

【头歌-Python】Python第九章作业(初级)第5关

第5关:绘制程序设计语言饼图 任务描述 列表labels和sizes中的数据分别是目前主流程序设计语言及其热度数据(百分比),请根据这些数据绘制饼图,并将Python程序设计语言所在区域突出0.1显示。 labels [C语言, Python…

Java ~ Reference ~ ReferenceQueue【总结】

前言 文章 相关系列:《Java ~ Reference【目录】》(持续更新)相关系列:《Java ~ Reference ~ ReferenceQueue【源码】》(学习过程/多有漏误/仅作参考/不再更新)相关系列:《Java ~ Reference ~ …

一篇就能学懂的散列表,让哈希表数据结构大放光彩

目录 1.散列表的基本概念 2.散列表的查找 3.散列函数的构造方法 1.直接定址法 2.除留余数法 4.散列表解决冲突的方法 1.开放定址法 2.链地址法 1.散列表的基本概念 基本思想:记录的存储位置与关键字之间存在的对应关系 对应关系——hash函数 Loc(i) H(k…

关于外包被开要怎么维护自己的权益

我一直以为外包被开都是没有任何赔偿的,之前网上对于外包的消息都是说,没有任何赔偿或者是怕麻烦然后就干脆放弃了的各种评论。。。但是最近我在问到一个朋友的时候,他很好的维护了自己的权益。最后获得了N1 保留证据 当被告知外包需要你离场…

牛客网语法篇刷题(C语言) — 运算

作者主页:paper jie的博客_CSDN博客-C语言,算法详解领域博主 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《C语言-语法篇》专栏,本专栏是针对于大学生,编程小白…

单链表OJ题:LeetCode--138.复制带随即指针的链表

朋友们、伙计们,我们又见面了,本期来给大家解读一下LeetCode中第138道单链表OJ题,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! 数据结构与算法专栏:数据结构与算法 个 人…