Phi-3-Mini-128K作品集:用产品PRD文档生成测试用例+边界值分析+自动化脚本框架

1. 引言:当AI产品经理遇上测试工程师

想象一下这个场景:产品经理刚刚交付了一份长达50页的PRD(产品需求文档),里面详细描述了新电商平台“购物车”模块的所有功能。测试团队拿到文档后,需要手动梳理出上百个测试点,包括正常流程、异常场景、边界值……这个过程通常需要几天时间,而且容易遗漏。

现在,有了Phi-3-Mini-128K,这个流程可以彻底改变。这个轻量级但能力强大的AI模型,不仅能理解复杂的PRD文档,还能直接帮你生成结构化的测试用例、精准的边界值分析,甚至搭好自动化测试脚本的框架。

今天,我就带你看看如何用这个纯本地运行的AI工具,把产品文档变成高质量的测试资产。整个过程不需要连接任何云端服务,在你的电脑上就能完成,而且效果会让你惊讶。

2. 为什么选择Phi-3-Mini-128K做测试设计?

在深入具体操作之前,我们先搞清楚一个问题:市面上AI工具那么多,为什么偏偏要用Phi-3-Mini-128K来做测试相关的工作?

2.1 128K上下文是决定性优势

测试设计,尤其是基于PRD的测试分析,最大的挑战就是文档长度。一份稍微复杂点的PRD,动辄几十页、几万字。很多AI模型的上下文窗口只有4K、8K,根本装不下完整文档。

Phi-3-Mini-128K支持128K超长上下文,这是什么概念?相当于它能一次性处理大约10万汉字的内容。这意味着你可以把整份PRD文档直接扔给它,它能看到全局,理解各个功能模块之间的关联,不会出现“看了后面忘了前面”的问题。

2.2 本地运行保障数据安全

测试用例、边界值分析这些内容,往往涉及产品的核心业务逻辑和敏感数据。如果你用在线AI工具处理,等于把公司内部文档上传到了第三方服务器,存在数据泄露风险。

Phi-3-Mini-128K完全在本地运行,所有数据都在你的电脑上处理,不会上传到任何地方。这对于处理商业机密级别的PRD文档来说,是必须满足的前提条件。

2.3 指令跟随能力强

这个模型是基于instruct版本微调的,特别擅长理解并执行复杂的指令。测试设计不是简单的问答,它需要模型按照特定的格式、特定的逻辑结构来输出内容。Phi-3在这方面表现很出色,能很好地理解“生成测试用例”、“分析边界值”、“编写脚本框架”这类指令。

2.4 硬件要求亲民

你不需要昂贵的专业显卡。采用bfloat16半精度优化后,模型只需要7-8GB显存就能运行。这意味着大多数带独立显卡的消费级电脑(比如RTX 3060、RTX 4060)都能流畅使用,降低了技术门槛。

3. 实战第一步:从PRD生成结构化测试用例

理论说再多不如实际动手。我们用一个简化版的“用户登录”功能PRD片段作为例子,看看Phi-3-Mini-128K如何工作。

3.1 准备你的PRD文档

首先,你需要把PRD文档整理成纯文本格式。如果文档是Word或PDF,可以先转换成TXT文件。内容结构尽量清晰,比如:

产品需求文档:用户登录模块

1. 功能概述
用户通过输入用户名和密码登录系统,成功登录后进入个人中心页面。

2. 功能详情
2.1 正常登录流程
- 用户访问登录页面
- 输入已注册的用户名(6-20位字母数字组合)
- 输入密码(8-16位,必须包含字母和数字)
- 点击“登录”按钮
- 系统验证凭证,成功则跳转到个人中心
- 页面显示“欢迎回来,[用户名]”

2.2 异常处理
- 用户名不存在:提示“用户名或密码错误”
- 密码错误:提示“用户名或密码错误”
- 用户名格式错误:实时提示“用户名格式不正确”
- 密码格式错误:实时提示“密码格式不正确”
- 连续5次登录失败:锁定账号30分钟
- 网络异常:提示“网络连接失败,请重试”

2.3 其他需求
- 支持“记住我”功能,勾选后7天内自动登录
- 支持忘记密码链接跳转
- 页面30分钟无操作自动退出登录

3.2 给AI清晰的指令

打开Phi-3-Mini-128K的聊天界面,不要只是简单地说“帮我写测试用例”。要给模型明确的指令,告诉它你想要什么格式、包含哪些信息。

我通常用这样的提示词:

你是一个资深的测试工程师,请根据以下PRD文档内容,为“用户登录”功能设计详细的测试用例。

要求:
1. 使用表格形式输出
2. 表格包含以下列:用例ID、测试场景、前置条件、测试步骤、预期结果、优先级(P0/P1/P2)
3. 优先级定义:P0-核心功能,必须测试;P1-重要功能;P2-边缘场景
4. 覆盖正常流程和所有异常场景
5. 每个测试场景都要有唯一的用例ID,格式为TC_LOGIN_001

PRD文档内容:
[这里粘贴你的PRD文本]

3.3 查看生成结果

发送指令后,Phi-3会开始“思考”(界面显示“Phi-3 正在飞速思考...”),大概几十秒后,你就能看到类似下面的输出:

用例ID测试场景前置条件测试步骤预期结果优先级
TC_LOGIN_001正常登录-正确用户名密码1. 用户已注册
2. 用户未登录
1. 访问登录页
2. 输入正确用户名
3. 输入正确密码
4. 点击登录按钮
1. 跳转到个人中心页
2. 页面显示“欢迎回来,[用户名]”
P0
TC_LOGIN_002异常登录-用户名不存在1. 用户未注册
2. 用户未登录
1. 访问登录页
2. 输入不存在的用户名
3. 输入任意密码
4. 点击登录按钮
显示提示“用户名或密码错误”P0
TC_LOGIN_003异常登录-密码错误1. 用户已注册
2. 用户未登录
1. 访问登录页
2. 输入正确用户名
3. 输入错误密码
4. 点击登录按钮
显示提示“用户名或密码错误”P0
TC_LOGIN_004边界值-用户名长度最小值1. 用户已注册(用户名为6位)
2. 用户未登录
1. 访问登录页
2. 输入6位用户名
3. 输入正确密码
4. 点击登录按钮
登录成功P1
TC_LOGIN_005边界值-用户名长度最大值1. 用户已注册(用户名为20位)
2. 用户未登录
1. 访问登录页
2. 输入20位用户名
3. 输入正确密码
4. 点击登录按钮
登录成功P1

模型通常会生成15-20个测试用例,基本覆盖了PRD中提到的所有场景。你会发现,它不仅能理解“要测试什么”,还能自动补充一些PRD中没有明确写出来、但测试工程师应该考虑的边界场景。

3.4 优化生成结果的小技巧

如果第一次生成的结果不太理想,可以尝试这些方法:

技巧一:提供样例 在指令中加入一个你期望的测试用例样例,模型会学习这个格式:

请参考以下样例格式生成测试用例:

样例:
用例ID: TC_EXAMPLE_001
测试场景: 示例场景
前置条件: 1. 条件A 2. 条件B
测试步骤: 1. 步骤1 2. 步骤2
预期结果: 1. 结果1 2. 结果2
优先级: P0

现在请为[功能名称]生成测试用例...

技巧二:分步骤生成 如果PRD特别长,可以分模块处理:

第一步:请先列出“用户登录”功能的所有测试场景分类
第二步:针对“正常登录流程”分类,生成详细测试用例
第三步:针对“异常处理”分类,生成详细测试用例

技巧三:多轮对话细化 先生成基础用例,然后基于结果继续提问:

你生成的TC_LOGIN_004测试了用户名最小长度,请补充测试用户名长度为5位和7位的情况。

4. 实战第二步:深度边界值分析

测试用例有了,但好的测试设计还需要深入的边界值分析。边界值分析是发现隐藏bug的关键,但手动分析耗时耗力。Phi-3在这方面能帮大忙。

4.1 什么是边界值分析?

简单说,就是测试输入值的边界情况。比如:

  • 用户名长度要求6-20位,那么就要测试5位、6位、7位、19位、20位、21位
  • 密码要求8-16位,就要测试7位、8位、9位、15位、16位、17位
  • 登录失败锁定是5次,就要测试4次、5次、6次

4.2 让AI做边界值分析

给Phi-3这样的指令:

基于之前讨论的“用户登录”功能PRD和测试用例,请进行详细的边界值分析。

要求:
1. 识别所有存在边界条件的输入项
2. 对每个输入项,列出其有效边界和无效边界
3. 为每个边界值设计具体的测试数据
4. 说明每个边界测试想要验证什么

请用表格形式输出,表格列包括:输入项、边界条件、有效边界值、无效边界值、测试目的。

4.3 分析结果示例

Phi-3会生成这样的分析表格:

输入项边界条件有效边界值无效边界值测试目的
用户名长度6-20位字符6位(最小有效值)
20位(最大有效值)
5位(刚好小于最小值)
21位(刚好大于最大值)
验证系统正确处理长度边界
密码长度8-16位字符8位(最小有效值)
16位(最大有效值)
7位(刚好小于最小值)
17位(刚好大于最大值)
验证密码长度限制生效
登录失败次数5次锁定4次失败(未触发锁定)
5次失败(触发锁定)
6次失败(锁定后继续尝试)验证账号锁定机制
“记住我”有效期7天自动登录第6天23:59(仍有效)
第7天00:01(应失效)
第8天(超期后尝试)验证自动登录有效期

这个分析比人工做的更系统、更全面。AI不会因为“觉得这个边界不重要”而跳过,它会严格检查每个有数字限制的地方。

4.4 结合等价类划分

边界值分析通常和等价类划分一起使用。你可以进一步让Phi-3做等价类分析:

请对“用户登录”功能的输入项进行等价类划分。

要求:
1. 识别每个输入项的有效等价类和无效等价类
2. 为每个等价类提供测试数据示例
3. 说明选择这些等价类的原因

模型会输出类似内容:

用户名输入框等价类划分:
1. 有效等价类
   - 6-20位字母数字组合:testuser123
   - 包含下划线或连字符(如果允许):user_name
   
2. 无效等价类
   - 长度小于6位:abc12
   - 长度大于20位:thisisaverylongusernamethatexceedslimit
   - 包含特殊字符(如果不允许):user@name
   - 全角字符:username
   - SQL注入尝试:admin'--

5. 实战第三步:生成自动化测试脚本框架

手动测试覆盖了,边界值分析了,下一步就是自动化。但写自动化测试脚本很耗时,特别是搭建框架和编写基础用例。Phi-3能帮你生成可用的脚本框架。

5.1 选择测试框架

首先决定用什么测试框架。常见的Python测试框架有:

  • pytest:目前最流行,功能强大,插件丰富
  • unittest:Python标准库,无需额外安装
  • Playwright:用于Web UI自动化测试
  • Selenium:传统的Web自动化框架

你可以告诉Phi-3你的选择,或者让它推荐。

5.2 生成pytest测试脚本框架

给AI这样的指令:

基于之前生成的“用户登录”测试用例TC_LOGIN_001到TC_LOGIN_005,请编写pytest自动化测试脚本框架。

要求:
1. 使用pytest框架
2. 使用Page Object模式
3. 包含必要的fixture(如浏览器初始化、用户数据准备)
4. 包含测试用例的实现骨架,用注释标出需要补充的部分
5. 包含简单的断言示例
6. 代码要有清晰的注释

假设我们测试的是一个Web应用,使用Playwright进行浏览器操作。

5.3 查看生成的代码框架

Phi-3会生成结构清晰的Python代码:

"""
用户登录功能自动化测试脚本
基于pytest + Playwright + Page Object模式
"""

import pytest
from playwright.sync_api import Page, expect
import time

# ----------------------------
# Page Object类:登录页面
# ----------------------------
class LoginPage:
    """登录页面对象,封装所有页面元素和操作"""
    
    def __init__(self, page: Page):
        self.page = page
        self.username_input = page.locator("#username")
        self.password_input = page.locator("#password")
        self.login_button = page.locator("#login-btn")
        self.error_message = page.locator(".error-message")
        self.welcome_message = page.locator(".welcome-text")
    
    def navigate(self):
        """导航到登录页面"""
        self.page.goto("https://example.com/login")
    
    def fill_username(self, username: str):
        """填写用户名"""
        self.username_input.fill(username)
    
    def fill_password(self, password: str):
        """填写密码"""
        self.password_input.fill(password)
    
    def click_login(self):
        """点击登录按钮"""
        self.login_button.click()
    
    def get_error_text(self) -> str:
        """获取错误提示文本"""
        return self.error_message.inner_text()
    
    def get_welcome_text(self) -> str:
        """获取欢迎文本"""
        return self.welcome_message.inner_text()

# ----------------------------
# pytest fixture
# ----------------------------
@pytest.fixture(scope="function")
def login_page(page: Page):
    """提供登录页面实例"""
    login_page = LoginPage(page)
    login_page.navigate()
    return login_page

@pytest.fixture(scope="session")
def test_user():
    """测试用户数据"""
    return {
        "valid_username": "testuser123",
        "valid_password": "Pass123456",
        "invalid_username": "nonexistent",
        "invalid_password": "WrongPass123"
    }

# ----------------------------
# 测试用例实现
# ----------------------------
class TestLoginFunctionality:
    """用户登录功能测试类"""
    
    def test_normal_login_success(self, login_page, test_user):
        """
        测试用例TC_LOGIN_001: 正常登录-正确用户名密码
        预期: 登录成功,跳转到个人中心,显示欢迎信息
        """
        # 测试步骤
        login_page.fill_username(test_user["valid_username"])
        login_page.fill_password(test_user["valid_password"])
        login_page.click_login()
        
        # 等待页面跳转
        time.sleep(2)  # TODO: 替换为更智能的等待机制
        
        # 验证预期结果
        # TODO: 验证是否跳转到个人中心页面
        # TODO: 验证欢迎信息包含用户名
        
        # 示例断言
        welcome_text = login_page.get_welcome_text()
        assert test_user["valid_username"] in welcome_text
        print(f"测试通过: 正常登录成功,欢迎信息: {welcome_text}")
    
    def test_login_username_not_exist(self, login_page, test_user):
        """
        测试用例TC_LOGIN_002: 异常登录-用户名不存在
        预期: 显示错误提示“用户名或密码错误”
        """
        # 测试步骤
        login_page.fill_username(test_user["invalid_username"])
        login_page.fill_password(test_user["valid_password"])
        login_page.click_login()
        
        # 验证预期结果
        error_text = login_page.get_error_text()
        assert "用户名或密码错误" in error_text
        print(f"测试通过: 用户名不存在时显示正确错误提示: {error_text}")
    
    def test_login_wrong_password(self, login_page, test_user):
        """
        测试用例TC_LOGIN_003: 异常登录-密码错误
        预期: 显示错误提示“用户名或密码错误”
        """
        # 测试步骤
        login_page.fill_username(test_user["valid_username"])
        login_page.fill_password(test_user["invalid_password"])
        login_page.click_login()
        
        # 验证预期结果
        error_text = login_page.get_error_text()
        assert "用户名或密码错误" in error_text
        print(f"测试通过: 密码错误时显示正确错误提示: {error_text}")
    
    def test_username_length_min_boundary(self, login_page):
        """
        测试用例TC_LOGIN_004: 边界值-用户名长度最小值(6位)
        预期: 登录成功
        """
        # 准备测试数据
        min_length_username = "abc123"  # 6位用户名
        
        # TODO: 需要先注册一个6位用户名的测试账号
        # TODO: 实现测试步骤和断言
        
        print("测试骨架: 用户名最小长度边界测试")
    
    def test_username_length_max_boundary(self, login_page):
        """
        测试用例TC_LOGIN_005: 边界值-用户名长度最大值(20位)
        预期: 登录成功
        """
        # 准备测试数据
        max_length_username = "a" * 20  # 20位用户名
        
        # TODO: 需要先注册一个20位用户名的测试账号
        # TODO: 实现测试步骤和断言
        
        print("测试骨架: 用户名最大长度边界测试")

# ----------------------------
# 边界值测试类
# ----------------------------
class TestLoginBoundaryValues:
    """边界值测试类"""
    
    @pytest.mark.parametrize("username_length", [5, 6, 7, 19, 20, 21])
    def test_username_length_boundaries(self, login_page, username_length):
        """
        参数化测试: 用户名长度边界值
        5位(无效), 6位(有效), 7位(有效), 19位(有效), 20位(有效), 21位(无效)
        """
        username = "a" * username_length
        
        # 测试步骤
        login_page.fill_username(username)
        login_page.fill_password("Test1234")
        login_page.click_login()
        
        # 根据长度判断预期结果
        if username_length in [5, 21]:  # 无效长度
            error_text = login_page.get_error_text()
            # TODO: 验证具体的错误提示
            print(f"长度{username_length}位: 预期失败,实际错误: {error_text}")
        else:  # 有效长度
            # TODO: 验证登录成功
            print(f"长度{username_length}位: 预期成功")

if __name__ == "__main__":
    print("这是一个测试脚本框架,需要根据实际项目补充实现细节")
    print("运行命令: pytest test_login.py -v")

5.4 代码框架的价值

这个生成的框架已经包含了:

  1. Page Object模式:将页面元素和操作封装成类,提高代码可维护性
  2. pytest fixture:提供了测试准备和清理的机制
  3. 测试类结构:按功能组织测试用例
  4. 参数化测试示例:展示了如何用@pytest.mark.parametrize测试多组数据
  5. 清晰的TODO注释:标出了需要人工补充的部分

虽然它不能直接运行(因为需要补充具体的页面元素选择器和测试数据),但已经完成了70%的框架搭建工作。测试工程师只需要:

  • 根据实际页面HTML结构,调整元素选择器(如#username、.error-message)
  • 准备真实的测试账号和数据
  • 补充具体的断言逻辑
  • 优化等待机制(替换time.sleep)

6. 进阶技巧:处理复杂PRD和定制输出

6.1 处理大型PRD文档

如果PRD文档特别大,超过了128K上下文怎么办?可以分段处理:

第一步:请先阅读以下PRD文档的“用户管理模块”部分,并总结核心功能点
[粘贴第一部分PRD]

第二步:基于刚才理解的功能点,为“用户注册”功能生成测试用例
[不需要再次粘贴PRD,模型会记住上下文]

第三步:现在请阅读“商品管理模块”部分
[粘贴第二部分PRD]

第四步:为“商品上架”功能生成测试用例

Phi-3的128K上下文能记住很长的对话历史,你可以像和同事讨论一样,分步骤、分模块地处理大型文档。

6.2 定制输出格式

不同的团队可能有不同的测试用例管理工具(如TestRail、Jira、Excel)。你可以让Phi-3生成特定格式的输出:

请将测试用例导出为CSV格式,列顺序为:ID,标题,前置条件,步骤,预期结果,优先级,模块,子模块

或者

请生成适合导入TestRail的JSON格式测试用例。

6.3 生成测试数据

除了测试用例,你还可以让AI生成测试数据:

请为“用户登录”功能生成测试数据,包括:
1. 10组有效的用户名密码组合
2. 5组各种格式无效的用户名
3. 5组各种格式无效的密码
4. SQL注入攻击测试字符串
5. XSS攻击测试字符串

6.4 评估测试覆盖率

让AI帮你分析测试设计的完整性:

基于PRD文档和我已生成的测试用例,请分析:
1. 功能覆盖率:已覆盖PRD中多少百分比的功能点?
2. 场景覆盖率:正常流程、异常场景、边界值的覆盖情况
3. 风险点识别:哪些高风险区域测试还不够充分?
4. 补充建议:还需要增加哪些测试用例?

7. 实际工作流建议

在实际工作中,我建议这样整合Phi-3到你的测试流程中:

7.1 早期介入:PRD评审阶段

  • 产品经理写完PRD初稿后,立即用Phi-3生成第一版测试用例
  • 在PRD评审会上,这些用例可以作为讨论基础,帮助发现需求不清晰或遗漏的地方
  • 提前识别测试难点和风险点

7.2 测试设计阶段

  • 基于最终版PRD,用Phi-3生成完整的测试用例集
  • 进行边界值分析和等价类划分
  • 输出结构化的测试设计文档

7.3 自动化准备阶段

  • 生成自动化测试脚本框架
  • 生成测试数据
  • 生成API测试的请求示例(如果涉及API)

7.4 持续维护

  • 当PRD变更时,用Phi-3分析变更影响范围
  • 生成新增功能的测试用例
  • 更新现有测试用例

8. 总结

通过这个完整的实践,你应该能感受到Phi-3-Mini-128K在测试设计方面的强大能力。它不是一个简单的聊天工具,而是一个能真正提升工作效率的AI助手。

核心价值总结:

  1. 大幅提升测试设计效率:从几天缩短到几小时
  2. 提高测试覆盖率:系统化的边界值分析和等价类划分
  3. 保证一致性:统一的测试用例格式和标准
  4. 降低入门门槛:新手测试工程师也能产出专业的设计
  5. 促进团队协作:生成的文档和代码框架便于团队评审和使用

使用建议:

  1. 从简单功能开始:先尝试登录、注册等相对独立的功能
  2. 提供清晰的PRD:AI的输出质量很大程度上取决于输入质量
  3. 学会给好指令:明确告诉AI你想要什么格式、包含什么内容
  4. 人工审核和调整:AI生成的内容需要测试工程师审核和优化
  5. 建立自己的提示词库:积累针对不同测试场景的有效提示词

Phi-3-Mini-128K的本地运行特性,让它特别适合处理包含敏感信息的PRD文档。你不需要担心数据泄露,也不需要依赖网络连接。只要有一台带GPU的电脑,就能拥有一个24小时在线的测试设计助手。

测试工作的未来,一定是人机协作的。AI处理重复性、系统性的分析工作,人类专注于创造性、策略性的思考。Phi-3-Mini-128K就是我们向这个未来迈出的坚实一步。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

更多推荐