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

发表于:2023-10-16 09:15

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:佚名    来源:知乎

  简介
  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
  # test_login.py
  import pytest
  from selenium import webdriver
  from login_page import LoginPage
  @pytest.fixture
  def 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 pytest
  from selenium import webdriver
  from login_page import LoginPage
  @pytest.fixture
  def 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  # 替换成实际的断言条件
  - username: user1
    password: pass1
  - username: user2
    password: pass2
  - username: user3
    password: pass3
  # test_login.py
  import pytest
  from selenium import webdriver
  from login_page import LoginPage
  import yaml
  @pytest.fixture
  def 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  # 替换成实际的断言条件
  总结
  1.写清楚需求:明确生成的框架使用的技术栈,比如示例中的 Python + Selenium。
  2.将复杂的任务拆分为更简单的子任务:将PO设计模式与数据驱动测试拆成两个提示词进行提问,方便后续进行纠正。
  3.系统地测试变化: 当返回信息不满足需求,可以进一步提出要求,比如一开始ChatGPT理解的数据驱动通过变量实现即可,可以进一步补充为通过文件。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号