章
目
录
今天,就为大家详细介绍如何将DeepSeek接入VS Code,并结合AI Toolkit插件,实现自动化脚本的实战开发,以一个针对saucedemo的测试脚本项目为例,带大家一步步深入体验。
一、前期准备:搭建开发环境
微软官方推出了一款功能强大的AI辅助插件——AI Toolkit for Visual Studio Code,它为开发者和AI工程师提供了便利,能够借助各种开源或商用大模型进行开发。值得一提的是,该插件目前已集成了DeepSeek R1模型,让我们在VS Code中就能轻松借助DeepSeek开展代码开发工作。
安装AI ToolKit插件并启用DeepSeek模型并不复杂。打开VS Code的插件中心,搜索“AI Toolkit”并完成安装。
安装完成后,在插件页面找到Catalog中的Models模型页面,通过筛选“hosted by Github”以及“publisher DeepSeek”,就能顺利启用DeepSeek – R1模型。
二、借助AI生成自动化脚本
拥有DeepSeek模型后,我们就可以创建一个Playground,让它帮助我们生成自动化脚本。以针对saucedemo的自动化测试脚本为例,看看DeepSeek是如何发挥作用的。
1. 规划项目结构
在POM(Page Object Model)模式下,项目结构通常包含page对象、测试用例、配置文件、数据文件等。合理的目录结构如下:
├── data
│ └── users.yml
├── pages
│ ├── __init__.py
│ ├── login_page.py
│ ├── products_page.py
│ └── checkout_page.py
├── tests
│ └── test_saucedemo.py
├── conftest.py
└── requirements.txt
这样的结构分层清晰,便于管理和维护项目。
2. 处理用户数据
用户数据存放在user.yml文件中,里面包含不同类型的用户,如标准用户、锁定用户、错误密码用户等。测试用例可以通过pyYAML库读取这个文件,并利用@pytest.mark.parametrize
进行参数化,从而输入不同的用户数据。例如:
valid_user:
username: "standard_user"
password: "secret_sauce"
invalid_users:
- username: "locked_out_user"
password: "secret_sauce"
error: "Epic sadface: Sorry, this user has been locked out."
- username: "invalid_user"
password: "wrong_password"
error: "Epic sadface: Username and password do not match any user in this service"
3. 实现Page Object Model
每个页面,如登录页、商品页、结算页,都有对应的类来封装元素和操作。以登录页为例:
from playwright.sync_api import Page
class LoginPage:
def __init__(self, page: Page):
self.page = page
self.username = page.locator("#user-name")
self.password = page.locator("#password")
self.login_button = page.locator("#login-button")
self.error_message = page.locator(".error-message-container")
def navigate(self):
self.page.goto("https://www.saucedemo.com/")
def login(self, username: str, password: str):
self.username.fill(username)
self.password.fill(password)
self.login_button.click()
通过这种方式,每个页面的操作和元素定位都被清晰地封装起来,提高了代码的可维护性和复用性。
4. 设计测试用例
测试用例利用pytest的参数化功能,覆盖多种用户场景,包括正常登录、无效密码、锁定用户等。同时,对checkout流程也进行全面测试,涵盖正常流程和填写信息不完整等情况。
import pytest
import yaml
from playwright.sync_api import Page
with open("data/users.yml") as f:
test_data = yaml.safe_load(f)
@pytest.mark.parametrize("user", test_data["invalid_users"])
def test_invalid_login(page: Page, user):
login_page = LoginPage(page)
login_page.navigate()
login_page.login(user["username"], user["password"])
assert login_page.error_message.is_visible()
assert user["error"] in login_page.error_message.inner_text()
def test_valid_login_and_checkout(page: Page):
# Login
login_page = LoginPage(page)
login_page.navigate()
login_page.login(test_data["valid_user"]["username"],
test_data["valid_user"]["password"])
# Add product
products_page = ProductsPage(page)
assert products_page.title.inner_text() == "Products"
products_page.add_to_cart()
products_page.go_to_cart()
# Checkout
page.click("#checkout")
checkout_page = CheckoutPage(page)
checkout_page.fill_info("John", "Doe", "12345")
checkout_page.complete_checkout()
assert checkout_page.complete_header.inner_text() == "THANK YOU FOR YOUR ORDER"
5. 设置fixture
在conftest.py文件中设置Playwright的fixture,如browser、page,以及各个page对象的fixture。这有助于处理测试的前置条件,比如每次测试前都转到登录页,登录后到库存页。
import pytest
from playwright.sync_api import Playwright
@pytest.fixture(scope="function")
def page(playwright: Playwright):
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
yield page
context.close()
browser.close()
6. 明确依赖库
项目需要用到的依赖库有:
pytest
playwright
PyYAML
三、整合项目:从规划到落地
1. 梳理测试场景
- 登录场景:包括正确用户密码登录成功、错误密码提示错误信息、锁定用户无法登录、空用户名或密码提示错误。
- Checkout场景:涵盖正常填写所有信息完成订单、必填字段缺失提示错误、取消订单流程。
2. 执行实施步骤
- 创建项目结构,并安装pytest、playwright、pyyaml等依赖库。
- 编写user.yml文件,准备不同类型的用户数据。
- 实现各个页面的Page类,完成元素定位和操作方法的编写。
- 在conftest.py中定义fixture,初始化page并创建各page对象的实例。
- 编写测试用例,通过参数化用户数据,覆盖正常和异常流程,同时处理好测试中的等待和断言,确保元素的存在或文本正确。
3. 把握关键点
- POM模式的分层结构,让每个页面的操作和元素定位清晰明确。
- 使用YAML文件管理测试数据,方便维护和扩展。
- 参数化测试能够有效支持多种异常场景的验证。
- 完整的端到端测试流程,全面覆盖登录、加购、结账等环节。
- Playwright的同步API简化了测试编写过程。
- 通过conftest管理浏览器实例,提高测试的稳定性和可重复性。
四、见证成果:测试运行效果
langlongrong@lang longrongdeMacBook-Pro sauce_demo_test % pytest tests/test_saucedemo.py -v
test session starts
platform darwin --Python 3.10.8,pytest-7.2.0, pluggy-1.0.0--/Library/Frameworks/Python.framework/Versions/3.10/bin/python3.10
cachedir:.pytest_cache
metadata: {'Python':'3.10.8','Platform':'mac0s-12.7.6-x8664-1386-64bit','Packages':{'pytest':'7.2.0','pluggy':'1.0.0'},'Plugins': {'rerunfailures': 10.3,'html':'3.2.0','anyio':'4.6.0','playwright':'0.7.0','testreport':'1.1.5','base-url':'2.1.0','metadata':'2.0.4','hydra-core':'1.3.2'}, Base URL':'')
rootdir: /Users/lang longrong/tool/workespace/sauce_demo_test
plugins: rerunfailures-10.3,html-3.2.0,anyio-4.6.0,playright-0.7.0, testreport-1.1.5,base-ur1-2.1.0, metadata-2.0.4,hydra-core-1.3.2
collected 3 items
tests/test_saucedemo.py::test_invalid_login[user0] PASSED
tests/test_saucedemo.py::test_invalid_login[user1] PASSED
tests/test_saucedemo.py::test_valid_login_and_checkout PASSED
[33%] [66%] [100%]
passed in 20.94s
可以看到,所有测试用例均顺利通过,这充分展示了DeepSeek生成的脚本的有效性。
五、总结
从这次实战可以发现,参照DeepSeek给出的结果,基本无需大幅调整就能让脚本成功执行,极大地提高了自动化实现的效率。而且,DeepSeek在生成脚本过程中给出的思考过程,对我们进行代码实现和用例设计具有重要的参考价值,有兴趣的朋友赶紧让你的vscode集成deepseek吧!