史上最强,Python3+Selenium3+PO+Yaml+DDT自动化测试框架...

news2025/6/8 22:46:34

目录:导读

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


前言

框架采用python3 + selenium3 + PO + yaml + ddt + unittest等技术编写成基础测试框架,能适应日常测试工作需要。

1)使用Page Object模式将页面定位和业务操作分开,分离测试对象(元素对象)和测试脚本(用例脚本),一个页面建一个对象类,提高用例的可维护性;

2)使用yaml管理页面控件元素数据和测试用例数据。
例如元素ID等发生变化时,不需要去修改测试代码,只需要在对应的页面元素yaml文件中修改即可;

3)分模块管理,互不影响,随时组装,即拿即用。

1、测试框架分层设计

请添加图片描述

把常见的操作和查找封装成基础类,不管是什么产品,可直接拿来复用;
业务层主要是封装对象页面类,一个页面建一个类,业务层页面继承基础层;
用例层针对产品页面功能进行构造摸拟执行测试;
框架层提供基础组件,支撑整个流程执行及功能扩展,给用例层提供各页面的元素数据、用例测试数据,测试报告输出等;

2、测试框架目录结构

请添加图片描述

请添加图片描述

3、编写用例方法

testinfo:
  - id: test_login001
    title: 登录测试
    info: 打开抽屉首页
testcase:
  - element_info: login-link-a
    find_type: ID
    operate_type: click
    info: 打开登录对话框
  - element_info: mobile
    find_type: ID
    operate_type: send_keys
    info: 输入手机号
  - element_info: mbpwd
    find_type: ID
    operate_type: send_keys
    info: 输入密码
  - element_info: //input[@class='keeplogin']
    find_type: XPATH
    operate_type: click
    info: 单击取消自动登录单选框
  - element_info: //span[text()='登录']
    find_type: XPATH
    operate_type: click
    info: 单击登录按钮
  - element_info: userProNick
    find_type: ID
    operate_type: perform
    info: 鼠标悬停账户菜单
  - element_info: //a[@class='logout']
    find_type: XPATH
    operate_type: click
    info: 选择退出
check:
  - element_info: //div[@class='box-mobilelogin']/div[1]/span
    find_type: XPATH
    info: 检查输入手机号或密码,登录异常提示
  - element_info: userProNick
    find_type: ID
    info: 成功登录
  - element_info: reg-link-a
    find_type: ID
    info: 检查退出登录是否成功

例如,我们要新增登录功能测试用例:

首先,只需在testyaml目录下新增一个页面对象yaml文件,参考login.yaml格式编写即可。这些文件是提供给封装页面对象类调用并执行定位识别操作。

- id: test_login001.1
  detail: 手机号和密码为空登录
  screenshot: phone_pawd_empty
  data:
    phone: ""
    password: ""
  check:
    - 手机号不能为空
- id: test_login001.2
  detail: 手机号为空登录
  screenshot: phone_empty
  data:
    phone: ""
    password: aa
  check:
    - 手机号不能为空
- id: test_login001.3
  detail: 密码为空登录
  screenshot: pawd_empty
  data:
    phone: 13511112222
    password: ""
  check:
    - 密码不能为空
- id: test_login001.4
  detail: 非法手机号登录
  screenshot: phone_error
  data:
    phone: abc
    password: aa
  check:
    - 手机号格式不对
- id: test_login001.5
  detail: 手机号或密码不匹配
  screenshot: pawd_error
  data:
    phone: 13511112222
    password: aa
  check:
    - 账号密码错误
- id: test_login001.6
  detail: 手机号和密码正确
  screenshot: phone_pawd_success
  data:
    phone: 13865439800
    password: ********
  check:
    - yingoja

其次,在testdata目录下新增一个login_data.yaml文件提供给登录接口传参的测试数据,编写格式参考login_data.yaml文件。

#!/usr/bin/env python
# _*_ coding:utf-8 _*_


import os, sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
from config import setting
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from public.page_obj.base import Page
from time import sleep
from public.models.GetYaml import getyaml

testData = getyaml(setting.TEST_Element_YAML + '/' + 'login.yaml')

class login(Page):
    """
    用户登录页面
    """
    url = '/'
    dig_login_button_loc = (By.ID, testData.get_elementinfo(0))

    def dig_login(self):
        """
        首页登录
        :return:
        """
        self.find_element(*self.dig_login_button_loc).click()
        sleep(1)

    # 定位器,通过元素属性定位元素对象
    # 手机号输入框
    login_phone_loc = (By.ID, testData.get_elementinfo(1))
    # 密码输入框
    login_password_loc = (By.ID, testData.get_elementinfo(2))
    # 取消自动登录
    keeplogin_button_loc = (By.XPATH, testData.get_elementinfo(3))
    # 单击登录
    login_user_loc = (By.XPATH, testData.get_elementinfo(4))
    # 退出登录
    login_exit_loc = (By.ID, testData.get_elementinfo(5))
    # 选择退出
    login_exit_button_loc = (By.XPATH, testData.get_elementinfo(6))

    def login_phone(self, phone):
        """
        登录手机号
        :param username:
        :return:
        """
        self.find_element(*self.login_phone_loc).send_keys(phone)

    def login_password(self, password):
        """
        登录密码
        :param password:
        :return:
        """
        self.find_element(*self.login_password_loc).send_keys(password)

    def keeplogin(self):
        """
        取消单选自动登录
        :return:
        """
        self.find_element(*self.keeplogin_button_loc).click()

    def login_button(self):
        """
        登录按钮
        :return:
        """
        self.find_element(*self.login_user_loc).click()

    def login_exit(self):
        """
        退出系统
        :return:
        """
        above = self.find_element(*self.login_exit_loc)
        ActionChains(self.driver).move_to_element(above).perform()
        sleep(2)
        self.find_element(*self.login_exit_button_loc).click()

    def user_login(self, phone, password):
        """
        登录入口
        :param username: 用户名
        :param password: 密码
        :return:
        """
        self.open()
        self.dig_login()
        self.login_phone(phone)
        self.login_password(password)
        sleep(1)
        self.keeplogin()
        sleep(1)
        self.login_button()
        sleep(1)

    phone_pawd_error_hint_loc = (By.XPATH, testData.get_CheckElementinfo(0))
    user_login_success_loc = (By.ID, testData.get_CheckElementinfo(1))
    exit_login_success_loc = (By.ID, testData.get_CheckElementinfo(2))

    # 手机号或密码错误提示
    def phone_pawd_error_hint(self):
        return self.find_element(*self.phone_pawd_error_hint_loc).text

    # 登录成功用户名
    def user_login_success_hint(self):
        return self.find_element(*self.user_login_success_loc).text

    # 退出登录
    def exit_login_success_hint(self):
        return self.find_element(*self.exit_login_success_loc).text

然后,在page_obj目录下新增一个loginPage.py文件,是用来封装登录页面对象类,执行登录测试流程操作。

#!/usr/bin/env python
# _*_ coding:utf-8 _*_


import os, sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
import unittest, ddt, yaml
from config import setting
from public.models import myunit, screenshot
from public.page_obj.loginPage import login
from public.models.log import Log

try:
    f = open(setting.TEST_DATA_YAML + '/' + 'login_data.yaml', encoding='utf-8')
    testData = yaml.load(f)
except FileNotFoundError as file:
    log = Log()
    log.error("文件不存在:{0}".format(file))

@ddt.ddt
class Demo_UI(myunit.MyTest):
    """抽屉新热榜登录测试"""
    def user_login_verify(self, phone, password):
        """
        用户登录
        :param phone: 手机号
        :param password: 密码
        :return:
        """
        login(self.driver).user_login(phone, password)

    def exit_login_check(self):
        """
        退出登录
        :return:
        """
        login(self.driver).login_exit()

    @ddt.data(*testData)
    def test_login(self, datayaml):
        """
        登录测试
        :param datayaml: 加载login_data登录测试数据
        :return:
        """
        log = Log()
        log.info("当前执行测试用例ID-> {0} ; 测试点-> {1}".format(datayaml['id'], datayaml['detail']))
        # 调用登录方法
        self.user_login_verify(datayaml['data']['phone'], datayaml['data']['password'])
        po = login(self.driver)
        if datayaml['screenshot'] == 'phone_pawd_success':
            log.info("检查点-> {0}".format(po.user_login_success_hint()))
            self.assertEqual(po.user_login_success_hint(), datayaml['check'][0], "成功登录,返回实际结果是->: {0}".format(po.user_login_success_hint()))
            log.info("成功登录,返回实际结果是->: {0}".format(po.user_login_success_hint()))
            screenshot.insert_img(self.driver, datayaml['screenshot'] + '.jpg')
            log.info("-----> 开始执行退出流程操作")
            self.exit_login_check()
            po_exit = login(self.driver)
            log.info("检查点-> 找到{0}元素,表示退出成功!".format(po_exit.exit_login_success_hint()))
            self.assertEqual(po_exit.exit_login_success_hint(), '注册', "退出登录,返回实际结果是->: {0}".format(po_exit.exit_login_success_hint()))
            log.info("退出登录,返回实际结果是->: {0}".format(po_exit.exit_login_success_hint()))
        else:
            log.info("检查点-> {0}".format(po.phone_pawd_error_hint()))
            self.assertEqual(po.phone_pawd_error_hint(), datayaml['check'][0], "异常登录,返回实际结果是->: {0}".format(po.phone_pawd_error_hint()))
            log.info("异常登录,返回实际结果是->: {0}".format(po.phone_pawd_error_hint()))
            screenshot.insert_img(self.driver, datayaml['screenshot'] + '.jpg')

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

最后,在testcase目录下创建测试用例文件login_sta.py,采用ddt数据驱动读取yaml测试数据文件

综上所述,编写用例方法只需要按以上四个步骤创建->编写即可。
执行如下主程序,可看输出的实际结果。

#!/usr/bin/env python
# _*_ coding:utf-8 _*_


import os,sys
sys.path.append(os.path.dirname(__file__))
from config import setting
import unittest,time
from package.HTMLTestRunner import HTMLTestRunner
from public.models.newReport import new_report
from public.models.sendmail import send_mail

# 测试报告存放文件夹,如不存在,则自动创建一个report目录
if not os.path.exists(setting.TEST_REPORT):os.makedirs(setting.TEST_REPORT + '/' + "screenshot")

def add_case(test_path=setting.TEST_DIR):
    """加载所有的测试用例"""
    discover = unittest.defaultTestLoader.discover(test_path, pattern='*_sta.py')
    return discover

def run_case(all_case,result_path=setting.TEST_REPORT):
    """执行所有的测试用例"""
    now = time.strftime("%Y-%m-%d %H_%M_%S")
    filename =  result_path + '/' + now + 'result.html'
    fp = open(filename,'wb')
    runner = HTMLTestRunner(stream=fp,title='抽屉新热榜UI自动化测试报告',
                            description='环境:windows 7 浏览器:chrome',
                            tester='Jason')
    runner.run(all_case)
    fp.close()
    report = new_report(setting.TEST_REPORT) #调用模块生成最新的报告
    send_mail(report) #调用发送邮件模块

if __name__ =="__main__":
    cases = add_case()
    run_case(cases)
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图

一、Python编程入门到精通

请添加图片描述

二、接口自动化项目实战

请添加图片描述

三、Web自动化项目实战

请添加图片描述

四、App自动化项目实战

请添加图片描述

五、一线大厂简历

请添加图片描述

六、测试开发DevOps体系

请添加图片描述

七、常用自动化测试工具

请添加图片描述

八、JMeter性能测试

请添加图片描述

九、总结(尾部小惊喜)

不要害怕失败,因为每一次的努力都是成功的前奏,只有坚持不懈,才能迎接未来的辉煌。相信自己,勇往直前,你将收获无限可能!

在追逐梦想的路上,不要畏惧磨难与困境,因为每一次挑战都是成长的机遇。坚持奋斗,超越极限,你将创造属于自己的辉煌人生!

无论遇到多少艰辛与挫折,都要保持信念与勇气,用汗水浇灌梦想的花朵。相信自己的力量,坚持不懈,你将成为无人能及的奋斗者,创造属于自己的辉煌!

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

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

相关文章

多领域SCI/EI快刊,1个月录用,12天见刊,1个月检索!

一、材料科学类SCI 【期刊概况】IF:3.0-4.0, JCR3区,中科院4区; 【大类学科】材料科学; 【检索情况】SCI在检; 【录用周期】2-3个月左右录用; 【接收领域】低温环境下新型生物降解材料的开发相关研究均可&#xf…

HarmonyOS4 vp单位计算

我们在harmonyOS中设置宽度等单位时 需要在后面写明具体是什么单位 width("100%")这里 我们就写明了是 百分之百 如果不写 直接给数值 width(100)那么 它就会按vp去读 这里就被读为 100vp vp 之前是一种移动端宽度概念 后面鸿蒙重定义了它的概念 计算公式是 px 乘…

雍禾医疗亮相博鳌论坛 雍禾植发让小城市也能治“毛”病

颜值经济时代,伴随着居民消费水平的提高与受脱发困扰群体的逐步扩张,人们对毛发健康与毛发美观的关注度日益增长。需求催生了毛发医疗行业的飞速发展,为脱发群体提供爱美、求美、变美的新思路、新契机。 近期,2023中国企业家博鳌…

免费在线游戏探索平台

免费在线游戏平台 免费在线游戏平台,上百款游戏随便玩 关于POKI 免费在线小游戏 Poki是个性化的免费在线游戏探索平台。我们每天都会为您精心挑选最新颖的游戏,保证您玩得尽兴!在这里,您不会感到无聊,因为我们将根据…

短期爆发or未来趋势?浅谈音视频小程序在教育行业的应用发展

疫情三年,极大改变了人类的生活方式,尤其是一些线下化程度占比很大的行业,被迫进行信息化甚至数字化的转型。 教育场景数字化逐步成为刚需 经历过了2018年以来的,国家对在线教育行业的监管收紧,以及受益于 5G 技术的发…

向日葵远程工具安装Mysql的安装与配置

目录 一、向日葵远程工具安装 1.1 简介 1.2 下载地址 二、Mysql 5.7 安装与配置 2.1 简介 2.2 安装 2.3 初始化mysql服务端 2.4 启动mysql服务 2.5 登录mysql 2.6 修改密码 2.7 设置外部访问 三、思维导图 一、向日葵远程工具安装 1.1 简介 向日葵远程控制是一款用…

Docker无法启动Postgresql容器

目录 问题描述解决问题 问题描述 拉取了一个Postgresql14.2的镜像,在docker run创建并运行容器之后使用docker ps发现容器没有跑起来,再次使用docker start也没跑起来。 docker run -d --name mypg -v psql-data:/var/lib/postgresql/data -e POSTGRES…

20、Finetuning

微调是指调整大型语言模型(LLM)的参数以适应特定任务的过程,用于改进预训练模型的性能。这是通过在与任务相关的数据集上训练模型来完成的。所需的微调量取决于任务的复杂性和数据集的大小。 PEFT(Parameter-Efficient Fine-Tunin…

2019数据结构----单链表真题

思路&#xff1a; (1)找到中间节点,将原链表一分为二 (2)后半段链表原地逆置 (3)合并链表 #include <stdio.h> #include <stdlib.h>//定义节点类型 typedef struct LNode {int data;//数据域struct LNode *next;//指针域 } LNode, *LinkList;void tailList(Link…

工业 4.0 和数字孪生

在线工具推荐&#xff1a;3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 介绍 没有回头路可走。制造过程正变得越来越数字化。随着这一趋势的发展&am…

LV逻辑卷

一、定义 LVM 是 Logical Volume Manager 的简称&#xff0c;译为中文就是逻辑卷管理。 分区缺点&#xff1a; 1. 无法动态扩容 2. 必须使用连续的空间 3. 没有备份 物理扩展&#xff08;PE&#xff09;&#xff1a; 是逻辑卷的最小单位 1. 物理卷 将硬盘 转化成 pe 2. 卷组 将…

No Magic—复杂机电产品系统架构开发套件

产品概述 CATIA Magic&#xff0c;原名MagicDraw&#xff0c;俗称No Magic&#xff0c;被达索收购后融入3DExperience产品协同研发管理平台中&#xff0c;形成更具协同体验的系统工程解决方案。该软件提供对SysML/UML/UAF语言的完整支持&#xff0c;提供独有的MagicGrid方法论&…

ubuntu远程桌面连接之novnc

一、前言 该操作是为了实现vnc桌面连接为url连接方式&#xff0c;且在浏览器中可以对ubuntu进行操作。在使用novnc进行操作前&#xff0c;需要先安装vnc才可。ubuntu下如何安装vnc&#xff0c;可看博主前面写的一篇文&#xff0c;ubuntu远程桌面连接之vnc-CSDN博客&#xff0c;…

pip install 安装模块包位置及设置Anaconda为默认版本python

01问题 pycharm运行代码找不到模块包pip install不知道安装到哪里了jupyter使用不同版本python 02产生原因 安装了多个版本pythonanaconda本身也带有python 03解决办法 (1)查看当前默认python版本 打开运行窗口Winr&#xff1b; 输入cmd回车&#xff1b; 输入python回车…

【LMM 008】Instruction Tuning with GPT-4

论文标题&#xff1a;Instruction Tuning with GPT-4 论文作者&#xff1a;Baolin Peng, Chunyuan Li, Pengcheng He, Michel Galley, Jianfeng Gao 作者单位&#xff1a;Microsoft Research 论文原文&#xff1a;https://arxiv.org/abs/2304.03277 论文出处&#xff1a;– 论文…

c语言:打印随机3球颜色小程序|练习题

一、题目 给出5种颜色&#xff0c;取出3种颜色进行组合&#xff0c;计算组合的个数。 如图&#xff1a; 二、思路分析 1、3层循环&#xff0c;每一层循环5次(有5个球) 2、排除掉三个球具有同种颜色的情况 三、代码截图【带注释】 四、源代码【带注释】 #include <stdio.h&…

2024年度 ROTS - 实时操作系统 Top 15

RTOS&#xff08;实时操作系统&#xff09;。 这里说的 RTOS 并非新星球大战电影中的机器人&#xff0c;而是物联网设备、航空系统、空中交通管制等背后的无声协调者&#xff0c;就在地球上。 RTOS&#xff0c;或称实时操作系统&#xff0c;设计它们是为了更好的管理资源&…

中小学班主任工作指南

作为中小学的班主任&#xff0c;我们的工作既繁重又重要。这份工作指南旨在为各位班主任提供一些实用的建议&#xff0c;帮助大家更好地完成教育教学任务&#xff0c;促进学生的全面发展。 一、了解学生是关键 首先&#xff0c;我们要深入了解每一个学生。了解他们的个性、兴趣…

客服智能管理系统是如何应用的

客服系统有很多种类&#xff0c;针对不同场景的客服使用的客服系统也不同&#xff0c;如有网店里的在线客服、实体店里的电话客服、网站上的在线客服、公共服务型的热线客服、售后服务客服等等。所谓客服智能管理系统就是一种可以把多个客服场景都管理起来的系统&#xff0c;提…

软件测试第一部分:基础知识总结

概念与定义 软件危机&#xff1a;软件危机是指落后的软件生产方式无法满足迅速增长的计算机软件需求&#xff0c;从而导致软件开发与维护过程中出现一系列严重问题的现象。 软件测试&#xff08;IEEE1983&#xff09;&#xff1a;软件测试是使用人工和自动手段来运行或测试某个…