当前位置: 首页 > news >正文

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

简介

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,视觉与图像识别自动化测试,人工智能产品质量保障与测试,知识图谱与模型驱动测试,深度学习应用带你一站式掌握人工智能测试开发必备核心技能,快速提升核心竞争力!

图片

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 关于python问题 ,生成的excel文件内无爬取的数据存在,请问应如何解决?
  • 花10分钟写个漂亮的后端API接口模板!
  • 【架构】客户端优化
  • vue3后台管理系统 vue3+vite+pinia+element-plus+axios上
  • 基于Python的鸢尾花聚类与分类
  • VS+opencv+环境配置
  • QEMU虚拟机(TODO)
  • 【Spring】——代理模式、AOP、MyBatis-Spring学习以及Spring事务
  • WPF中的数据模板和样式:实现一致性和可维护性
  • openmetadata安装
  • 赞!蚓链用数字化打造助农扶农电商平台!
  • 【多线程】线程池
  • 详解Qt 之 QColor、QColorSpace与QColorTransform
  • JSONP跨域
  • IDEA优化配置,提高启动和运行速度
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • canvas 绘制双线技巧
  • co.js - 让异步代码同步化
  • Computed property XXX was assigned to but it has no setter
  • Fabric架构演变之路
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • Java 网络编程(2):UDP 的使用
  • JSONP原理
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • ucore操作系统实验笔记 - 重新理解中断
  • vue-cli在webpack的配置文件探究
  • 初探 Vue 生命周期和钩子函数
  • 大整数乘法-表格法
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 技术胖1-4季视频复习— (看视频笔记)
  • 京东美团研发面经
  • 前端相关框架总和
  • 前端之Sass/Scss实战笔记
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 智能合约Solidity教程-事件和日志(一)
  • Spring第一个helloWorld
  • 积累各种好的链接
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​Spring Boot 分片上传文件
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • $.ajax()
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (12)Hive调优——count distinct去重优化
  • (55)MOS管专题--->(10)MOS管的封装
  • (Forward) Music Player: From UI Proposal to Code
  • (待修改)PyG安装步骤
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (一)认识微服务
  • (转)JAVA中的堆栈
  • (转)ObjectiveC 深浅拷贝学习
  • (转)人的集合论——移山之道