利用人工智能ChatGPT自动生成基于PO的数据驱动测试框架

news2025/4/22 2:28:57

简介

PO(PageObject)设计模式将某个页面的所有元素对象定位和对元素对象的操作封装成一个 Page 类,并以页面为单位来写测试用例,实现页面对象和测试用例的分离。

数据驱动测试(DDT)是一种方法,其中在数据源的帮助下重复执行相同顺序的测试步骤,以便在验证步骤进行时驱动那些步骤的输入值和/或期望值。

无论是 PO 设计模式还是数据驱动测试,其实都是目前测试工程师在编写自动化测试框架中的常用技巧与设计模式。而以前复杂的设计模式与框架,可以利用ChatGPT轻松生成,只需要在其基础之上做适当的调优即可。

实践演练

  • 提示词:请示使用PO设计模式编写一个Web自动化测试脚本,要求使用到pytest测试框架和selenium web自动化框架。

ChatGPT返回的代码如下:

# login_page.py
class LoginPage:    def __init__(self, driver):        self.driver = driver        self.url = "https://example.com/login"  # 替换成实际的登录页面URL
    def open(self):        self.driver.get(self.url)
    def enter_username(self, username):        username_field = self.driver.find_element_by_id("username")  # 替换为实际的用户名字段元素定位方式        username_field.send_keys(username)
    def enter_password(self, password):        password_field = self.driver.find_element_by_id("password")  # 替换为实际的密码字段元素定位方式        password_field.send_keys(password)
    def click_login_button(self):        login_button = self.driver.find_element_by_id("login-button")  # 替换为实际的登录按钮元素定位方式        login_button.click()​​​​​​​
# test_login.py
import pytestfrom selenium import webdriverfrom login_page import LoginPage
@pytest.fixturedef browser():    driver = webdriver.Chrome()  # 使用Chrome浏览器,确保已安装Chrome驱动程序并将其添加到系统PATH中    yield driver    driver.quit()
def test_login_successful(browser):    login_page = LoginPage(browser)    login_page.open()    login_page.enter_username("your_username")    login_page.enter_password("your_password")    login_page.click_login_button()
    # 进行登录后的断言,例如检查登录后的页面元素或URL    assert "Welcome" in browser.title  # 替换成实际的断言条件

以上的代码只满足 PO 设计模式的需求,但是不满足数据驱动测试的需求,所以可以进一步优化提示词,要求用户名密码使用参数化以及数据驱动的方式传入。

  • 提示词:现在用户名密码,需要使用数据驱动+参数化的方式传入,请修改你的 test_login 的代码。

# test_login.py
import pytestfrom selenium import webdriverfrom login_page import LoginPage
@pytest.fixturedef browser():    driver = webdriver.Chrome()  # 使用Chrome浏览器,确保已安装Chrome驱动程序并将其添加到系统PATH中    yield driver    driver.quit()
# 使用参数化装饰器传入多组用户名和密码@pytest.mark.parametrize("username, password", [("user1", "pass1"), ("user2", "pass2")])def test_login_successful(browser, username, password):    login_page = LoginPage(browser)    login_page.open()    login_page.enter_username(username)    login_page.enter_password(password)    login_page.click_login_button()
    # 进行登录后的断言,例如检查登录后的页面元素或URL    assert "Welcome" in browser.title  # 替换成实际的断言条件
  • 提示词:测试数据要求放在一个yaml文件中,然后代码读取该yaml文件

- username: user1  password: pass1- username: user2  password: pass2- username: user3  password: pass3
# test_login.pyimport pytestfrom selenium import webdriverfrom login_page import LoginPageimport yaml
@pytest.fixturedef browser():    driver = webdriver.Chrome()  # 使用Chrome浏览器,确保已安装Chrome驱动程序并将其添加到系统PATH中    yield driver    driver.quit()
# 从YAML文件中读取测试数据def get_test_data():    with open("testdata.yaml", "r") as file:        data = yaml.safe_load(file)    return data
# 使用参数化装饰器传入多组用户名和密码@pytest.mark.parametrize("user_data", get_test_data())def test_login_successful(browser, user_data):    username = user_data["username"]    password = user_data["password"]
    login_page = LoginPage(browser)    login_page.open()    login_page.enter_username(username)    login_page.enter_password(password)    login_page.click_login_button()
    # 进行登录后的断言,例如检查登录后的页面元素或URL    assert "Welcome" in browser.title  # 替换成实际的断言条件

由此一步步的优化提示词以及ChatGPT的响应信息,即可让ChatGPT逐步满足需求。

总结

  1. 写清楚需求:明确生成的框架使用的技术栈,比如示例中的 python + selenium。

  2. 将复杂的任务拆分为更简单的子任务:将PO设计模式与数据驱动测试拆成两个提示词进行提问,方便后续进行纠正。

  3. 系统地测试变化: 当返回信息不满足需求,可以进一步提出要求,比如一开始ChatGPT理解的数据驱动通过变量实现即可,可以进一步补充为通过文件。

推荐学习

人工智能测试开发训练营为大家提供全方位的人工智能测试知识和技能培训行业专家授课,实战驱动,并提供人工智能答疑福利内容包含ChatGPT与私有大语言模型的多种应用,人工智能应用开发框架 LangChain,视觉与图像识别自动化测试,人工智能产品质量保障与测试,知识图谱与模型驱动测试,深度学习应用带你一站式掌握人工智能测试开发必备核心技能,快速提升核心竞争力!

图片

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

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

相关文章

IOday5

一、思维导图 二、练习 使用两个线程完成两个文件的拷贝&#xff0c;分支线程1拷贝前一半&#xff0c;分支线程2拷贝后一半&#xff0c;主线程回收两个分支线程的资源 #include<myhead.h>//定义结构体存储需要传到线程函数中的内容 struct Buf {const char *file[2]; …

Python爬虫:下载人生格言

Python爬虫:下载人生格言 爬取网页 将这些格言下载存储到本地 代码: import requests #导入requests库&#xff0c;用于提取网页 from lxml import etree#导入lxml库&#xff0c;用于Xpath数据解析#请求头 header{ user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) A…

aurora8b10b ip的使用(未完)

文章目录 一、Aurora8B/10B协议二、时钟、复位与状态指示1、时钟2、复位3、状态指示 三、数据发送、接受接口&#xff08;1&#xff09;AXI4-Stream位排序&#xff08;2&#xff09;Streaming接口&#xff08;3&#xff09;Framing接口&#xff08;帧传输接口&#xff09; 四、…

输入成绩问题(c语言)

1.问题&#xff1a;期中考试开始了&#xff0c;大家想要取得好成绩&#xff0c;争夺前五名&#xff0c;从键盘输入n个学生成绩&#xff08;不超过40个&#xff09;&#xff0c;输出每组的前五名的成绩 两行&#xff0c;第一行输入一个整数&#xff0c;表示n个学生&#xff08;…

springboot学习笔记第一天

springboot的简单了解 Java Spring 是一个开源的轻量级应用框架&#xff0c;在 Java 应用开发中起到了简化开发、提高效率、促进模块化和松耦合、支持技术集成等多重作用&#xff0c;成为了广大企业和开发者首选的企业级 Java 应用开发框架之一。 Spring Boot 是一个基于 Spr…

深度学习中6种loss函数Pytorch API调用示例

自定义数据 import torch import torch.nn as nn import torch.nn.functional as Fbatchsize2 num_class4logitstorch.randn(batchsize,num_class) targettorch.randint(num_class,size(batchsize,))#delta目标分布 target_logitstorch.randn(batchsize,num_class)#非delta目标…

浏览器中的同源策略、CORS 以及相关的 Fetch API 使用

前言 笔者对前端 Web 技术的认真学习&#xff0c;其实开始于与 Fetch API 的邂逅。当时觉得 fetch() 的设计很不错&#xff0c;也很希望能够请求其它网站下的数据并作处理和展示。学习过程中 HTML 和 CSS 都还好说&#xff0c;由于几乎没有 Web 技术的基础&#xff0c;学习 Fe…

vue配置多个环境变量ENV【收藏版】

vue配置多个环境变量 1. 创建环境变量文件 在你的Vue项目根目录下&#xff0c;你可以创建以下环境变量文件&#xff1a; .env&#xff1a;所有环境都会加载的通用变量。 .env.local&#xff1a;本地覆盖&#xff0c;不会被git跟踪。 .env.[mode]&#xff1a;只有指定模式才会…

1007 Maximum Subsequence Sum(Java)

题目 解释 题目说的就是给你一串K个数字&#xff0c;让你找到连续的和最大的子串&#xff0c;同时输出子串的和、子串起始的元素、子串末尾的元素&#xff0c;如果K个数字全是负数&#xff0c;输出子串和为0、子串起始元素为整个字符串的第一个元素&#xff0c;子串末尾元素为…

CompletableFuture并行编程生产问题处理

前提 本文章是在项目中发现一些同学对并行编程的思想理解&#xff0c;或者说对代码的执行逻辑有些理解偏颇的地方。特整理此文章进行分享&#xff0c;希望有同样困惑的小伙伴能够对此类问题有一个清晰的理解。 在此不会介绍CompletableFuture对库函数用法&#xff0c;因为库函数…

XSS-labs靶场(超详解)1-20关——附原码

level1 原码 <!DOCTYPE html><!--STATUS OK--><html> <head> <meta http-equiv"content-type" content"text/html;charsetutf-8"> <script> window.alert function() { confirm("完成的不错&#xff0…

【Java】字符串StringBuilder类和Stringjoiner类(013)

目录 ♦️StringBuilder类 &#x1f38f;StringBuilder构造方法 &#x1f421;无参构造 &#x1f421;有参构造 &#x1f38f;SringBuilder常用方法 &#x1f38f;StringBuildre类练习题&#xff1a; &#x1f421;对称字符串 &#x1f421;拼装字符串 ♦️Stringjoine…

(Python)内存管理

前言 内存泄漏在编程中是一个严重的问题&#xff0c;可能导致程序性能下降、系统不稳定甚至崩溃。 目录 危害 风险 动态内存分配 引用计数 内存池 垃圾回收 设计原则 危害 性能下降&#xff1a;可用内存减少&#xff0c;导致系统频繁进行内存交换&#xff0c;使程序运行…

Netdevops入门之Telnetlib语法案例

1、Telnetlib模块&#xff1a; 支持telnet/ssh远程访问的模块很多&#xff0c;常见的有telnetlib、ciscolib、paramiko、netmiko、pexpect,其中telnetlib和ciscolib对应telnet协议&#xff0c;后面3个对应SSH协议。 ①-通过ENSP环境搭建实验环境 ②-基础语法-telnetlib案例1&…

最优控制、轨迹优化相关笔记、感悟

写在前面 上学期和最近无聊在看一些最优控制、轨迹优化相关的内容&#xff0c;涉及到MIT Russ Tedrake教授的Underactuated Robotics&#xff0c;以及CMU Zachary Manchester教授的Optimal Control&#xff08;两套课程其实挺像的&#xff09;&#xff0c;加起来估计也看了十多…

机器学习算法(二)线性模型

一、线性回归 假设自变量X矩阵有3个特征&#xff0c;因变量是Y矩阵&#xff0c;w是系数矩阵 Y X * w 损失函数&#xff1a;误差平方和函数&#xff08;Y - label&#xff09;** 2 二、逻辑回归 线性回归得到的是一个实数值 z &#xff0c;用sigmoid函数可以将其映射到 0 …

【SQL Server 】SQL Server 网络配置

目录 ​编辑 第3章&#xff1a;SQL Server 网络配置 SQL Server 网络监听器 SQL Server 网络协议 配置 SQL Server 网络协议 示例&#xff1a;配置 SQL Server 使用自定义端口 安全注意事项 第3章&#xff1a;SQL Server 网络配置 SQL Server 网络监听器 SQL Server 通…

php时间 cookie session 文件上传基础

时间和日期 PHP Date&#xff08;&#xff09; 函数 格式// date(format,timestamp) format Required. Specifies the format of the timestamp timestamp Optional. Specifies a timestamp. Default is the current date and time d - 表示每月的某一天&#xff08;01…

反序列化漏洞靶机实战-serial

一.安装靶机 下载地址为https://download.vulnhub.com/serial/serial.zip&#xff0c;安装好后开启靶机&#xff0c;这里并不需要我们去登录&#xff0c;直接扫描虚拟机nat模式下c网段的ip&#xff0c;看看哪个的80端口开放&#xff0c;然后直接去访问 二.查找cookie 访问靶…

Java Try学习

一. 介绍 io.vavr.control.Try 是 Vavr 库的一个类&#xff0c;用于处理可能抛出异常的方法调用&#xff1b;它提供了一种优雅的方式来处理成功和失败的情况&#xff0c;而无需显示地使用 try-catch 块&#xff1b; 简而言之&#xff0c;它可以优雅的实现 try-catch&#xff…