Janus-Pro-7B自动化测试脚本生成:基于自然语言描述的UI/接口测试
Janus-Pro-7B自动化测试脚本生成:基于自然语言描述的UI/接口测试
作为一名在测试领域摸爬滚打多年的工程师,我深知编写自动化测试脚本的痛。每次面对一个新功能,从理解需求、设计用例,再到一行行敲出Selenium或Requests的代码,整个过程耗时耗力,还容易出错。尤其是当需求频繁变更时,维护脚本更是让人头疼。
最近,我尝试用Janus-Pro-7B大模型来解决这个痛点,效果出乎意料。简单来说,你只需要用大白话描述测试场景,比如“用户输入正确的账号密码,点击登录按钮后,页面应该跳转到首页”,它就能帮你生成一个可运行的自动化测试脚本框架。这就像有了一个懂测试、会编码的AI助手,让测试脚本的编写效率提升了好几倍。
这篇文章,我就来分享如何将Janus-Pro-7B应用到实际的UI和接口自动化测试中,让你也能快速上手,把重复的编码工作交给AI,自己专注于更重要的测试设计和结果分析。
1. 为什么需要AI来生成测试脚本?
在深入具体操作之前,我们先聊聊为什么这件事值得做。传统的自动化测试脚本编写,对测试工程师的要求其实不低。你不仅要懂业务、懂测试,还要熟练掌握至少一门编程语言(比如Python)以及相关的测试框架和库(比如Selenium, Requests, Pytest)。
这个过程有几个明显的瓶颈:
- 学习成本高:新手需要花大量时间学习编程和框架。
- 编写效率低:即使是老手,编写一个完整的测试用例脚本也需要不少时间。
- 维护成本高:页面元素一变,接口字段一改,对应的脚本就得跟着改,牵一发而动全身。
- 容易出错:手动编写代码,难免会有拼写错误、逻辑遗漏,调试又得花时间。
而Janus-Pro-7B这类大模型带来的改变是根本性的。它把“用自然语言描述测试意图”和“生成结构化代码”这两件事连接了起来。测试工程师的核心价值在于设计测试用例、分析测试结果和保障产品质量,而不是机械地翻译需求为代码。让AI承担代码生成的重复劳动,工程师则回归到更具创造性和判断力的工作中,这才是技术提效的正确方向。
2. 环境准备与模型调用
开始之前,我们需要准备好Python环境和调用Janus-Pro-7B模型的基础设置。整个过程并不复杂,跟着步骤走很快就能搞定。
2.1 基础环境搭建
首先,确保你的电脑上安装了Python(建议3.8及以上版本)。然后,我们通过pip安装一些必要的库。打开你的终端或命令行工具,执行以下命令:
pip install requests
这里我们主要安装requests库,用于后续通过API方式调用模型。如果你打算在本地部署模型,可能还需要安装transformers、torch等深度学习框架,但为了最简单快速地体验,我们推荐使用云服务提供的API,省去配置环境的麻烦。
2.2 获取模型API访问权限
目前,许多平台提供了Janus-Pro-7B等大模型的API服务。你需要注册一个相关平台的账号(例如一些国内的AI开放平台或云服务商),并获取你的API Key。这个过程通常很简单,就像申请一个普通的网络服务一样。
拿到API Key后,请妥善保管,它相当于调用模型的密码。我们通常会把它保存在环境变量中,而不是直接写在代码里,这样更安全。
# 在Linux/Mac的终端里设置环境变量
export JANUS_API_KEY='你的实际API密钥'
# 在Windows的PowerShell里设置环境变量
$env:JANUS_API_KEY='你的实际API密钥'
2.3 编写一个简单的模型调用函数
有了API Key,我们就可以写一个Python函数来和Janus-Pro-7B对话了。下面是一个最基础的示例:
import os
import requests
import json
def ask_janus(prompt):
"""
向Janus-Pro-7B模型发送提问并获取回答。
:param prompt: 你的问题或指令(字符串)
:return: 模型返回的文本内容
"""
api_key = os.getenv('JANUS_API_KEY') # 从环境变量读取密钥
if not api_key:
return "错误:请设置JANUS_API_KEY环境变量。"
# 这里需要替换成你使用的真实API端点URL
api_url = "https://api.example.com/v1/chat/completions"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
# 构建请求数据,这里的消息格式遵循常见Chat API格式
data = {
"model": "janus-pro-7b", # 指定模型名称
"messages": [
{"role": "user", "content": prompt}
],
"temperature": 0.1, # 温度参数设低一点,让生成结果更确定、更专业
"max_tokens": 1500 # 设置最大生成长度,脚本可能较长
}
try:
response = requests.post(api_url, headers=headers, data=json.dumps(data))
response.raise_for_status() # 检查请求是否成功
result = response.json()
# 从返回的JSON结构中提取模型回复的内容
return result['choices'][0]['message']['content']
except requests.exceptions.RequestException as e:
return f"请求出错:{e}"
except (KeyError, IndexError) as e:
return f"解析响应出错:{e}"
# 测试一下连接
if __name__ == "__main__":
test_prompt = "你好,请用Python写一个打印‘Hello, World!’的程序。"
answer = ask_janus(test_prompt)
print("模型回复:")
print(answer)
运行这段代码,如果一切顺利,你会看到模型返回了一个简单的Python程序。这说明你的环境已经打通,可以开始让AI帮你写测试脚本了。
3. 用自然语言生成UI自动化测试脚本
UI自动化测试,我们通常用Selenium。现在,我们试试只告诉Janus-Pro-7B我们要测试什么,让它来出代码。
3.1 一个登录功能的测试案例
假设我们要测试一个网页的登录功能。经典的测试用例是:“验证用户使用正确的用户名和密码可以成功登录,并跳转到首页。”
以前,我们需要自己查页面元素ID,写查找、输入、点击、断言等一系列代码。现在,我们可以把这段描述直接丢给AI。
# 构建一个更具体的提示词(Prompt)
ui_test_prompt = """
你是一个资深的测试开发工程师。请根据以下测试场景描述,生成对应的Python自动化测试脚本。
要求使用Selenium库和Pytest框架。
测试场景描述:
测试用户登录功能:打开登录页面,在用户名输入框输入“test_user”,在密码输入框输入“secure_password”,点击登录按钮。验证登录成功后,页面会跳转到首页(https://www.example.com/home),并且页面标题包含“首页”字样。
请生成完整的、可运行的测试代码。假设登录页面的URL是 https://www.example.com/login。
请使用Chrome浏览器,并合理处理元素定位(假设元素ID分别为‘username’, ‘password’, ‘login-btn’)。
在代码中添加必要的注释。
"""
ui_test_script = ask_janus(ui_test_prompt)
print("生成的UI测试脚本:")
print(ui_test_script)
运行后,Janus-Pro-7B很可能会生成类似下面这样的代码框架:
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class TestLogin:
"""登录功能测试类"""
@pytest.fixture(scope="function")
def driver(self):
"""初始化Chrome驱动,测试结束后关闭"""
driver = webdriver.Chrome()
driver.maximize_window()
yield driver
driver.quit()
def test_successful_login(self, driver):
"""测试使用正确的用户名和密码可以成功登录"""
# 1. 打开登录页面
driver.get("https://www.example.com/login")
# 2. 定位并输入用户名
username_input = driver.find_element(By.ID, "username")
username_input.clear()
username_input.send_keys("test_user")
# 3. 定位并输入密码
password_input = driver.find_element(By.ID, "password")
password_input.clear()
password_input.send_keys("secure_password")
# 4. 定位并点击登录按钮
login_button = driver.find_element(By.ID, "login-btn")
login_button.click()
# 5. 等待跳转并验证新页面
# 等待直到URL变成首页,最多等10秒
WebDriverWait(driver, 10).until(
EC.url_to_be("https://www.example.com/home")
)
# 6. 断言当前URL是首页
assert driver.current_url == "https://www.example.com/home"
# 7. 断言页面标题包含“首页”
assert "首页" in driver.title
print("登录成功,并正确跳转至首页。")
if __name__ == "__main__":
pytest.main(["-v", __file__])
看,一个结构清晰、注释完整、甚至包含了等待和断言的测试脚本框架就生成了。你拿到这个脚本后,只需要做几件事:
- 检查元素定位:确认生成的ID(
username,password,login-btn)是否和实际网页一致。如果不一致,修改成正确的定位方式(如By.NAME, By.XPATH等)。 - 填充测试数据:将
test_user和secure_password替换成你测试环境中有效的账号密码。 - 配置WebDriver:确保你的电脑上有Chrome浏览器和对应版本的ChromeDriver,或者将
webdriver.Chrome()改为你使用的浏览器驱动。
原本可能需要半小时查阅文档和编写调试的工作,现在几分钟就得到了一个高质量的基础版本。
3.2 处理更复杂的场景
AI不仅能处理简单的线性操作,对于稍复杂的场景也能给出不错的框架。例如,描述一个“在商品搜索框输入关键词,筛选价格区间,验证结果列表正确”的测试。
complex_ui_prompt = """
生成一个Selenium测试脚本:测试电商网站搜索筛选功能。
步骤:
1. 访问网站首页。
2. 在顶部搜索框输入关键词“无线耳机”。
3. 点击搜索按钮。
4. 在结果页左侧,找到价格筛选,选择“100-500元”区间。
5. 点击“确定”或“筛选”按钮。
6. 验证:页面显示的所有商品标题都包含“无线耳机”,且商品价格都在100元到500元之间(假设价格元素class为‘price’)。
请合理假设元素定位方式,并添加必要的等待和异常处理。
"""
将这样的提示词发送给模型,它同样能生成一个包含循环判断、价格解析等逻辑的脚本雏形。你的工作就从“从零开始写代码”变成了“审查和优化AI生成的代码”,思维负担大大减轻。
4. 用自然语言生成接口自动化测试脚本
对于接口测试,我们常用requests库。用自然语言描述接口测试用例,对Janus-Pro-7B来说更是得心应手。
4.1 一个用户查询接口的测试案例
假设我们要测试一个用户信息查询的GET接口。
api_test_prompt = """
你是一个资深的测试开发工程师。请根据以下接口测试场景,生成对应的Python自动化测试脚本。
要求使用requests库和Pytest框架。
接口信息:
- 方法:GET
- URL:https://api.example.com/v1/user/{user_id}
- 请求头:需要包含 ‘Authorization: Bearer {access_token}’
- 路径参数:{user_id} 为用户ID
测试场景描述:
测试用例1:使用有效的access_token和存在的user_id(例如123)调用接口,预期返回HTTP状态码200,并且响应体JSON中包含正确的用户信息(例如包含‘id’、‘name’、‘email’字段)。
测试用例2:使用无效的access_token调用接口,预期返回HTTP状态码401(未授权)。
测试用例3:使用有效的token但不存在user_id(例如99999)调用接口,预期返回HTTP状态码404(未找到)。
请生成完整的测试代码,包含必要的断言和清晰的注释。
"""
api_test_script = ask_janus(api_test_prompt)
print("生成的接口测试脚本:")
print(api_test_script)
模型生成的代码可能会是这样:
import pytest
import requests
BASE_URL = "https://api.example.com/v1/user"
VALID_TOKEN = "your_valid_access_token_here" # 请替换为有效的token
INVALID_TOKEN = "invalid_token"
EXISTING_USER_ID = 123
NON_EXISTENT_USER_ID = 99999
class TestUserAPI:
"""用户信息查询接口测试类"""
def test_get_user_with_valid_token_and_id(self):
"""测试用例1:有效token和用户ID,应成功返回用户信息"""
url = f"{BASE_URL}/{EXISTING_USER_ID}"
headers = {"Authorization": f"Bearer {VALID_TOKEN}"}
response = requests.get(url, headers=headers)
# 断言状态码为200
assert response.status_code == 200, f"预期状态码200,实际为{response.status_code}"
# 断言响应体为JSON格式并包含所需字段
user_data = response.json()
assert isinstance(user_data, dict)
assert "id" in user_data
assert "name" in user_data
assert "email" in user_data
# 可选:进一步断言id与请求的一致
assert user_data["id"] == EXISTING_USER_ID
print(f"测试通过。获取到用户:{user_data.get('name')}")
def test_get_user_with_invalid_token(self):
"""测试用例2:无效token,应返回401未授权"""
url = f"{BASE_URL}/{EXISTING_USER_ID}"
headers = {"Authorization": f"Bearer {INVALID_TOKEN}"}
response = requests.get(url, headers=headers)
# 断言状态码为401
assert response.status_code == 401, f"预期状态码401,实际为{response.status_code}"
print("测试通过。无效token正确返回401。")
def test_get_user_with_nonexistent_id(self):
"""测试用例3:有效token但用户不存在,应返回404"""
url = f"{BASE_URL}/{NON_EXISTENT_USER_ID}"
headers = {"Authorization": f"Bearer {VALID_TOKEN}"}
response = requests.get(url, headers=headers)
# 断言状态码为404
assert response.status_code == 404, f"预期状态码404,实际为{response.status_code}"
print("测试通过。不存在的用户ID正确返回404。")
if __name__ == "__main__":
pytest.main(["-v", __file__])
生成的脚本结构非常标准,包含了正向和反向用例,断言清晰。你只需要做两件事:一是把VALID_TOKEN换成你们项目真实的测试令牌,二是根据实际接口响应规范,微调一下断言的细节(比如字段名、嵌套结构等)。
4.2 生成更复杂的POST接口测试
对于带请求体的POST接口(比如创建订单),描述清楚请求体结构即可。
post_api_prompt = """
生成一个测试‘创建订单’接口的脚本。
接口:POST https://api.example.com/v1/orders
请求头:Content-Type: application/json, Authorization: Bearer {token}
请求体JSON示例:{"product_id": 456, "quantity": 2, "address": "测试地址"}
成功响应:状态码201,返回的JSON包含订单号(‘order_id’)和总价(‘total_price’)。
测试场景:使用有效token和正确请求体调用,验证响应码和返回字段。
请生成代码,并处理可能出现的网络异常。
同样,Janus-Pro-7B能够理解这些需求,生成包含requests.post、json.dumps、以及针对响应体特定字段断言的完整测试函数。
5. 实践技巧与注意事项
在实际使用中,为了让AI生成更精准、更实用的脚本,有几个小技巧值得分享。
第一,描述要具体、结构化。 不要只说“测试登录功能”。最好拆解成步骤:“1. 打开某URL。2. 找到某元素并输入A。3. 找到某元素并输入B。4. 点击某按钮。5. 验证页面是否跳转到某URL或出现某元素。” 结构越清晰,AI生成的代码逻辑也越清晰。
第二,在Prompt中指定技术栈和框架。 明确告诉AI你要用Selenium with Python还是Cypress with JavaScript,要用Pytest还是unittest。这能确保生成的代码是你想要的风格。
第三,生成的代码是“框架”和“初稿”。 AI目前还无法百分之百理解你公司内部项目的所有细节,比如确切的元素选择器、独有的项目配置、复杂的测试数据准备逻辑。因此,它生成的是高质量的、符合通用规范的“半成品”。你需要扮演“代码审查者”和“最终集成者”的角色,将其融入你的项目结构,补全环境变量、数据驱动等部分。
第四,注意测试数据的安全性。 切勿在Prompt或最终提交的代码中写入真实的用户名、密码、API密钥、令牌等敏感信息。AI生成代码时可以使用占位符(如YOUR_USERNAME),你本地运行时再替换为从安全位置(如环境变量、配置文件)读取的真实数据。
第五,组合使用,提升效率。 你可以让AI先生成一个基础脚本,然后基于这个脚本,继续用自然语言让它添加新功能,比如“在上面的登录测试里,增加一个‘记住我’复选框的测试”,或者“给这个接口测试加上参数化的数据,用三组不同的产品ID和数量来测试”。通过多轮对话,逐步完善你的测试套件。
6. 总结
尝试用Janus-Pro-7B来辅助生成自动化测试脚本后,我最大的感受是,它确实把测试工程师从大量重复、机械的编码劳动中解放了出来。以前写一个脚本,一半时间在查文档和调试语法错误,现在这部分工作被极大地压缩了。你可以把更多精力放在设计更全面的测试场景、分析更复杂的测试结果、以及思考如何提升整体的测试覆盖率上。
当然,它不是一个“一键生成、无需过脑”的魔法。它对测试工程师的要求从“熟练编码”转变为了“精准描述需求”和“高效审查代码”。你需要清楚地知道要测什么、怎么测,然后才能指挥AI写出正确的脚本。这更像是一种人机协作的新模式。
如果你也在做UI或接口自动化测试,不妨试试这个方法。从一个简单的登录测试或查询接口开始,用自然语言把你的测试用例描述给Janus-Pro-7B,看看它生成的脚本框架。我相信,经过你稍加调整和填充,一个可运行的测试脚本很快就能投入使用。这个过程,本身就是一次有趣的、高效的提效实践。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
更多推荐



所有评论(0)