deepseek+vscode自动化测试脚本生成

近几日Deepseek大火,我这里也尝试了一下,确实很强。而目前vscode的AI toolkit插件也已经集成了deepseek R1,这里就介绍下在vscode中利用deepseek帮助我们完成自动化测试脚本的实践分享

安装AI ToolKit并启用Deepseek

微软官方提供了一个针对AI辅助的插件,也就是 AI Toolkit for Visual Studio Code, 这个插件可以利用各种开源或商用的大模型,目前也已经集成了Deepseek R1模型,可以让我们在VS code中方便地利用Deepseek来帮助我们的代码开发

首先在插件中心中找到AI Toolkit并完成安装

请添加图片描述

安装完成插件以后,在插件页面,选择catalog中的models模型页面,并通过筛选条件 hosted by Github, 以及 publisher Deepseek 使用Deepseek-R1模型

请添加图片描述

AI帮助生成脚本

有了deepseek模型后,我们就可以新建一个playgroud让deepseek帮助我们生成自动化脚本了,以下是我让Deepseek生成的针对saucedemo的测试脚本

请添加图片描述

思考过程

嗯,我现在需要帮忙设计一个基于pytest和Playwright的自动化测试项目,针对saucedemo.com的登录和checkout流程,使用POM模式,用户数据放在user.yml里,还要包含异常场景。好的,我得一步一步来。

首先,应该确定项目的结构。POM模式的话,通常会有page对象、测试用例、配置文件、数据文件等。可能需要这样的目录结构:

  • tests/
    • pages/
      • login_page.py
      • inventory_page.py
      • cart_page.py
      • checkout_page.py
    • test_login.py
    • test_checkout.py
  • conftest.py
  • user.yml
  • pytest.ini

然后,用户数据存在user.yml里,里面应该有不同的用户类型,比如标准用户,锁定用户,错误密码,没有用户等。然后测试用例要读取这些数据。

接下来是Page Object Model的实现。每个页面比如登录页、商品页,购物车页、结算页都有自己的类,封装元素和操作。比如LoginPage有用户名、密码输入框,登录按钮,错误提示的方法。

测试用例应该使用pytest的参数化来覆盖不同的用户场景。比如正常登录成功,无效密码,锁定用户等。同时,checkout流程需要正常流程的测试,可能还有填写信息不完整的情况。

然后考虑conftest.py里面设置Playwright的fixture,比如browser,page,以及各个page对象的fixture。比如,每次测试前都转到登录页,登录后到库存页,这样可以处理前置条件。

异常场景的话,例如登录时的各种错误信息,结账时的表单验证,比如必须填first name等。需要编写这些测试用例,并验证错误提示是否正确。

用户的数据如何加载呢?可能用pyYAML库来读取user.yml文件,里面分不同用户的数据。测试时用@pytest.mark.parametrize参数化输入不同的用户数据。

比如,用户数据分成valid_users,invalid_password,locked_user等键。在测试登录的时候,参数化这些情况,触发不同的测试用例。

在测试checkout流程时,可能需要先登录,然后添加商品到购物车,进入购物车,进入结算页,填写信息,完成checkout。这时候,正常的测试用例需要用有效的数据,而异常情况比如不填写某些字段需要验证错误提示。

还需要处理元素的选择器,Playwright的定位方法,比如使用CSS选择器或文本定位。例如,登录页可能通过id定位用户名和密码输入框。

此外,测试完成后需要清理状态吗?比如,购物车中的商品或者是否需要登出,或者每个测试用例之间保持独立,可能使用 fixtures 来确保各自的状态。

也可能需要处理异步操作,不过Playwright是自动处理等待的,所以在页面导航或元素点击时不需要额外处理。

现在,具体的步骤:

  1. 创建项目结构,安装依赖:pytest, playwright, pyyaml。
  2. 编写user.yml,包含不同类型的用户数据。
  3. 实现各个页面的Page类,包含元素定位和操作方法。
  4. 在conftest.py中定义fixture,例如初始化page,创建各page对象的实例。
  5. 编写测试用例,参数化用户数据,覆盖正常和异常流程。
  6. 处理测试中的等待和断言,确保元素的存在或文本正确。

需要检查测试用例是否覆盖以下场景:

登录:

  • 正确用户密码登录成功。
  • 错误密码提示错误信息。
  • 锁定用户无法登录。
  • 空用户名或密码提示错误。

Checkout:

  • 正常填写所有信息,完成订单。
  • 必填字段缺失(如first name为空)提示错误。
  • 取消订单流程。

现在,user.yml的结构应该是什么样的?

可能如下:

users: valid_user: username: standard_user password: secret_sauce invalid_password_user: username: standard_user password: wrongpass locked_user: username: locked_out_user password: secret_sauce missing_username: username: “” password: secret_sauce missing_password: username: standard_user password: “”

在测试登录的时候,参数化这些情况。比如,对于valid_user,应该登录成功,跳转到/inventory.html。对于invalid_password,显示Epic sadface: Username and password do not match。锁定的用户提示Epic sadface: Sorry, this user has been locked out。缺少用户名或密码提示相应的错误信息。

对于checkout流程,可行的步骤是:

登录后,添加一个商品到购物车,点击购物车图标,进入购物车页,点击checkout按钮,填写信息,继续,完成。

所以测试用例需要参数化填写的信息是否正确。例如:

正常情况下的信息:

first_name: John last_name: Doe zip: 12345

异常情况,比如不填first name,是否提示错误。

在编写这些测试时,需要使用页面对象的方法来完成每个步骤,比如添加商品,进入购物车,填写信息,继续按钮等。

可能的问题点:

元素的定位是否正确,特别是动态生成的内容或者异步加载的部分是否需要等待。不过Playwright有自动等待机制,所以选择元素时只要正确选择应该没问题。

需要断言的地方包括:登录后的页面URL是否正确,订单完成后的确认信息是否存在,错误提示是否显示正确的文本。

比如,登录成功后应该跳转到/inventory.html;checkout完成后应该显示“Thank you for your order”。

另外,可能需要清理购物车,但因为每个测试可能独立运行,或者每个测试都重新开始会话,所以在fixture中可以处理,如在每次测试前登录并重置状态?

或者使用类似于beforeEach的fixture,让每个测试用例开始时处于某个状态。比如,登录后的页面。

此外,测试购物流程需要添加商品到购物车,所以库存页面的类需要有添加商品的方法。

Page类示例:

InventoryPage可以有添加某个商品的方法,比如点击“Add to cart”按钮。比如,根据商品名称定位对应的按钮。不过这可能比较复杂,也许在页面上使用通用的方法。

或者,在InventoryPage中有方法add_item_to_cart(item_name),用于点击对应商品的添加按钮。这时需要使用Playwright的定位方法,例如:

def add_item_to_cart(self, item_name): self.page.locator(f"text={item_name}").locator(“xpath=…”).locator(“button”).click()

不过这可能需要根据实际的DOM结构来确定。可能需要inspector查看元素结构。

例如,每个商品项的结构可能类似:

Sauce Labs Backpack
Add to cart

所以,找到对应的名称元素,然后找到其父级元素中的按钮。

或者,更简单的办法是每个商品的“Add to cart”按钮有不同的id,比如 add-to-cart-sauce-labs-backpack,或其他属性。需要看实际网站的结构。

登录后的页面可能有多个商品,每个商品对应的添加按钮可能需要通过其文本来定位对应的按钮。或者通过其他属性。

现在,需要实际查看saucedemo.com的结构。可能使用Playwright的代码生成功能来获取正确的选择器。

假设,例如,每个商品的“Add to cart”按钮的id是动态生成的或者类似,例如对于“Sauce Labs Backpack”,对应的按钮的id可能是add-to-cart-sauce-labs-backpack,那么可以直接通过这个id去定位。

这样的话,InventoryPage中可以有一个方法:

def add_product_to_cart(self, product_name): product_id = product_name.lower().replace(’ ', ‘-’) self.page.click(f"#add-to-cart-{product_id}")

当然,这需要查看实际的网站结构是否正确。

假设正确的商品example在这里是Sauce Labs Backpack,其id可能确实是这样的,这样方法可行。

另外,购物车图标上的数量是否正确,当商品添加后,购物车的图标显示数量为1。当进入购物车页,是否有对应的商品。

需要注意,每个操作之后的页面变化是否需要新的Page对象实例,比如在InventoryPage点击购物车后跳转到CartPage,所以该操作应该返回CartPage的实例,从而能够继续操作。

这样方法的返回值处理可能成为问题。比如:

在InventoryPage中的方法:

def go_to_cart(self): self.page.click(“.shopping_cart_link”) return CartPage(self.page)

类似这样,每个导航动作返回新的Page对象。

这会需要在各个页面的方法中处理返回相应的页面对象。

然后是测试流程的组装:

在测试checkout的时候,可能步骤很多,需要写一个大的测试用例,分步骤进行:

例如:

def test_checkout_process(login_page, inventory_page, checkout_data): # 登录 login_page.login(“standard_user”, “secret_sauce”) # 添加商品 inventory_page.add_product_to_cart(“Sauce Labs Backpack”) inventory_page.go_to_cart() # 进入购物车页面,点击checkout cart_page.click_checkout() # 填写checkout信息 checkout_page.fill_shipping_info(checkout_data) checkout_page.continue_to_overview() # 确认订单 checkout_page.finish_checkout() # 断言是否成功 assert checkout_page.get_order_confirmation() == “Thank you for your order!”

当然,这可能涉及到许多页面的跳转,每个页面之间需要用对应的方法来连接。

异常场景的话,比如在填写信息的时候不输入first name,点击continue时,出现错误提示。

此时,测试用例可能参数化不同的数据,比如:

@pytest.mark.parametrize(“first_name, last_name, zip_code, error_message”, [ (“”, “Doe”, “12345”, “Error: First Name is required”), (“John”, “”, “12345”, “Error: Last Name is required”), (“John”, “Doe”, “”, “Error: Postal Code is required”), ]) def test_checkout_missing_fields(…, first_name, last_name, zip_code, error_message): # 填信息时,漏掉对应字段 checkout_page.fill_shipping_info(first_name, last_name, zip_code) checkout_page.continue_to_overview() assert checkout_page.get_error_message() == error_message

可能还需要考虑,错误信息提示元素的定位是否正确,以及当出现错误时是否阻止进入下一步。

现在,问题可能是如何组织这些数据和页面方法。

另外,关于用户数据的读取,测试用例需要从YAML文件中加载。可能的做法是在conftest.py里面写个fixture读取YAML的数据,然后参数化测试用例。

但pytest的参数化可能需要特定的方式处理,可能将YAML数据转换成测试参数。或者使用外部数据源来参数化测试。

例如,在conftest.py中读取user.yml的所有用户数据,并为登录测试创建一个参数化的fixture。

或者,可以在测试用例中直接读取YAML文件中的数据,并将其参数化。

比如:

import yaml

def load_users(): with open(‘user.yml’) as f: data = yaml.safe_load(f) return data[‘users’]

然后在测试用例中用:

@pytest.mark.parametrize(“user”, [ (“valid_user”), (“invalid_password_user”), (“locked_user”), # … 其他情况 ], indirect=True) def test_login(login_page, user): login_page.login(user[‘username’], user[‘password’]) # 断言等操作

不过,如何将数据转换为参数可能需要更细致的处理,比如将各个用户数据提取成各个测试实例的参数。

可能更好的方法是将不同的用户情况分别写成不同的测试数据项。例如,把不同用户类型数据的键列出来,然后根据这些键从数据中加载相应的参数。

或者,在所有参数化时,导入所有用户数据作为参数。

比如:

import yaml import pytest

with open(‘user.yml’) as f: user_data = yaml.safe_load(f)[‘users’]

login_test_data = [ (user_data[‘valid_user’], True, None), # 正常用户,登录成功,没有错误 (user_data[‘invalid_password_user’], False, ‘Epic sadface: Username and password do not match’), (user_data[‘locked_user’], False, ‘Epic sadface: Sorry, this user has been locked out.’), # … 其他情况 ]

@pytest.mark.parametrize(“user, success, error_msg”, login_test_data) def test_login_user(login_page, user, success, error_msg): login_page.navigate() login_page.login(user[‘username’], user[‘password’]) if success: assert login_page.current_url == ‘https://www.saucedemo.com/inventory.html’ else: assert login_page.get_error_message() == error_msg

这时候,需要在user.yml里的每个用户数据中有一个error键,或者在参数化的准备阶段处理错误信息的映射。

不过这样的参数方式可能更灵活,能够同时指定预期结果。

对于YAML的结构,可能需要更详细的数据项,每个用户数据包含预期的错误消息。

例如,user.yml部分内容:

valid_user: username: standard_user password: secret_sauce expected: success: true error: null

invalid_password_user: username: standard_user password: wrong expected: success: false error: “Epic sadface: Username and password do not match”

locked_user: username: locked_out_user password: secret_sauce expected: success: false error: “Epic sadface: Sorry, this user has been locked out.”

这样参数化时可以更具结构化。但在编写YAML时需要考虑每个用例的期望结果。

这样&#x

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简要介绍C++中的 max 和 min 函数以及返回值

简要介绍C中的 max 和 min 函数 在C中&#xff0c;std::max 和 std::min 是标准库 <algorithm> 中提供的函数&#xff0c;用于比较两个或多个值并返回最大值或最小值。这些函数非常强大且灵活&#xff0c;支持多种数据类型&#xff08;如整数、浮点数、字符串等&#xff…

【MyDB】4-VersionManager 之 3-死锁及超时检测

【MyDB】4-VersionManager 之 3-死锁及超时检测 死锁及超时检测案例背景LockTable锁请求与等待管理 addvm调用addputIntoList&#xff0c;isInList&#xff0c;removeFromList 死锁检测 hasDeadLock方法资源释放与重分配 参考资料 死锁及超时检测 本章涉及代码&#xff1a;top/…

Elasticsearch:如何搜索含有复合词的语言

作者&#xff1a;来自 Elastic Peter Straer 复合词在文本分析和标记过程中给搜索引擎带来挑战&#xff0c;因为它们会掩盖词语成分之间的有意义的联系。连字分解器标记过滤器等工具可以通过解构复合词来帮助解决这些问题。 德语以其长复合词而闻名&#xff1a;Rindfleischetik…

服务器虚拟化实战:架构、技术与最佳实践

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 服务器虚拟化是现代 IT 基础设施的重要组成部分&#xff0c;通过虚拟化技术可以提高服务器资源利用率、降低硬件成本&am…

【LLM】Ollama框架入门指北

note Ollama是一个开源框架&#xff0c;专门设计用于在本地运行大型语言模型。它的主要特点是将模型权重、配置和数据捆绑到一个包中&#xff0c;从而优化了设置和配置细节&#xff0c;包括GPU使用情况&#xff0c;简化了在本地运行大型模型的过程。Ollama提供了对模型量化的支…

Linux系统:Ubuntu替换镜像源具体方法;

在Linux系统更新下载软件时&#xff0c;如遇因镜像源问题下载失败时&#xff0c;我们就需要替换系统原有镜像源&#xff0c;那么&#xff0c;此时&#xff0c;你是否还在百度四处搜索可以用的镜像源地址&#xff0c;然后反复去测试源地址的正确性呢&#xff0c;下面介绍一个亲测…

使用vhd虚拟磁盘安装两个win10系统

使用vhd虚拟磁盘安装两个win10系统 前言vhd虚拟磁盘技术简介准备工具开始动手实践1.winX选择磁盘管理2.选择“操作”--“创建VHD”3.自定义一个位置&#xff0c;输入虚拟磁盘大小4.右键初始化磁盘5.选择GPT分区表格式6.右键新建简单卷7.给卷起个名字&#xff0c;用于区分8.打开…

HTML(快速入门)

欢迎大家来到我的博客~欢迎大家对我的博客提出指导&#xff0c;有错误的地方会改进的哦~点击这里了解更多内容 目录 一、前言二、HTML基础2.1 什么是HTML?2.2 认识HTML标签2.2.1 HTML标签当中的基本结构2.2.2 标签层次结构 2.3 HTML常见标签2.3.1 标题标签2.3.2 段落标签2.3.3…

d3.js: Relation Graph

d3.js Tags d3/d3 GitHub D3 by Observable | The JavaScript library for bespoke data visualization 下载或 <!-- 引入 D3.js 库 --> <script src"https://d3js.org/d3.v7.min.js"></script> <!-- 引入 D3.js 库 --> <…

Oracle Primavera P6自动进行进度计算

前言 在P6 Professional 有一个自动计划计算的选项&#xff0c;很多人不了解该设置如何使用&#xff0c;以及什么时候该启动这项配置。 详情 P6 Professional 默认为非自动进度计算。启用自动选项后&#xff0c;可以快速查看调度更改的效果。 ​ ​ 如图所示&#xff0c;当你…

反射、枚举以及lambda表达式

一.反射 1.概念&#xff1a;Java的反射&#xff08;reflection&#xff09;机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff0c;既然能拿到那么&am…

【Proteus仿真】【51单片机】简易计算器系统设计

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 联系作者 一、主要功能 1、LCD1602液晶显示 2、矩阵按键​ 3、可以进行简单的加减乘除运算 4、最大 9999*9999 二、使用步骤 系统运行后&#xff0c;LCD1602显示数据&#xff0c;通过矩阵按键…

HarmonyOS简介:HarmonyOS核心技术理念

核心理念 一次开发、多端部署可分可合、自由流转统一生态、原生智能 一次开发、多端部署 可分可合 自由流转 自由流转可分为跨端迁移和多端协同两种情况 统一生态 支持业界主流跨平台开发框架&#xff0c;通过多层次的开放能力提供统一接入标准&#xff0c;实现三方框架快速…

(即插即用模块-特征处理部分) 十九、(NeurIPS 2023) Prompt Block 提示生成 / 交互模块

文章目录 1、Prompt Block2、代码实现 paper&#xff1a;PromptIR: Prompting for All-in-One Blind Image Restoration Code&#xff1a;https://github.com/va1shn9v/PromptIR 1、Prompt Block 在解决现有图像恢复模型时&#xff0c;现有研究存在一些局限性&#xff1a; 现有…

Day24-【13003】短文,数据结构与算法开篇,什么是数据元素?数据结构有哪些类型?什么是抽象类型?

文章目录 13003数据结构与算法全书框架考试题型的分值分布如何&#xff1f; 本次内容概述绪论第一节概览什么是数据、数据元素&#xff0c;数据项&#xff0c;数据项的值&#xff1f;什么是数据结构&#xff1f;分哪两种集合形式&#xff08;逻辑和存储&#xff09;&#xff1f…

使用 MSYS2 qemu 尝鲜Arm64架构国产Linux系统

近期&#xff0c;我的师弟咨询我关于Arm64架构的国产CPU国产OS开发工具链问题。他们公司因为接手了一个国企的单子&#xff0c;需要在这类环境下开发程序。说实在的我也没有用过这个平台&#xff0c;但是基于常识&#xff0c;推测只要基于C和Qt&#xff0c;应该问题不大。 1. …

unity学习21:Application类与文件存储的位置

目录 1 unity是一个跨平台的引擎 1.1 使用 Application类&#xff0c;去读写文件 1.2 路径特点 1.2.1 相对位置/相对路径&#xff1a; 1.2.2 固定位置/绝对路径&#xff1a; 1.3 测试方法&#xff0c;仍然挂一个C#脚本在gb上 2 游戏数据文件夹路径&#xff08;只读&…

【Redis】hash 类型的介绍和常用命令

1. 介绍 Redis 中存储的 key-value 本身就是哈希表的结构&#xff0c;存储的 value 也可以是一个哈希表的结构 这里每一个 key 对应的一个 哈希类型用 field-value 来表示 2. 常用命令 命令 介绍 时间复杂度 hset key field value 用于设置哈希表 key 中字段 field 的值为…

基于51单片机和WS2812B彩色灯带的流水灯

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码四、主函数总结 系列文章目录 前言 用彩色灯带按自己想法DIY一条流水灯&#xff0c;谁不喜欢呢&#xff1f; 所用单片机&#xff1a;STC15W204S &#xff08;也可以用其他1T单片机&#xff0c;例如&#xff0c;S…

力扣017_最小覆盖字串题解----C++

题目描述 我们可以用滑动窗口的思想解决这个问题。在滑动窗口类型的问题中都会有两个指针&#xff0c;一个用于「延伸」现有窗口的 r 指针&#xff0c;和一个用于「收缩」窗口的 l 指针。在任意时刻&#xff0c;只有一个指针运动&#xff0c;而另一个保持静止。我们在 s 上滑动…