• 软件测试/测试开发丨利用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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    # 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  # 替换成实际的断言条件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    以上的代码只满足 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  # 替换成实际的断言条件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    - 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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    总结

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

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

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

  • 相关阅读:
    【甄选靶场】Vulnhub百个项目渗透——项目十三:SickOs 1.2(防火墙绕过,计划任务写入)
    【小5聊】纯javascript实现图片放大镜效果
    微信小程序——事件监听
    Elasticsearch是如何通过倒排索引来查询数据的
    一幅长文细学Spring(二)——IOC
    代码随想录32——贪心:122买卖股票的最佳时机II、55跳跃游戏、45跳跃游戏II
    RabbitMQ(控制台模拟收发消息与数据隔离)
    Java基础之《netty(6)—NIO快速入门》
    Android Glide, first start based on loadThumbnail, Kotlin(一)
    ffmpeg跨平台arm编译-ubuntu
  • 原文地址:https://blog.csdn.net/Ceshiren666/article/details/133746030