用langgraph生成FastAPI代码:测试工程师的新利器1
在软件开发领域,代码生成工具正逐渐成为开发者和测试工程师的得力助手。今天,我们来深入聊聊一款颇具潜力的工具——langgraph,并探讨如何使用它生成FastAPI代码,以及这对测试工程师意味着什么。
一、langgraph是什么?
langgraph是一款基于图结构的代码生成工具,它以独特的方式将代码生成过程抽象为节点和边组成的图形,让代码生成逻辑变得更加清晰直观。它主要包含几个关键模块:StateGraph、节点函数和边定义。StateGraph是整个工具的核心,它负责管理代码生成过程中的状态和流程;节点函数则定义了在特定状态下生成代码的具体逻辑;边则连接不同的节点,明确代码生成的先后顺序。
与coze、dify等工具相比,langgraph的起始节点和终止节点有着明确的含义。起始节点(如START)标志着代码生成流程的开始,它是整个图形化流程的起点,从这里开始触发各个节点的执行;终止节点(如END)则表示代码生成流程的结束,当流程到达终止节点时,意味着代码生成已经完成。边则代表了节点之间的逻辑关系和执行顺序,它规定了从一个节点到另一个节点的走向,确保代码生成按照既定的流程进行。
之所以这样构造这些节点和边,是因为它能够将复杂的代码生成过程拆解为一个个清晰的步骤,每个步骤对应一个节点,通过边的连接将这些步骤有序地组织起来。这种图形化的设计不仅让代码生成的逻辑一目了然,也方便开发者和测试工程师对整个流程进行理解、修改和优化。
以使用langgraph生成FastAPI代码的流程为例,我们定义了route_node和main_node两个关键节点,并通过sg.add_edge(START, "route_node")、sg.add_edge("route_node", "main_node")、sg.add_edge("main_node", END)这三条边串联起整个代码生成过程。sg.add_edge(START, "route_node")这条边,就像项目启动的“发令枪”,规定代码生成从START开始后,首先进入route_node节点。在route_node节点函数中,会生成FastAPI的路由代码和处理函数代码,这是搭建FastAPI应用的基础环节,好比建造房屋前需要准备好砖块、钢筋等建筑材料。
sg.add_edge("route_node", "main_node")则明确了route_node和main_node的先后顺序,即完成路由和处理函数的生成后,流程才会进入main_node节点。main_node节点函数需要基于route_node生成的路由代码,去创建FastAPI实例、注册路由并启动服务器,这就如同用准备好的材料开始搭建房屋,只有先有了“材料”,才能进行后续的“搭建”工作。最后,sg.add_edge("main_node", END)将流程导向终止节点END,表示当main_node完成创建FastAPI实例、注册路由和启动服务器等操作后,整个代码生成流程顺利结束。
二、为什么选择FastAPI作为示例?
FastAPI是一个用于构建API的高性能Python框架,它基于Python的类型提示,能够提供快速的开发体验和出色的性能。选择FastAPI作为示例,主要有以下几个原因:首先,FastAPI在现代Web开发中应用广泛,越来越多的项目采用它来构建后端API,对于测试工程师来说,熟悉和掌握FastAPI相关的测试工作是非常必要的;其次,FastAPI的代码结构清晰,易于理解和分析,使用langgraph生成FastAPI代码能够更直观地展示代码生成的过程和逻辑;最后,通过生成FastAPI代码,可以帮助测试工程师快速搭建测试环境,提高测试工作的效率。
三、示例代码展示
下面是使用langgraph生成FastAPI代码的具体示例:
from typing import List
from langgraph.graph import StateGraph, START, END
from typing_extensions import TypedDict
from langchain_core.messages import SystemMessage, HumanMessage
from llm import DeepSeek
llm = DeepSeek()
systemMessage = """
你是一个Python FastAPI开发者,你将编写基于FastAPI框架的Web程序。
你只需直接输出代码,不要做任何解释和说明,不要将代码放到 ```python ```中
"""
class State(TypedDict):
main: str
routes: list[str]
handlers: list[str]
def split_route_handler(message: str) -> List[str]:
codes = message.split('###')
if len(codes) != 2:
raise Exception("Invalid message format")
return codes
def route_node(state):
prompt = """
生成FastAPI的路由代码和处理函数,它们之间使用字符串'###'隔开
route_hello:
@app.get("/hello")
handler_hello:
返回包含字符串 "hello" 的响应
"""
message = llm.invoke([SystemMessage(content=systemMessage), HumanMessage(content=prompt)])
codes = split_route_handler(message.content)
state["routes"] += [codes[0]]
state["handlers"] += [codes[1]]
return state
def main_node(state):
prompt = """
1. 创建FastAPI实例
2. 拥有路由代码
{routes}
处理函数代码已经生成,无需再进行处理
3. 启动服务器,端口为8000
"""
prompt = prompt.format(routes=state["routes"][-1])
message = llm.invoke([SystemMessage(content=systemMessage), HumanMessage(content=prompt)])
state["main"] += message.content
return state
if __name__ == "__main__":
sg = StateGraph(State)
sg.add_node("route_node", route_node)
sg.add_node("main_node", main_node)
sg.add_edge(START, "route_node")
sg.add_edge("route_node", "main_node")
sg.add_edge("main_node", END)
graph = sg.compile()
code = graph.invoke({"main": "", "routes": [], "handlers": []})
print(code["main"])
for handler in code["handlers"]:
print(handler)
在这段代码中,首先定义了系统提示词systemMessage,明确生成FastAPI代码的要求。然后通过route_node节点函数生成路由和处理函数代码,main_node节点函数根据生成的路由代码创建FastAPI实例并启动服务器。最后通过StateGraph构建代码生成流程,并调用生成最终的代码。
当然以上的代码中路由和处理函数写在了一起,如果分开写将会变成如下的格式
from typing import List
from langgraph.graph import StateGraph, START, END
from typing_extensions import TypedDict
from langchain_core.messages import SystemMessage, HumanMessage
from llm import DeepSeek
llm = DeepSeek()
systemMessage = """
你是一个 Python FastAPI 开发者,你将编写基于 FastAPI 框架的 Web 程序。
你只需直接输出代码,不要做任何解释和说明,不要将代码放到 ```python ```中
"""
class State(TypedDict):
main: str
routes: list[str]
handlers: list[str]
def route_code_node(state):
prompt = """
生成 FastAPI 的路由代码
route_hello:
@app.get("/hello")
"""
message = llm.invoke([SystemMessage(content=systemMessage), HumanMessage(content=prompt)])
state["routes"] += [message.content]
return state
def handler_code_node(state):
prompt = """
生成 FastAPI 的处理函数代码
handler_hello:
返回包含字符串 "hello" 的响应
"""
message = llm.invoke([SystemMessage(content=systemMessage), HumanMessage(content=prompt)])
state["handlers"] += [message.content]
return state
def main_node(state):
prompt = """
1. 创建 FastAPI 实例
2. 拥有路由代码
{routes}
3. 拥有处理函数代码
{handlers}
4. 启动服务器,端口为 8000
"""
prompt = prompt.format(routes=state["routes"][-1], handlers=state["handlers"][-1])
message = llm.invoke([SystemMessage(content=systemMessage), HumanMessage(content=prompt)])
state["main"] += message.content
return state
if __name__ == "__main__":
sg = StateGraph(State)
sg.add_node("route_code_node", route_code_node)
sg.add_node("handler_code_node", handler_code_node)
sg.add_node("main_node", main_node)
sg.add_edge(START, "route_code_node")
sg.add_edge("route_code_node", "handler_code_node")
sg.add_edge("handler_code_node", "main_node")
sg.add_edge("main_node", END)
graph = sg.compile()
code = graph.invoke({"main": "", "routes": [], "handlers": []})
print(code["main"])
for handler in code["handlers"]:
print(handler)
for route in code["routes"]:
print(route)
最后的代码结构大概如下:
from fastapi import FastAPI
app = FastAPI()
@app.get("/hello")
def hello():
return "hello"
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
四、对测试工程师的意义
对于测试工程师而言,使用langgraph生成FastAPI代码具有多方面的重要意义。一方面,它可以大大减少手动编写代码的工作量。在测试工作中,常常需要搭建各种测试环境和编写测试用例,而使用langgraph生成代码可以快速生成符合需求的FastAPI代码,节省了大量的时间和精力。另一方面,通过生成的代码,测试工程师可以更深入地了解FastAPI的工作原理和代码结构,有助于更好地进行测试设计和测试执行。此外,生成的代码还可以作为测试数据的一部分,用于验证系统的功能和性能。
五、成熟项目结构应该是什么样的?
使用langgraph生成FastAPI代码的成熟项目结构通常应该包含以下几个部分:
主程序文件:负责创建FastAPI实例、注册路由和启动服务器,是整个项目的入口。
路由文件:专门用于定义API的各个路由和对应的处理函数,使路由逻辑更加清晰。
处理函数文件:包含了具体的业务逻辑实现,将业务逻辑与路由分离,提高代码的可维护性。
配置文件:存储项目的各种配置信息,如数据库连接配置、服务器端口等,方便进行配置管理。
数据库连接文件:负责与数据库建立连接,提供数据访问的功能,确保项目能够正确读写数据。
这样的项目结构清晰合理,便于维护和扩展,能够更好地支持测试工作的开展。
六、langgraph对测试自动化工作的设想
展望未来,langgraph在测试自动化工作中具有很大的潜力。测试工程师可以通过定义不同的节点和边,使用langgraph生成各种测试脚本和测试工具。例如:
生成自动化测试框架代码:根据不同的测试场景和需求,自动生成相应的测试用例,提高测试用例的生成效率和覆盖率。
生成性能测试工具代码:用于对系统进行性能评估,帮助测试工程师快速搭建性能测试环境,获取性能测试数据。
与CI/CD流程结合:在代码构建和部署过程中自动生成相关的测试代码,实现测试的自动化和智能化,确保每次代码变更都经过充分的测试。
七、如何区分系统提示词和用户提示词
在使用langgraph生成代码的过程中,系统提示词和用户提示词扮演着不同的角色。系统提示词通常用于定义代码生成的基本规则和背景信息,它是由工具或开发者预先设定好的,用于引导模型生成符合特定要求的代码。例如,在生成FastAPI代码时,系统提示词
“你是一个Python FastAPI开发者,你将编写基于FastAPI框架的Web程序。你只需直接输出代码,不要做任何解释和说明,不要将代码放到python中”,它明确了生成代码的框架、格式和要求。而用户提示词则是根据具体的需求由用户输入的,用于进一步细化代码生成的内容。比如,“生成FastAPI的路由代码和处理函数,它们之间使用字符串'###'隔开”,这就是用户根据自己的需求提出的具体指令,它在系统提示词的基础上,进一步明确了代码生成的细节。
总之,langgraph为测试工程师提供了一种全新的代码生成方式,通过合理利用它,我们可以提高测试工作的效率和质量,为软件开发项目的成功交付提供有力保障。
更多推荐



所有评论(0)