pytest框架的封装以及用例管理框架

pytest框架的封装以及用例管理框架

  • 公共类
  • 统一封装
    • requests_util02.py
    • test_api01.py
  • 自动化测试的基础
    • 自动化测试的介入点
    • 自动化测试和手工测试占比
    • 自动化实施过程
  • pytest元素定位
    • 元素定位查找
    • 元素定位的方式
      • 通过 ID 定位
      • 通过 Name 定位
      • 通过 Class Name 定位
      • 通过 Tag Name 定位
      • 通过 XPath 定位
      • 通过 CSS Selector 定位
      • 通过 Link Text 定位(用于定位链接)
      • 通过 Link Text 定位(用于定位链接)
      • 案例分析

公共类

在这里插入图片描述

import requests
class RequestsUtil02:
    # 创建一个 requests 库的会话
    sess = requests.session()

    # 定义一个发送所有请求的函数
    def send_all_request(self, **kwargs):
        # 使用会话对象发送请求
        res = self.sess.request(**kwargs)
        # 返回响应对象
        return res

在这里插入图片描述

统一封装

requests_util02.py

import requests


class RequestsUtil02:
    # 创建一个 requests 库的会话
    sess = requests.session()

    # 定义一个发送所有请求的函数
    def send_all_request(self, **kwargs):
        # 使用会话对象发送请求
        res = self.sess.request(**kwargs)
        print(res.json())
        # 返回响应对象
        return res

    def send_all_reuqest(self, method, url, params):
        pass

test_api01.py

import jsonpath
import requests
from common_02.requests_util02 import RequestsUtil02


class TestApi:
    #创建一个类变量
    access_token=" "
    #获取鉴权码的接口
    def test_get_token(self):
        urls = "https://api.weixin.qq.com/cgi-bin/token"
        datas = {
            "grant_type": "client_credential",
            "appid": "wx8a9de038e93f77ab",
            "secret": "8326fc915928dee3165720c910effb86"
        }
        res=RequestsUtil02().send_all_reuqest(method="get",url=urls, params=datas)
        # print(res.json())
        # res = requests.get(url=urls, params=datas)
        # 从响应结果中解析出 JSON 数据,并使用 jsonpath 提取出 access_token 的值
        # jsonpath.jsonpath() 返回一个列表,包含所有匹配到的结果,这里假设 access_token 只有一个
        # lis=jsonpath.jsonpath(res.json(), "$.access_token")
        # TestApi.access_token=res.json()["access_token"]
        # print(TestApi.access_token)
        # 打印提取到的 access_token 的值,lis[0] 是因为 jsonpath 返回的是一个列表,我们需要取第一个元素
        # print(lis[0])


    #获取测试查询的接口
    def test_select_flag(self):
        urls= "https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info"
        datas= {
            "access_token": TestApi.access_token
        }
        res= RequestsUtil02().send_all_reuqest(method="get",url=urls, params=datas)
        # print(res.json())
    #编辑便签的接口
    def test_edit_flag(self):
        urls="https://api.weixin.qq.com/cgi-bin/menu/create"
        datas1={
            "access_token": TestApi.access_token
        }
        data2={
            "button":[
                {
                    "type":"click",
                    "name":"今日歌曲",
                    "key":"V1001_TODAY_MUSIC"
                },
                {
                    "name":"菜单",
                    "sub_button":[
                        {
                            "type":"view",
                            "name":"搜索",
                            "url":"http://www.soso.com/"
                        },
                        {
                            "type":"view",
                            "name":"视频",
                            "url":"http://v.qq.com/"
                        },
                        {
                            "type":"click",
                            "name":"赞一下我们",
                            "key":"V1001_GOOD"
                        }
                    ]
                }
            ]
        }
        res=RequestsUtil02().send_all_reuqest(method="post",url=urls,json=data2,params=datas1)
        # print(res.json())


if __name__ == '__main__':
    TestApi().test_get_token()
    TestApi().test_select_flag()
    TestApi().test_edit_flag()

自动化测试的基础

自动化测试的介入点

到项目的中后期和维护期,自动化适合介入
三期:8个月
第一期:3个月
第二期:2.5个月
自动化迭代半个月-一个月

自动化测试和手工测试占比

  • 小型项目:

在小型项目中,自动化测试的比例可能较低,大约占总测试工作量的 10% 到 30% 左右。这是因为在小型项目中,通常会有较少的功能和交互,因此自动化测试的需求相对较少。手工测试通常会占据较大的比例,用于验证基本功能和交互是否正常。

  • 中型项目:

在中型项目中,自动化测试的比例可能会增加,大约占总测试工作量的 30% 到 50%。这是因为中型项目通常会涉及到更多的功能和交互,手工测试会变得更加耗时和繁琐。因此,团队会倾向于增加自动化测试的覆盖范围,以提高测试效率和稳定性。

  • 大型项目:

在大型项目中,自动化测试的比例通常会进一步增加,占总测试工作量的 50% 到 80% 或更多。这是因为大型项目通常会涉及到复杂的功能和交互,手工测试可能无法满足测试需求。因此,团队会投入更多的资源和精力来建立和维护自动化测试框架,并加强自动化测试的覆盖范围。

自动化实施过程

1.可行性分析
2.框架选择(selenium,RF)
3.需求分析
4.制定计划
5.测试用例的设计(从功能测试收取)
6.环境搭建
7.版本控制
8.脚本维护

pytest元素定位

元素定位查找

1.元素是否加载完成
2.页面是否存在frame或者iframe
3.元素是否不可用或者不可读,不可见
是否是动态的元素,动态的DIV层,字定义组件
前提:元素唯一

元素定位的方式

通过 ID 定位

element = driver.find_element(By.ID, 'element_id')

通过 Name 定位

element = driver.find_element(By.NAME, 'element_name')

通过 Class Name 定位

element = driver.find_element(By.CLASS_NAME, 'element_class')

通过 Tag Name 定位

element = driver.find_element(By.TAG_NAME, 'element_tag')

通过 XPath 定位

element = driver.find_element(By.XPATH, '//div[@class="example"]')

通过 CSS Selector 定位

element = driver.find_element(By.CSS_SELECTOR, 'div.example')

通过 Link Text 定位(用于定位链接)

element = driver.find_element(By.LINK_TEXT, 'Link Text')

通过 Link Text 定位(用于定位链接)

element = driver.find_element(By.PARTIAL_LINK_TEXT, 'Partial Link Text')

案例分析

from selenium import webdriver
from selenium.webdriver.common.by import By

# 启动浏览器
driver = webdriver.Chrome()

# 打开商城网站
driver.get('http://example.com')

# 定位搜索框,并输入关键字
search_box = driver.find_element(By.ID, 'search-box')
search_box.send_keys('手机')

# 定位搜索按钮,并点击
search_button = driver.find_element(By.ID, 'search-button')
search_button.click()

# 定位搜索结果中的第一个商品,并点击进入商品详情页面
first_product = driver.find_element(By.CLASS_NAME, 'product-item')
first_product.click()

# 在商品详情页面,定位加入购物车按钮,并点击
add_to_cart_button = driver.find_element(By.XPATH, '//button[contains(text(), "Add to Cart")]')
add_to_cart_button.click()

# 定位购物车图标,并点击进入购物车页面
cart_icon = driver.find_element(By.CLASS_NAME, 'cart-icon')
cart_icon.click()

# 关闭浏览器
driver.quit()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构面试常见问题之串的模式匹配(KMP算法)系列-简单解决方案

😀前言 字符串匹配是计算机科学中一个常见的问题,指的是在一个长字符串中查找一个短字符串的出现位置。在文本编辑、生物信息学、数据挖掘等领域都有着广泛的应用。 本文将介绍 KMP 算法,一种用于解决字符串匹配问题的经典算法。KMP 算法可以…

鸿蒙网络开发学习:【ylong_http】

简介 ylong_http 构建了完整的 HTTP 能力,支持用户使用 HTTP 能力完成通信场景的需求。 ylong_http 使用 Rust 编写,为 OpenHarmony 的 Rust 能力构筑提供支持。 ylong_http 在 OpenHarmony 中的位置 ylong_http 向 OpenHarmony 系统服务层中的网络协…

flutter实现视频播放器,可根据指定视频地址播放、设置声音,进度条拖动,下载等

需要装依赖&#xff1a; gallery_saver: ^2.3.2video_player: ^2.8.3 AndroidManifest.xml <uses-permission android:name"android.permission.INTERNET"/> 实现代码 import dart:async; import dart:io;import package:flutter/material.dart; import pa…

深入理解栈和队列(二):队列

个人主页&#xff1a;17_Kevin-CSDN博客 专栏&#xff1a;《数据结构》 一、队列的概念和结构 队列是只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(First In First Out) 入队列&#xff1a;进行插入操作的…

OC对象 - 关联对象(如何给分类添加成员变量)

文章目录 OC对象 - 关联对象&#xff08;如何给分类添加成员变量&#xff09;1. 基本使用1.1 提供的API1.1.1 添加关联对象1.1.2 获得关联对象1.1.3 移除所有关联对象1.1.3 修饰符 1.2 使用方法1.2 Key的常见用法1.2.1 使用的get方法的selecor作为key1.2.2 使用指针的地址作为k…

【Node.js】zlib

gzip 和 deflate 的基本使用 const zlib require("zlib"); const fs require(fs)// 压缩 1. createGzip .gz 2. createDeflate .deflate // const readStream fs.createReadStream(index.txt) // const writeStream fs.createWriteStream(index.txt.gz) // rea…

Python Flask 自定义404错误

from flask import Flask, abort, make_response, request, render_templateapp Flask(__name__)# 重定向到百度 app.route(/index, methods["GET", "POST"]) def index():if request.method "GET":return render_template("index.html&q…

Python Flask 自定义过滤器

{{ data.list | li2 }} li2就是自定义的 from flask import Flask, render_templateapp Flask(__name__)app.route("/index") def index():data {name: "张三","age": 18,list: [123123, 41, 123]}return render_template("index2.html…

nodejs+vue高校二手商品交易平台的设计与实现python-flask-django-php

当今社会已经步入了科学技术进步和经济社会快速发展的新时期&#xff0c;国际信息和学术交流也不断加强&#xff0c;计算机技术对经济社会发展和人民生活改善的影响也日益突出&#xff0c;人类的生存和思考方式也产生了变化。传统高校二手商品交易采取了人工的管理方法&#xf…

BUG未解之谜01-指针引用之谜

在leetcode里面刷题出现的问题&#xff0c;当我在sortedArrayToBST里面给root赋予初始值NULL之后&#xff0c;问题得到解决&#xff01; 理论上root是未初始化的变量&#xff0c;然后我进入insert函数之后&#xff0c;root引用的内容也是未知值&#xff0c;因此无法给原来的二叉…

array go 语言的数组 /切片

内存地址通过& package mainimport "fmt"func main() {var arr [2][3]int16fmt.Println(arr)fmt.Printf("arr的地址是: %p \n", &arr)fmt.Printf("arr[0]的地址是 %p \n", &arr[0])fmt.Printf("arr[0][0]的地址是 %p \n"…

【Linux 09】进程优先级

文章目录 &#x1f308; Ⅰ 什么是优先级&#x1f308; Ⅱ 为什么存在优先级&#x1f308; Ⅲ 查看进程优先级&#x1f308; Ⅳ 修改进程优先级 &#x1f308; Ⅰ 什么是优先级 优先级本质 指定进程获取某种资源的先后顺序。在 Linux 中&#xff0c;使用 task_struct 进程控制…

电子电器架构 —— 诊断数据DTC具体故障

电子电器架构 —— 诊断数据DTC具体故障 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师 (Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再挣…

【CDA二级数据分析备考思维导图】

CDA二级数据分析备考思维导图 CDA二级复习备考资料共计七个章节&#xff0c;如需资料&#xff0c;请留言&#xff0c;概览如下图&#xff1a;一、数据采集与处理1.数据采集方法2.市场调研和数据录入3、数据探索与可视化4、数据预处理方法 总结&#xff1a;以上为自己学习数据分…

现代化应用部署工具-Docker

Docker 简介 什么是Docker Docker 是一个开源的应用容器引擎&#xff0c;可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上。 Docker部署的优势 通过使用Docker等容器技术&#xff0c;可以将应用程序及其依赖项…

R-Linux 免费ext2 / 3 / 4文件系统恢复软件简介(推荐)

R-Linux&#xff1a;只适合 3种类型的发行版使用。 R-Linux 免费ext2 / 3 / 4文件系统恢复软件简介&#xff08;推荐&#xff09; https://blog.csdn.net/allway2/article/details/102632495 R-Linux for Linux Technical Documentation https://www.r-studio.com/free-linux…

【docker常用命令】

1. 什么是docker Docker 是一种开源的容器化平台&#xff0c;用于开发、交付和运行应用程序。它允许开发人员将应用程序及其依赖项&#xff08;如库、环境变量、配置文件等&#xff09;打包到一个被称为容器的标准化单元中。这个容器包含了一切应用程序需要运行的所有内容&…

漫画之家”系统设计与实现|SpringBoot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;…

nodejs+vue高校工作室管理系统python-flask-django-php

系统根据现有的管理模块进行开发和扩展&#xff0c;采用面向对象的开发的思想和结构化的开发方法对高校工作室管理的现状进行系统调查。采用结构化的分析设计&#xff0c;该方法要求结合一定的图表&#xff0c;在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”的…

OpenCV4.9.0开源计算机视觉库核心功能(核心模块)

转到&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV 介绍使用 下一篇&#xff1a;如何使用OpenCV扫描图像、查找表和时间测量 ​ OpenCV核心功能主要有以下各个&#xff1a;本文将开始介绍下列内容&#xff1a; Mat - 基…