AI 技术在自动化测试中的应用日益成熟,尤其是在测试用例生成方面,能够大幅提升测试工程师的效率。通过 AI 模型(如 OpenAI GPT 系列),我们可以根据代码逻辑、接口定义或需求描述,快速生成高质量的测试用例。
根据代码逻辑,AI 可以自动生成单元测试,包括正常路径、边界条件和异常场景。
通过接口的 API 文档或定义,AI 自动生成请求参数和预期响应。
根据需求文档,AI 可以生成功能测试用例,包括操作步骤和预期结果。
我们以一个简单的数学函数为例,展示如何使用 AI 自动生成测试用例。
def calculate_discount(price, discount_percentage):
"""
计算折扣后的价格。
:param price: 原价
:param discount_percentage: 折扣百分比 (0-100)
:return: 折扣后的价格
"""
if price < 0:
raise ValueError("价格不能为负数")
if not (0 <= discount_percentage <= 100):
raise ValueError("折扣百分比必须在 0 到 100 之间")
return price * (1 - discount_percentage / 100)
利用 OpenAI GPT 或类似模型,通过输入代码生成测试用例。
import openai
# 调用 OpenAI API
def generate_test_case(function_code):
prompt = f"以下是一个 Python 函数代码,请为其生成单元测试用例:\n\n{function_code}\n\n测试用例:"
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}]
)
return response["choices"][0]["message"]["content"]
# 示例调用
if __name__ == "__main__":
function_code = """
def calculate_discount(price, discount_percentage):
\"\"\"
计算折扣后的价格。
:param price: 原价
:param discount_percentage: 折扣百分比 (0-100)
:return: 折扣后的价格
\"\"\"
if price < 0:
raise ValueError("价格不能为负数")
if not (0 <= discount_percentage <= 100):
raise ValueError("折扣百分比必须在 0 到 100 之间")
return price * (1 - discount_percentage / 100)
"""
test_case = generate_test_case(function_code)
print(test_case)
import pytest
from my_module import calculate_discount
def test_calculate_discount():
# 正常场景
assert calculate_discount(100, 10) == 90
assert calculate_discount(200, 50) == 100
assert calculate_discount(0, 0) == 0
# 边界场景
assert calculate_discount(100, 0) == 100 # 无折扣
assert calculate_discount(100, 100) == 0 # 全部折扣
# 异常场景
with pytest.raises(ValueError, match="价格不能为负数"):
calculate_discount(-100, 10)
with pytest.raises(ValueError, match="折扣百分比必须在 0 到 100 之间"):
calculate_discount(100, 110)
with pytest.raises(ValueError, match="折扣百分比必须在 0 到 100 之间"):
calculate_discount(100, -10)
假设我们有一个用户登录接口,其定义如下:
/api/login
POST
{
"username": "string",
"password": "string"
}
{
"status": "success",
"token": "string"
}
{"status": "error", "message": "Invalid credentials"}
我们可以通过输入接口定义,利用 AI 自动生成测试用例代码。
def generate_api_test(api_definition):
prompt = f"以下是一个接口定义,请为其生成接口测试用例:\n\n{api_definition}\n\n测试用例:"
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}]
)
return response["choices"][0]["message"]["content"]
# 示例调用
if __name__ == "__main__":
api_definition = """
URL: /api/login
Method: POST
Request Body:
{
"username": "string",
"password": "string"
}
Response:
{
"status": "success",
"token": "string"
}
Error Response:
{
"status": "error",
"message": "Invalid credentials"
}
"""
test_case = generate_api_test(api_definition)
print(test_case)
import requests
def test_login_api():
url = "http://localhost:5000/api/login"
# 正常场景
response = requests.post(url, json={"username": "admin", "password": "123456"})
assert response.status_code == 200
assert response.json()["status"] == "success"
assert "token" in response.json()
# 错误场景:用户名或密码错误
response = requests.post(url, json={"username": "admin", "password": "wrong_password"})
assert response.status_code == 401
assert response.json()["status"] == "error"
assert response.json()["message"] == "Invalid credentials"
# 错误场景:缺少字段
response = requests.post(url, json={"username": "admin"})
assert response.status_code == 400 # 假设未提供密码会返回 400
假设以下是一个需求描述:
功能点:用户可以通过登录页面登录系统。
def generate_functional_test(requirement):
prompt = f"以下是一个功能需求,请为其生成功能测试用例:\n\n{requirement}\n\n测试用例:"
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}]
)
return response["choices"][0]["message"]["content"]
# 示例调用
if __name__ == "__main__":
requirement = """
用户可以通过登录页面登录系统。
- 用户名和密码必须输入完整,否则提示“用户名或密码不能为空”。
- 用户名或密码错误时,提示“用户名或密码错误”。
- 登录成功后,跳转到主页并显示“欢迎,{用户名}”。
"""
test_case = generate_functional_test(requirement)
print(test_case)
def test_login_functionality():
# 场景 1:用户名和密码为空
assert login("", "") == "用户名或密码不能为空"
# 场景 2:用户名为空
assert login("", "password123") == "用户名或密码不能为空"
# 场景 3:密码为空
assert login("admin", "") == "用户名或密码不能为空"
# 场景 4:用户名或密码错误
assert login("admin", "wrongpassword") == "用户名或密码错误"
# 场景 5:登录成功
result = login("admin", "correctpassword")
assert result == "欢迎,admin"
通过 AI 辅助生成测试用例,我们可以显著提升测试效率和覆盖率,尤其在以下场景中效果尤为突出:
通过 AI 的强大能力,测试团队可以实现从“被动定位问题”到“主动提升质量”的转型,加速开发测试一体化进程!