测试工程师如何理解和使用Agent智能体
通过掌握AI智能体的概念、原理和应用,测试工程师可以在AI赋能的软件测试新时代中保持竞争力,并提供更高质量的测试服务。
1. 什么是Agent
在人工智能领域,Agent(智能体)是近年来发展迅速的关键概念。OpenAI的研究主管Lilian Weng给出了一个简明而全面的定义:Agent = 大模型(LLM)+ 规划(Planning)+ 记忆(Memory)+ 工具使用(Tool Use)。这个定义揭示了现代AI智能体的核心组成部分,让我们得以理解它们如何超越了传统的自动化系统。
智能体是一种能够自主感知环境、进行决策并采取行动的AI系统。与仅用于生成文本的大型语言模型不同,智能体是一个集成了多种功能的系统,它不仅能理解和生成自然语言,还能规划复杂任务、存储并利用历史信息、使用外部工具来扩展其能力范围。这种集成使得智能体能够在复杂、动态的环境中自主运作,解决多步骤问题,并随时间积累经验和知识。
1.1 Agent的核心组成
让我们更详细地探讨Lilian Weng定义中的四个关键组成部分:
-
大型语言模型(LLM):作为智能体的"大脑",LLM提供了理解和生成自然语言的基础能力。它使智能体能够处理各种形式的输入,从文本说明到代码,并生成相应的输出。在软件测试中,这种能力使智能体能够理解测试需求,生成测试用例,并解释测试结果。
-
规划(Planning):规划功能使智能体能够将复杂任务分解为可管理的子目标,制定执行策略,并在执行过程中进行调整。规划方法从简单的链式思考(Chain-of-Thought)到更复杂的思维树(Tree of Thoughts)不等,甚至包括结合传统规划算法的方式(LLM+P)。这使得智能体能够处理需要多步骤、多阶段执行的复杂测试场景。
-
记忆(Memory):智能体的记忆系统分为短期记忆和长期记忆:
记忆使智能体能够在测试过程中保留重要信息,记住之前的测试步骤和结果,以及随时间推移学习和适应应用程序的变化。
-
短期记忆:通过上下文学习实现,处理时间上相近的信息,受限于模型的上下文窗口大小。
-
长期记忆:通过外部向量存储实现,允许智能体存储大量信息供将来检索,突破了上下文窗口的限制。
-
-
工具使用(Tool Use):智能体可以学习调用外部API或工具(如网络搜索、代码执行工具、数据库查询等),以补充其内部知识并扩展其能力。在测试中,这意味着智能体可以与测试框架、代码库、CI/CD管道等交互,执行实际的测试操作。
这四个组成部分的协同工作使AI智能体成为功能强大的系统,能够自主执行复杂任务,包括软件测试中的各种挑战性工作。
2. Agent可以做什么
AI智能体通过其自主性、适应性和工具使用能力解决了许多传统系统面临的挑战。在软件开发和测试领域,智能体特别擅长处理以下问题:
2.1 解决复杂的认知任务
智能体能够处理需要理解上下文、解释模糊指令和做出判断的复杂认知任务。这使它们能够:
-
理解自然语言测试需求,并将其转换为具体的测试计划和用例
-
分析测试失败的根本原因,超越简单的错误报告
-
优先处理测试用例,基于风险评估和历史数据
-
在测试过程中做出动态决策,如何继续或修改测试计划
2.2 处理非结构化数据
与传统系统不同,AI智能体可以有效地处理非结构化数据:
-
从用户故事、需求文档和开发者评论中提取测试需求
-
分析错误日志和堆栈跟踪以识别模式
-
理解和测试自然语言接口,如聊天机器人或语音系统
-
评估用户界面的可用性和一致性,即使在设计变化时
2.3 自主学习和适应
智能体的一个关键优势是能够从经验中学习并适应变化:
-
通过分析历史测试数据来改进测试策略
-
自动调整测试脚本以适应UI或API变更
-
识别新的测试边界情况,基于之前测试运行的结果
-
随着时间的推移,优化测试覆盖率和效率
2.4 多工具集成和协调
智能体能够协调多个工具和系统的使用:
-
在不同的测试框架和环境中执行测试
-
整合多种测试方法(单元测试、集成测试、端到端测试等)
-
连接测试结果与问题跟踪系统
-
在CI/CD流程中自动化测试执行和报告
通过解决这些问题,AI智能体正在彻底改变软件测试方法,使测试过程更加高效、适应性强且全面。
3. Agent与传统RPA的区别
虽然AI智能体和传统的机器人流程自动化(RPA)都旨在通过自动化提高效率,但它们在设计理念、能力范围和适用场景上存在显著差异。
3.1 基本设计理念
RPA(机器人流程自动化):
-
基于预定义的规则和固定工作流程
-
采用"如果这样,则那样"的逻辑,类似于逐步执行的配方
-
设计用于遵循严格的程序化步骤
-
需要明确定义每个可能的场景和例外情况
AI智能体:
-
基于理解和适应能力
-
采用自然语言指令和上下文理解
-
能够根据环境变化动态调整策略
-
能处理模糊情况并做出判断
3.2 数据处理能力
RPA:
-
擅长处理结构化数据(如电子表格、数据库记录)
-
严格按照预定义的数据格式和位置操作
-
对数据异常或格式变化较为敏感
-
数据提取和转换需要明确的映射规则
AI智能体:
-
能够处理非结构化数据(如文本文档、电子邮件、图像)
-
通过自然语言处理和机器学习理解内容
-
适应数据格式和位置的变化
-
能够从多种来源提取相关信息
3.3 适应性与灵活性
RPA:
-
在固定、重复性工作流程中表现出色
-
对环境变化反应有限,通常需要人工干预
-
需要频繁维护以适应应用程序更新
-
无法自主解决未预期的问题
AI智能体:
-
能够适应变化的环境和需求
-
随着时间的推移学习和改进其性能
-
能够处理例外情况和新场景
-
具有一定程度的自主问题解决能力
3.4 决策能力
RPA:
-
严格按照预编程决策树执行
-
缺乏真正的认知或判断能力
-
在遇到未定义情况时往往会失败
-
决策逻辑完全依赖于人工预定义
AI智能体:
-
能够根据上下文和历史数据做出决策
-
具备推理能力和概率判断
-
可以处理模糊需求和不完整信息
-
能够解释其决策过程和理由
3.5 应用场景对比
RPA最适合:
-
高度结构化、重复性的任务
-
有明确规则和稳定流程的工作
-
需要大批量快速处理的场景
-
系统间数据迁移和集成
AI智能体最适合:
-
需要理解和解释的复杂任务
-
涉及动态判断和决策的工作
-
处理非结构化或半结构化数据
-
需要适应变化和学习的场景
值得注意的是,实际应用中这两种技术正在逐渐融合。智能RPA结合了两者的优势,用AI增强传统RPA的能力,而智能体也在借鉴RPA的流程编排方法。在软件测试领域,这种融合特别有价值,可以同时处理结构化的重复测试和需要适应性的探索性测试。
4. Agent的组成部分实现原理
理解AI智能体各组成部分的实现原理,对于软件测试工程师来说至关重要。这不仅有助于更好地使用现有智能体工具,还能指导测试工程师开发和定制符合特定测试需求的智能体解决方案。
4.1 大型语言模型(LLM)的实现
大型语言模型作为智能体的大脑,其实现基于以下关键技术:
-
Transformer架构:大多数现代LLM(如GPT、Claude、Gemini等)都基于Transformer架构,这种架构通过自注意力机制高效处理长序列的文本数据,使模型能够捕获文本中的长距离依赖关系。
-
预训练-微调范式:模型首先在大量通用文本上进行预训练,然后在特定任务数据(如软件测试相关内容)上进行微调,使其适应特定领域知识。
-
提示工程:通过精心设计的提示(prompts)引导模型生成所需的输出,包括特定格式的测试用例、分析报告或代码片段。
在软件测试智能体中,LLM主要负责理解测试需求、生成测试策略、解释测试结果和与人类测试人员进行自然语言交互。
4.2 规划(Planning)的实现机制
智能体的规划能力通过以下几种方式实现:
-
任务分解:将复杂测试任务分解为可管理的子任务,如"测试登录功能"可以分解为验证有效登录、测试错误处理、检查密码重置等子任务。
-
链式思考(Chain-of-Thought):通过让模型逐步推理来解决复杂问题,每一步都基于前面步骤的结果,类似人类的思考过程。
-
思维树(Tree-of-Thoughts):探索多条可能的推理路径,然后选择最优解,适用于需要考虑多种测试场景的情况。
-
反思与优化:通过自我反思机制(如ReAct框架)评估每个步骤的结果,并据此调整后续计划。
这些规划机制使智能体能够设计全面的测试策略,确定测试优先级,并在执行过程中根据结果动态调整计划。
4.3 记忆(Memory)的实现方式
AI智能体的记忆系统通常分为两种实现方式:
-
短期记忆:
-
通过上下文窗口实现,即在模型的输入中保留最近的对话历史
-
通常受到模型上下文长度的限制(如4K、32K或128K令牌)
-
适用于在单次测试会话中保持一致性和上下文理解
-
-
长期记忆:
-
通过外部向量数据库实现,如Pinecone、Weaviate或Chroma
-
将关键信息转换为向量表示并存储,需要时通过相似性搜索检索
-
通常使用最大内积搜索(MIPS)或近似最近邻(ANN)算法进行高效检索
-
适用于存储测试历史、已知问题和解决方案,以便在未来测试中参考
-
在实践中,记忆管理涉及三种更新策略:
-
热路径更新:在响应用户之前立即更新记忆,确保即时反馈
-
后台更新:在会话期间或之后异步更新记忆,减少延迟
-
用户反馈更新:基于测试工程师的明确反馈更新记忆,提高准确性
4.4 工具使用(Tool Use)的实现
智能体使用外部工具的能力通过以下技术实现:
-
工具定义:通过结构化描述(如JSON Schema)定义工具的功能、参数和返回值,使模型能够理解如何调用这些工具。
-
工具调用:模型生成符合工具API要求的调用请求,然后由执行环境实际执行该调用并返回结果。
-
结果解析与整合:模型解析工具执行的结果,并将其整合到后续的推理和响应中。
在软件测试中,常用工具包括:
-
测试执行工具(如Selenium、Cypress、Jest)
-
代码分析工具
-
问题跟踪系统API(如Jira)
-
测试数据生成工具
-
性能监控工具
通过这些实现机制,AI智能体形成了一个有机的整体,能够理解测试需求、制定测试计划、记住关键信息并使用适当的工具执行测试任务,从而实现高度自动化的软件测试流程。
5. Agent的发展简史
AI智能体的发展历程反映了人工智能领域的重大突破和范式转变。从最初的简单规则系统到现今的复杂自主智能体,这一演变过程可分为几个关键阶段。
5.1 初期基础(1950s-1960s)
AI智能体的概念起源可以追溯到人工智能研究的早期:
-
1950年: Alan Turing提出了著名的图灵测试,为判断机器是否具有智能提供了框架。
-
1956年: 达特茅斯会议标志着人工智能作为一个学科的正式诞生。
-
1966年: Joseph Weizenbaum创建了ELIZA,这是一个早期的对话系统,虽然简单,但展示了机器与人类交互的可能性。
这一时期的系统主要依赖于简单的规则和模式匹配,尚未达到真正意义上的智能体。
5.2 规则基础时期(1970s-1980s)
这一阶段出现了更为复杂的基于规则的系统:
-
专家系统: 如MYCIN(医疗诊断)和DENDRAL(化学分析)等系统在特定领域表现出相当的能力。
-
PROLOG语言: 基于逻辑编程的语言,为构建规则引擎提供了工具。
-
早期强化学习: 开始探索让系统通过试错学习最优策略的方法。
这些系统虽已展现出一定的决策能力,但仍高度依赖人工编写的规则,缺乏自适应性。
5.3 智能体概念形成(1990s)
在1990年代,智能体作为一个具体概念开始成形:
-
Russell & Norvig定义: 在《人工智能:一种现代方法》中,智能体被定义为"任何能够感知环境并在环境中采取行动的实体"。
-
早期虚拟助手: 如Microsoft的Clippy,尽管功能有限,但展示了智能助手的概念。
-
多智能体系统: 开始研究多个智能体如何协同工作解决复杂问题。
这一时期的智能体仍主要是规则驱动的,但开始具备简单的自主决策能力。
5.4 机器学习驱动智能体(2000s)
随着机器学习技术的发展,智能体变得更加智能和适应性强:
-
自然语言处理进步: 改善了智能体理解和生成人类语言的能力。
-
统计模型应用: 机器学习模型被应用于决策过程,减少了对硬编码规则的依赖。
-
IBM Watson: 在2011年击败人类冠军参与Jeopardy!竞赛,展示了智能体整合多种AI技术的潜力。
这一时期的智能体开始能够从数据中学习,显著提高了它们的适应能力和准确性。
5.5 深度学习革命(2010s)
深度学习的突破彻底改变了智能体的能力:
-
AlexNet(2012): 在图像识别领域的突破性进展,为智能体提供了更强的视觉感知能力。
-
OpenAI GPT系列: 展示了大型语言模型作为智能体核心组件的潜力。
-
强化学习突破: DeepMind的AlphaGo和AlphaStar等系统通过深度强化学习在复杂环境中取得卓越表现。
此阶段的智能体开始具备理解复杂输入(如图像、语音)和生成连贯输出的能力。
5.6 智能体时代(2020s至今)
当前阶段见证了真正自主的AI智能体的兴起:
-
大型语言模型作为控制器: 以OpenAI的GPT-4、Anthropic的Claude和Google的Gemini等为基础的智能体。
-
自主规划能力: 系统如AutoGPT和Devin等展示了智能体可以独立分解任务并执行多步骤计划。
-
工具使用集成: 智能体学会了使用各种外部工具和API扩展其能力。
-
多智能体协作: 如CrewAI等框架支持多个专业化智能体协同工作,模拟人类团队合作。
现代智能体已经从简单的响应系统演变为能够自主规划、学习和适应的复杂系统,在软件测试等领域展现出巨大潜力。
5.7 方法与架构的演进
从架构角度看,智能体的发展也经历了从简单到复杂的演变:
-
简单提示响应: 最初的智能体只是对输入提示做出直接响应。
-
思维链方法(CoT): 通过展示推理步骤提高问题解决能力。
-
自我反思框架(ReAct): 结合推理和行动,在采取行动前先思考。
-
思维树方法(ToT): 探索多个可能的推理路径,选择最优解。
-
规划-执行循环: 先制定详细计划,然后执行,评估结果后调整。
-
长期自主代理: 如AutoGPT和BabyAGI,能够长期运行并根据目标自主采取行动。
-
多代理协作系统: 多个智能体协同工作,各自扮演不同角色。
这一演进过程反映了智能体朝着更高度自主性和更复杂任务处理能力方向的发展,为软件测试等领域提供了越来越先进的工具。
6. 当前知名的Agent开发框架
随着AI智能体的快速发展,涌现出多种开发框架,帮助测试工程师和开发者更容易地构建、部署和管理智能体。以下是2025年最受关注的几个主要框架:
6.1 LangChain
LangChain是构建LLM驱动智能体的最强大且广泛采用的框架之一:
-
主要特点:
-
支持OpenAI、Anthropic、Cohere、Hugging Face和本地LLM
-
丰富的工具生态系统:Google搜索、SQL查询、Python代码执行等
-
既支持简单链式处理也支持复杂智能体循环(如ReAct、Self-Ask)
-
提供记忆和对话跟踪,包括向量存储集成
-
高度可扩展,支持自定义工具和智能体定义
-
-
最适合:需要将多个组件(提示、模型、记忆和API)链接在一起的定制LLM应用程序,特别适合构建问答系统、文档处理工具和自主智能体。
6.2 LangGraph
LangGraph是LangChain的扩展,为智能体添加了基于图的工作流管理:
-
主要特点:
-
图形化抽象,允许开发者将智能体工作流定义为状态机
-
与LangChain的工具、记忆和模型深度集成
-
支持循环、条件分支和持久状态
-
-
最适合:需要对智能体工作流进行确定性控制的复杂场景,包括需要分支、重试和状态转换可视化的情况。
6.3 AutoGen(微软)
AutoGen采用独特的多智能体对话方法:
-
主要特点:
-
智能体之间使用自然语言通信
-
包含现成的智能体,如AssistantAgent、UserProxyAgent和GroupChatManager
-
AutoGen Studio:一个原型设计和测试智能体的图形界面
-
智能体可以生成并执行Python代码,检查输出并在失败时重试
-
兼容OpenAI和Azure OpenAI接口
-
-
最适合:多智能体系统,特别是需要在计划、编码和审查等任务中进行基于角色的沟通的场景。
6.4 Semantic Kernel
Semantic Kernel是微软开发的一个企业级框架:
-
主要特点:
-
在代码或提示中定义"技能"(函数/工具)
-
通过"规划者"对技能进行排序
-
支持OpenAI、Azure OpenAI、Hugging Face等
-
轻量级插件模型和企业友好设计
-
-
最适合:将AI功能嵌入企业应用程序和创建协作工具,特别是在生产环境中,如Microsoft 365 Copilot。
6.5 OpenAI Agents SDK(又名Swarm)
OpenAI的官方智能体框架采用简约设计:
-
主要特点:
-
核心原语:智能体、工具、交接和护栏
-
内置模式验证和智能体间委派
-
跟踪、监控和调试工具
-
为GPT-4和函数调用功能优化
-
-
最适合:需要简单、强健结构的轻量级自主智能体,特别是那些需要强制护栏和监控的应用场景。
6.6 SuperAGI
SuperAGI定位为完整的智能体操作系统:
-
主要特点:
-
多智能体管理,具有持久记忆和遥测功能
-
用于启动、监控和检查智能体操作的Web界面
-
内置工具用于网络搜索、文件I/O和代码执行
-
集成向量记忆支持,选项包括Pinecone、Chroma和Weaviate
-
包含工具/插件市场以增强功能
-
-
最适合:需要持续监控、Web界面和多智能体管理的持久智能体,特别是具有长期状态和遥测需求的智能体。
6.7 CrewAI
CrewAI专注于团队协作风格的智能体工作流:
-
主要特点:
-
支持基于角色的设计,智能体具有不同角色(如规划者、编码者、评论者)
-
内置支持传递上下文和任务历史
-
兼容LangChain的智能体和工具
-
结构化的顺序任务编排
-
-
最适合:基于团队的工作流,其中具有不同角色的智能体需要在写作、研究或代码审查等任务中协作。
6.8 企业平台
除了开源框架外,还有面向企业的商业智能体平台:
-
IBM watsonx Orchestrate:
-
拖放式界面,具有技能工作室和助手构建器
-
与80多个企业工具集成,支持多种业务功能
-
为企业使用提供安全、可审计和受管制的环境
-
-
Salesforce Agentforce / Einstein GPT:
-
直接集成在Salesforce中
-
用于客户服务和销售工作流的拖放式设置
-
GPT驱动的回复,具有合规性和护栏功能,专注于CRM特定数据
-
这些框架为测试工程师提供了丰富的选择,从基础架构到企业级解决方案,可根据特定项目需求和技术栈选择最合适的工具。
7. 测试工程师如何运用Agent
随着AI智能体技术的成熟,测试工程师可以在多方面利用这一强大工具提升测试效率和质量。以下是测试工程师运用智能体的主要方式:
7.1 生成测试内容
测试工程师可以使用AI智能体生成各类测试内容:
-
测试用例自动生成:从需求文档、用户故事或功能描述自动提取测试场景,将自然语言需求转换为结构化测试用例。例如,测试工程师只需提供API文档或用户故事,智能体就能生成全面的测试用例集。
-
测试数据创建:基于应用程序要求和边界条件生成大量测试数据,包括边界值、无效输入和特殊字符等场景数据。智能体能够理解数据格式要求,同时确保测试数据的多样性和覆盖性。
-
测试脚本编写:根据测试用例自动生成Selenium、Cypress、JUnit等框架的测试代码。例如,Firebase的App Testing agent可以从自然语言描述生成并执行移动应用测试,无需编写代码。
7.2 执行自适应测试
智能体在执行测试时表现出的自适应能力使测试过程更智能、更有效:
-
自动化UI测试:即使在UI发生变化时,智能体也能通过视觉识别和语义理解正确定位元素,减少测试脆弱性。例如,当按钮位置或ID改变时,基于智能体的测试仍然可以找到目标元素。
-
探索性测试:智能体可以像人类测试人员一样探索应用程序,尝试不同的用户路径,发现传统脚本可能遗漏的问题。在探索过程中,智能体会根据应用程序的反应动态调整测试策略。
-
智能重试机制:当测试失败时,智能体能够分析失败原因,调整测试参数或环境,并重试测试,提高测试可靠性。
7.3 分析与维护
智能体在测试分析和维护方面发挥着越来越重要的作用:
-
失败分析与根因诊断:智能体可以分析测试失败日志、错误消息和应用程序状态,提供可能的根本原因和解决建议。例如,Momentic平台的智能体可以深入分析失败的测试,并提供详细的错误报告和修复建议。
-
测试套件优化:通过分析测试覆盖率、执行时间和失败历史,智能体可以建议优化测试套件,移除冗余测试,增加覆盖不足的区域。
-
自动修复测试脚本:当应用程序更新导致测试失败时,智能体可以自动更新测试脚本以适应新变化,减少维护负担。例如,当网页元素选择器变化时,智能体可以自动生成新的选择器。
7.4 集成到CI/CD流程
测试工程师可以将智能体集成到现代软件开发流程中:
-
持续测试:在CI/CD管道中嵌入智能体,根据代码变化自动执行相关测试,确保快速反馈。智能体可以分析代码变更,只执行受影响的测试,提高测试效率。
-
质量关卡:设置基于智能体的质量检查点,在代码合并或部署前自动评估软件质量。例如,智能体可以对变更的影响范围进行风险评估,决定是否需要更广泛的测试。
-
测试结果报告:智能体可以生成详细的测试报告,突出关键问题,并与问题跟踪系统(如Jira)集成。报告中可以包含问题分类、优先级建议和可视化数据。
7.5 构建测试智能体的实践建议
对于希望开始使用AI智能体的测试工程师,以下是一些实践建议:
-
从小规模试点开始:选择一个非关键的测试领域开始尝试,如某个特定模块的单元测试或简单UI测试。
-
选择合适的框架:根据项目需求和团队技能选择适当的智能体框架:
-
LangChain/LangGraph适合需要高度定制和灵活性的场景
-
AutoGen适合需要多智能体协作的复杂测试系统
-
企业级工具如IBM watsonx Orchestrate适合大规模企业环境
-
-
增量集成:逐步将智能体与现有测试框架集成,而不是一次性替换所有系统。例如,先用智能体生成测试用例,再尝试自动化执行。
-
保持人类监督:设置适当的验证机制,确保测试质量,特别是在关键功能测试中。定期审查智能体生成的测试用例和执行结果。
-
持续学习和优化:收集智能体测试的结果和反馈,不断优化智能体的提示和配置,提高其性能。
通过这些方法,测试工程师可以有效地将AI智能体整合到测试工作流程中,显著提高测试效率、覆盖率和质量。随着技术的发展,AI智能体在软件测试中的应用将继续深化,成为测试工程师工具箱中不可或缺的一部分。
总结
AI智能体代表了软件测试领域的一次革命性转变。从本节的内容中,我们了解到:
-
AI智能体是由大模型(LLM)、规划(Planning)、记忆(Memory)和工具使用(Tool Use)组成的自主系统,能够理解、学习并采取行动。
-
与传统RPA相比,智能体具有更强的适应性、更好的非结构化数据处理能力和更高的自主决策能力。
-
智能体的实现涉及复杂的技术组合,包括大型语言模型、任务分解、向量存储和工具集成等。
-
智能体的演变历程从简单的规则系统到今天的复杂自主系统,反映了人工智能的整体发展轨迹。
-
当前市场上有多种智能体开发框架可供选择,包括LangChain、AutoGen、CrewAI等,每种框架都有其适用场景。
-
测试工程师可以在测试内容生成、自适应测试执行、分析与维护以及CI/CD集成等方面运用智能体,显著提升测试效率和质量。
随着技术的不断进步,AI智能体将成为测试工程师的强大助手,帮助他们应对日益复杂的软件测试挑战。测试工程师不必担心被智能体取代,而是应该积极学习如何与智能体协同工作,将重复性工作交给智能体,自己则专注于更具创造性和战略性的测试工作。
通过掌握AI智能体的概念、原理和应用,测试工程师可以在AI赋能的软件测试新时代中保持竞争力,并提供更高质量的测试服务。
感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取
更多推荐
所有评论(0)