正在学习
14.3 后端和 API 提示(2)
14.3 后端与 API 提示(2)
{
"code": "return jsonify({\"message\": \"Book added successfully\"}), 201
@app.route(\"/books\", methods=[\"GET\"])\ndef get_books():\n books = Book.query.all()\n return jsonify([{\"id\": b.id, \"title\": b.title, \"author\": b.author} for b in books])\n\n@app.route(\"/books/<int:book_id>\", methods=[\"GET\"])\ndef get_book(book_id):\n book = Book.query.get(book_id)\n if not book:\n return jsonify({\"error\": \"Book not found\"}), 404\n return jsonify({\"id\": book.id, \"title\": book.title, \"author\": book.author})\n\n@app.route(\"/books/<int:book_id>\", methods=[\"DELETE\"])\ndef delete_book(book_id):\n book = Book.query.get(book_id)\n if not book:\n return jsonify({\"error\": \"Book not found\"}), 404\n db.session.delete(book)\n db.session.commit()\n return jsonify({\"message\": \"Book deleted\"})\n\nif __name__ == \"__main__\":\n app.run(debug=True)\n\n## 14.4 测试与调试提示\n测试与调试是 Claude Code 从编码助手转变为软件质量合作伙伴的环节。编写良好的提示不仅可以帮助 Claude 生成测试用例,还可以诊断逻辑错误、解读堆栈跟踪,甚至解释如何修复 bug。本节重点介绍如何编写结构化、可复现的测试与调试提示,以获得高质量、可验证的结果。\n\nClaude 的优势在于其上下文推理能力——它能够理解函数应该执行的操作、检测失败原因,并在同一工作流中同时生成测试和修复方案。通过合适的提示结构,你可以将 Claude 视为一名灵活的全职测试工程师,补充你自身的直觉,省去大量人工检查的时间。\n\n### 概念开发\n在提示 Claude 进行测试和调试时,清晰性和范围限定至关重要。与人类测试人员不同,Claude 无法很好地推断未明确说明的需求——你必须明确指定范围、框架和预期行为。始终能产生良好结果的关键提示要素包括:\n\n- 框架指定——例如"使用 pytest"、"使用 Jest"或"使用 unittest"。\n- 覆盖范围——定义要测试的函数、模块或边界情况。\n- 预期格式——要求提供可运行的测试文件,而非代码片段。\n- 错误处理——提供供 Claude 分析的示例堆栈跟踪。\n- 验证意图——指示 Claude 确认修复方案能通过所有测试。\n\n一个结构良好的调试提示不仅仅是请求修复;它会解释观察到的行为,并引导 Claude 一步步进行推理。\n\n### 动手示例 1:使用 Pytest 编写单元测试\n**提示**:\n你是一名 Python 质量保证工程师。\n为以下函数编写 pytest 测试用例。\n确保覆盖有效输入、无效输入和边界情况。\n返回一个完整可运行的测试文件。\n\n```python\ndef divide(a, b):\n return a / b\n```\n\n**Claude 输出(示例)**:\n```python\nimport pytest\nfrom main import divide\n\ndef test_divide_valid():\n assert divide(10, 2) == 5\n assert divide(-6, 3) == -2\n\ndef test_divide_zero_division():\n with pytest.raises(ZeroDivisionError):\n divide(5, 0)\n\ndef test_divide_floats():\n assert pytest.approx(divide(5.0, 2.0), 0.001) == 2.5\n\ndef test_divide_large_numbers():\n assert divide(1_000_000, 10) == 100_000\n```\n\n**解释**:Claude 创建了一个干净、结构化的测试文件,涵盖了边界情况——包括浮点精度和错误处理。得益于精心设计的提示,它在未被明确告知具体测试内容的情况下,自动推断出了边界条件。\n\n### 动手示例 2:通过错误跟踪分析进行调试\n**提示**:\n你是一名调试助手。\n分析以下 Python 跟踪回溯,识别根本原因。\n然后,正确地重写有缺陷的代码并给出解释。\n\n```\nTraceback (most recent call last):\n File \"app.py\", line 10, in <module>\n result = calculate_area(5)\nTypeError: calculate_area() missing 1 required positional argument: 'height'\n\n```python\ndef calculate_area(width, height=2):\n return width * height\n```\n\n**Claude 输出(示例)**:\n```python\n# 修复后的代码\ndef calculate_area(width, height=2):\n return width * height\n\n# 正确的用法\nresult = calculate_area(5, 4)\nprint(result) # 输出:20\n```\n\n**解释**:Claude 准确地识别了问题——函数调用缺少必需的位置参数。它不仅提供了修正后的代码,还在上下文中解释了修复方案,使调试成为一个学习过程,而非猜测游戏。\n\n### 动手示例 3:JavaScript Jest 测试自动化\n**提示**:\n为以下 Express.js 路由编写 Jest 测试用例。\n覆盖成功、失败和验证场景。\n\n```javascript\napp.post(\"/users\", (req, res) => {\n const { name, email } = req.body;\n if (!name || !email) return res.status(400).json({ message: \"Invalid input\" });\n res.status(201).json({ message: \"User created\" });\n});\n```\n\n**Claude 输出(示例)**:\n```javascript\nimport request from \"supertest\";\nimport express from \"express\";\n\nconst app = express();\napp.use(express.json());\n\napp.post(\"/users\", (req, res) => {\n const { name, email } = req.body;\n if (!name || !email) return res.status(400).json({ message: \"Invalid input\" });\n```
```markdown
res.status(201).json({ message: "User created" });
});
describe("POST /users", () => {
it("should create a user successfully", async () => {
const res = await request(app)
.post("/users")
.send({ name: "Alice", email: "alice@example.com" });
expect(res.statusCode).toBe(201);
expect(res.body.message).toBe("User created");
});
it("should return 400 for invalid input", async () => {
const res = await request(app).post("/users").send({});
expect(res.statusCode).toBe(400);
});
});
原理说明:该提示定义了三个预期——框架、测试覆盖范围和验证行为。Claude 返回了一个可工作的测试套件,该套件使用 Supertest,处理有效和无效输入,并可在 Node.js 中立即运行。
动手示例 4:调试循环中的逻辑错误
提示:
分析这段会产生错误结果的 Python 代码。
解释逻辑错误并提供修正后的版本。
def calculate_sum(numbers):
total = 0
for num in numbers:
total = num # bug here
return total
print(calculate_sum([1, 2, 3]))
Claude 输出(示例):
练习题
通过 POST 请求添加图书时,成功添加后应返回什么状态码和消息?
A. 200,"Book added"
B. 201,"Book added successfully"
C. 404,"Book not found"
D. 500,"Internal server error"
应使用哪个路由和方法从数据库中检索所有书籍?
编写让 Claude 生成 FastAPI CRUD 应用程序的提示时,需要哪些必需元素?
A. 框架和编程语言
B. API 的用途
C. 身份验证等要求
D. 预期输出的格式
E. 环境约束
F. 数据库连接详细信息
当通过 GET 请求检索特定书籍时,如果未找到该书籍,应返回 404 状态码并附带错误消息。
通过 DELETE 请求删除书籍时,响应应在成功删除后包含消息 "___"。
解释在后端提示中为 Claude 指定框架和编程语言的重要性。
以下哪项不是 FastAPI CRUD 应用程序提示的要求?
A. CRUD 操作的端点
B. 使用 Pydantic 验证请求体
C. 使用异步函数
D. 对缺失任务的异常处理
使用 Claude 时,有效的测试和调试提示的关键要素有哪些?
A. 框架规范
B. 覆盖范围
C. 预期格式
D. 错误处理
E. 验证意图
F. 代码优化建议
为 Express.js 路由编写 Jest 测试用例时,仅覆盖成功场景就足够了。
描述Claude如何通过分析回溯(traceback)来协助调试Python应用程序。
在编写用于图书管理的 Flask API 时,通过 POST 请求成功添加一本书后,应该返回哪个 HTTP 状态码?
A. 200 OK
B. 201 Created
C. 404 Not Found
D. 500 Internal Server Error
以下哪些是为 Claude 编写提示以生成任务管理 FastAPI CRUD 应用程序时必须包含的基本要素?(选择所有适用的项)
A. 框架和编程语言(例如 Python + FastAPI)
B. API 的用途(例如任务管理)
C. 身份验证和验证等要求
D. 预期的输出格式(例如单个模块或多个路由)
E. 前端界面的配色方案
在一个用于图书管理的 Flask API 中,带有 GET 方法的路由 /books/<int:book_id> 应该在数据库中不存在具有指定 ID 的图书时返回 404 Not Found 状态码。
解释你将如何为Claude构建一个提示,以生成一个包含SQLite数据库集成、SQLAlchemy ORM模型和书籍CRUD路由的图书目录Flask API。
登录后解锁笔记、知识点解析、AI 问答
立即登录