熟练使用 GitHub Copilot、Cursor、JetBrains AI Assistant 的实战指南

熟练使用 GitHub Copilot、Cursor、JetBrains AI Assistant 的实战指南

这三款工具都是当前最强的 AI 编程助手,能显著提升你的开发效率。掌握它们后,你可以让 AI 处理繁琐的基础工作,专注于核心业务逻辑。以下是针对你提出的 4 个核心需求 的详细操作指南,包含 具体步骤、最佳实践和注意事项


一、让 AI 为你生成单元测试和边界测试用例

为什么需要边界测试?

  • 单元测试只覆盖正常场景,边界测试(如 null、极值、异常输入)能暴露隐藏 Bug。
  • AI 容易遗漏边界情况,必须明确要求才会生成。

📌 操作步骤(分工具说明)

1. GitHub Copilot(适用于 VS Code、JetBrains IDE 等)

适用场景:在代码编写时实时生成测试用例。

步骤

  1. 编写被测函数(例如一个计算器函数):
def divide(a, b): if b == 0: raise ValueError("Cannot divide by zero") return a / b
  1. 在测试文件中用注释明确要求边界测试
# 测试 divide 函数,包括正常情况、除数为0、除数为极小值、被除数为0 等边界情况 def test_divide(): # 正常情况 assert divide(10, 2) == 5.0 # 边界情况1:除数为0,应抛出异常 try: divide(10, 0) assert False, "Expected ValueError" except ValueError: pass # 边界情况2:除数为极小值(接近0的浮点数) assert abs(divide(1, 1e-10) - 1e10) < 1e-5 # 边界情况3:被除数为0 assert divide(0, 5) == 0.0

关键技巧

    • 注释中 明确列出边界场景(如 除数为0极小值),Copilot 会针对性生成。
    • 如果生成的测试不全,迭代补充注释,例如再加 // 测试负数除法
  1. 运行测试验证
    pytestunittest 运行,确保覆盖边界。
2. JetBrains AI Assistant(IntelliJ、PyCharm、WebStorm 等)

适用场景:通过 IDE 原生功能,一键生成全覆盖测试。

步骤

  1. 打开需要测试的类/函数(如 Calculator.java)。
  2. 右键点击函数/类AI AssistantGenerate Tests

  1. 在弹出的对话框中 明确要求边界测试
    • Prompt 示例(在输入框中填写):

生成 JUnit 5 测试类,覆盖以下场景:

  1. 正常整数除法(10/2)
  2. 除数为 0(期望抛出 ArithmeticException
  3. 除数为极小浮点数(1e-10)
  4. 被除数为最大值(Double.MAX_VALUE)
  5. 除数为负数(-2)
  6. AI 会生成类似以下代码:
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class CalculatorTest { @Test void testNormalDivision() { assertEquals(5.0, Calculator.divide(10, 2)); } @Test void testDivideByZero() { assertThrows(ArithmeticException.class, () -> Calculator.divide(10, 0)); } @Test void testDivideByVerySmallNumber() { assertEquals(1e10, Calculator.divide(1, 1e-10), 1e-5); } }
  1. 手动补充业务边界
    AI 可能漏掉业务特定边界(如“用户年龄不能小于 0”),需手动添加。
3. Cursor(独立代码编辑器)

适用场景:通过自然语言聊天界面生成测试。

步骤

  1. 打开 Cursor,加载项目。
  2. 在编辑器底部的 AI Chat 面板 输入:

UserService.createUser 方法生成 Jest 测试,用例要求:

  • 正常创建(姓名、邮箱有效)
  • 邮箱格式错误(应抛出 ValidationError
  • 姓名超过 50 字符(边界测试)
  • 空对象传入(边界测试)
  1. Cursor 会生成测试文件:
// userService.test.js import { createUser } from './userService'; test('正常创建用户', () => { const user = createUser({ name: '张三', email: '[email protected]' }); expect(user.id).toBeDefined(); }); test('邮箱格式错误', () => { expect(() => createUser({ name: '李四', email: 'invalid' })) .toThrow('ValidationError'); }); test('姓名超过50字符', () => { const longName = 'a'.repeat(51); expect(() => createUser({ name: longName, email: '[email protected]' })) .toThrow('Name too long'); });
  1. 直接在编辑器中运行测试
    Cursor 集成终端,一键执行 npm test

二、让 AI 解释一段复杂的遗留代码

常见痛点

  • 遗留代码无注释、命名混乱、逻辑扭曲。
  • AI 可能生成表面解释,需引导它深入分析

📌 操作步骤

1. GitHub Copilot

步骤

  1. 在代码上方添加结构化注释,而非简单“解释这段代码”:
# 请逐行解释该函数的逻辑,重点说明: # 1. 输入参数的作用和约束 # 2. 关键算法(如状态机、递归) # 3. 可能的边界条件和 Bug 风险 # 4. 与其他模块的交互(如全局变量、外部调用) def legacy_calculator(x, y, op): if op == 'add': return x + y elif op == 'sub': if x < y: # 遗留代码中常见的反直觉逻辑 return 0 - (x - y) return x - y else: return None
  1. Copilot 会生成详细解释:

参数说明

  • x, y: 数字类型,未做类型检查,可能导致 TypeError
  • op: 字符串,仅支持 'add''sub',其他值返回 None

逻辑分析

  • op='sub'x < y 时,公式为 0 - (x - y),等同于 y - x这可能是历史 Bug 修复的遗留,实际应直接返回 y - x
  • 风险点:若 xy 为浮点数,比较 x < y 可能因精度问题出错。

边界测试建议

  • 测试 x=0, y=0
  • 测试 x=1e-16, y=2e-16(浮点数边界)
2. JetBrains AI Assistant

步骤

  1. 选中代码块(例如 50 行复杂的 Java 逻辑)。
  2. 右键 → AI AssistantExplain Code
  3. 在弹出的解释面板中,点击“深入分析”(或手动追加提示词):
    • Prompt 补充(在 AI 面板的输入框):

请分析该函数的 时间复杂度,并指出 潜在性能瓶颈
同时说明,如果要重构为异步逻辑,哪些部分需要修改。

  1. AI 会返回结构化报告,例如:

时间复杂度:O(n²),因内部有两层循环。
瓶颈点for (int i=0; i<n; i++) { for (int j=0; j<n; j++) { ... } }
重构建议

  • 将内层循环改为使用 Map 查找,降至 O(n)。
  • 注意:第 20 行的 data.get(i) 可能返回 null,需添加空指针判断。
3. Cursor

步骤

  1. 高亮遗留代码 → 右键 → Ask AI to Explain
  2. 在 AI 面板中使用 分步提问
    • 第一轮:> 请用一句话总结该函数的目的。
    • 第二轮:> 请画出该函数的流程图(Cursor 支持 Mermaid 图表)。
    • 第三轮:> 该函数中,flag 变量的生命周期是多少?它什么时候被重置?
  1. 导出解释为 Markdown
    Cursor 可将解释保存为 .md 文件,方便团队共享。

三、让 AI 帮你进行代码重构和优化

重构原则

  • 不改变外部行为,只优化内部结构。
  • AI 可能过度优化,务必保留必要的注释

📌 操作步骤

1. GitHub Copilot

步骤

  1. 在代码上方写目标导向的注释
// 重构该函数: // 1. 将 SQL 查询提取为独立方法 // 2. 使用 Stream API 替代 for-loop // 3. 添加空数据检查,避免 NPE // 4. 保持原有接口不变 public List<User> getActiveUsers(List<User> allUsers) { List<User> active = new ArrayList<>(); for (User u : allUsers) { if (u.getStatus().equals("active")) { active.add(u); } } String sql = "SELECT * FROM users WHERE status = 'active'"; // ... 执行 SQL(实际上这段逻辑冗余,仅为示例) return active; }
  1. Copilot 生成重构后代码:
public List<User> getActiveUsers(List<User> allUsers) { if (allUsers == null) return Collections.emptyList(); // 提取 SQL 为独立方法(即使实际未用,也按要求) String activeSql = getActiveUsersSql(); return allUsers.stream() .filter(u -> "active".equals(u.getStatus())) .collect(Collectors.toList()); } private String getActiveUsersSql() { return "SELECT * FROM users WHERE status = 'active'"; }
  1. 手动验证
    • 运行单元测试确保行为一致。
    • 检查性能:Stream API 在大数据量下可能更慢,需根据场景选择。
2. JetBrains AI Assistant

步骤

  1. 选中需重构的代码块。
  2. 右键 → AI AssistantRefactor This Code
  3. 精确指定重构目标(在提示框中输入):

目标:

  • 将循环替换为 Java Stream
  • 提取 validateInput 方法,处理 null 和空集合
  • 移除未使用的变量 legacyFlag
  • 保持原有异常抛出逻辑
  1. AI 生成diff 对比:

  1. 一键应用修改
    点击 Apply 即可直接修改代码。务必先备份或提交到 Git
3. Cursor

步骤

  1. 在代码旁边新建一个 临时分支(避免直接修改主分支)。
  2. 在 AI Chat 输入:

请重构 processData 函数:

  • for 循环改为 Promise.all(异步化)
  • 使用 TypeScript 类型注解
  • 限制并发数为 5(避免 DDoS)
  • 输出重构前/后对比
  1. Cursor 会生成完整重构代码,并标注关键变化:
// 重构前 async function processData(items) { const results = []; for (const item of items) { results.push(await fetchData(item)); } return results; } // 重构后(限并发 + 类型) async function processData<T>(items: T[]): Promise<ReturnType<typeof fetchData>[]> { const results: ReturnType<typeof fetchData>[] = []; // 使用 p-limit 限制并发 const limit = pLimit(5); const limitedFetch = items.map(item => () => fetchData(item)); return await Promise.all(limitedFetch.map(fn => limit(fn))); }
  1. 运行性能测试
    Cursor 集成 Benchpress,一键测试重构前后耗时。

四、用自然语言描述需求,让 AI 生成基础的 CRUD 码,你在此基础上进行业务逻辑开发

核心思路

  • 先生成脚手架(模型、路由、基础增删改查),再手动添加业务逻辑(权限、事务、校验)。
  • 明确指定技术栈,否则 AI 可能生成错误框架(如要求 Spring Boot 但生成 Django)。

📌 操作步骤

1. GitHub Copilot

步骤

  1. 新建文件,输入自然语言需求:
# 使用 FastAPI + SQLAlchemy 生成 User CRUD: # - 数据库表:users(id, username, email, created_at) # - 包含:创建、查询单个、查询所有、更新、删除 # - 验证:username 长度 3-20,email 必须包含 @ # - 返回 JSON,包含状态码和消息
  1. Copilot 生成基础代码:
from fastapi import FastAPI, HTTPException from pydantic import BaseModel, field_validator from sqlalchemy import create_engine, Column, Integer, String, DateTime from sqlalchemy.orm import sessionmaker, declarative_base from datetime import datetime app = FastAPI() Base = declarative_base() engine = create_engine("sqlite:///./test.db") SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) class UserBase(BaseModel): username: str email: str @field_validator('username') def validate_username(cls, v): if len(v) < 3 or len(v) > 20: raise ValueError('用户名长度必须在 3-20 之间') return v @field_validator('email') def validate_email(cls, v): if '@' not in v: raise ValueError('邮箱格式无效') return v class UserCreate(UserBase): pass class User(UserBase): id: int created_at: datetime class Config: orm_mode = True class UserModel(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) username = Column(String, unique=True, index=True) email = Column(String, index=True) created_at = Column(DateTime, default=datetime.utcnow) Base.metadata.create_all(bind=engine) def get_db(): db = SessionLocal() try: yield db finally: db.close() @app.post("/users/", response_model=User) def create_user(user: UserCreate, db: Session = Depends(get_db)): db_user = UserModel(username=user.username, email=user.email) db.add(db_user) db.commit() db.refresh(db_user) return db_user # 类似生成 get_user、get_users、update_user、delete_user...
  1. 在此基础上添加业务逻辑
    例如,在 create_user 中加入唯一性检查
@app.post("/users/", response_model=User) def create_user(user: UserCreate, db: Session = Depends(get_db)): # 业务逻辑:检查用户名是否已存在 existing = db.query(UserModel).filter(UserModel.username == user.username).first() if existing: raise HTTPException(status_code=400, detail="用户名已存在") db_user = UserModel(username=user.username, email=user.email) db.add(db_user) db.commit() db.refresh(db_user) return db_user
2. JetBrains AI Assistant

步骤

  1. 新建一个 Spring Boot 项目(或选择现有项目)。
  2. 在任意空白位置右键 → AI AssistantGenerate Code from Description
  3. 输入自然语言需求

使用 Spring Boot + JPA 生成 Product 资源的 CRUD REST API。
数据库表:products(id, name, price, stock, created_at)
要求:

  • 使用 Lombok 简化代码
  • 添加全局异常处理(ProductNotFoundException
  • Swagger 文档支持
  • 不生成测试代码(先专注核心逻辑)
  1. AI 会自动生成:
    • Product.java(实体类,含 Lombok 注解)
    • ProductRepository.java(JPA Repository)
    • ProductController.java(REST 控制器,含 CRUD)
    • GlobalExceptionHandler.java(异常处理)
    • application.yml 中的 Swagger 配置
  1. 手动添加业务逻辑
    例如,在 ProductController.updateProduct 中加入库存不能为负数的校验:
@PutMapping("/{id}") public ResponseEntity<Product> updateProduct(@PathVariable Long id, @RequestBody ProductUpdateDTO dto) { Product product = repository.findById(id) .orElseThrow(() -> new ProductNotFoundException(id)); // 业务逻辑:库存不能为负数 if (dto.getStock() != null && dto.getStock() < 0) { throw new IllegalArgumentException("库存不能为负数"); } // ... 更新字段 return ResponseEntity.ok(repository.save(product)); }
3. Cursor

步骤

  1. 在项目根目录新建 prompt.txt,写入需求:
项目:Node.js + Express + Mongoose 实体:Category(分类) 字段:_id, name, description, is_active, created_at 需求: - 生成完整 CRUD 路由(/api/categories) - 使用 async/await - 添加分页查询(页码、每页数量) - 返回格式:{ code: 0, data: {...}, msg: '成功' } - **不包含认证**
  1. 打开 prompt.txt → 右键 → Ask AI to Generate Code
  2. Cursor 生成目录结构:
src/ ├── models/ │ └── Category.js ├── routes/ │ └── categoryRoutes.js ├── controllers/ │ └── categoryController.js └── app.js
  1. 关键文件示例categoryController.js):
const Category = require('../models/Category'); exports.createCategory = async (req, res) => { try { const { name, description, is_active } = req.body; const category = await Category.create({ name, description, is_active: is_active || true, }); res.json({ code: 0, data: category, msg: '创建成功' }); } catch (error) { res.status(500).json({ code: -1, msg: error.message }); } }; exports.getCategories = async (req, res) => { try { const page = parseInt(req.query.page) || 1; const perPage = parseInt(req.query.perPage) || 10; const skip = (page - 1) * perPage; const categories = await Category.find({}) .skip(skip) .limit(perPage) .sort({ createdAt: -1 }); const total = await Category.countDocuments(); res.json({ code: 0, data: { list: categories, total }, msg: '查询成功' }); } catch (error) { res.status(500).json({ code: -1, msg: error.message }); } };
  1. 在此基础上开发业务逻辑
    例如,在 updateCategory 中加入只能管理员操作的逻辑(需先集成认证):
exports.updateCategory = async (req, res) => { // 业务逻辑:检查用户角色(假设 req.user 由认证中间件提供) if (!req.user || req.user.role !== 'admin') { return res.status(403).json({ code: -1, msg: '无权限操作' }); } // ... 原有更新逻辑 };

✅ 最佳实践与注意事项

🔥 必做项(避免踩坑)

步骤

说明

1. 明确技术栈

在提示词中写明框架、语言、版本(如 Spring Boot 3.2 + Java 17)。AI 默认可能用旧版本。

2. 迭代生成

不要指望一次生成完美代码。先生成基础版 → 测试 → 补充需求 → 重新生成。

3. 必须写单元测试

AI 生成的代码可能藏着边界 Bug。每个 CRUD 操作都要写测试(参考第一部分)。

4. 代码审查

即使 AI 生成,也要像自己写的一样审查:
- 检查 SQL 注入风险
- 验证权限控制
- 确认异常处理

5. 记录 Prompt

把有效的 Prompt 保存到项目的 PROMPTS.md 中,方便团队复用。

⚠️ 常见陷阱与规避方法

陷阱

规避方法

AI 生成的测试用例不覆盖边界

在 Prompt 中 强制列出边界场景(如 // 测试金额为0、负数、最大值)。

重构后行为改变

生成后运行原有测试,若无测试则先写测试再重构。

CRUD 代码缺少业务校验

生成后立即添加业务逻辑,例如“订单金额不能为负”、“用户名唯一”。

AI 混淆技术栈

每次生成前明确声明// 使用 Vue 3 + TypeScript + Pinia

💡 高级技巧

  1. 组合多个工具
    • JetBrains AI 生成基础代码 → 用 Copilot 优化注释 → 用 Cursor 生成测试
  1. 利用 AI 记忆上下文
    在同一个文件连续提问,AI 会记住之前的对话(如先问“解释这段代码”,再问“如何重构它”)。
  2. 批量生成文档
    用 Cursor 将 AI 解释的 Markdown 直接导出为 docs/ 目录,作为项目维基。

📌 总结

任务

推荐工具

为什么?

生成测试

JetBrains AI Assistant

一键生成 + 支持边界用例指定

解释遗留代码

Cursor

交互式提问 + 支持流程图

代码重构

JetBrains AI Assistant

原生 IDE 集成 + diff 预览

生成 CRUD

GitHub Copilot

实时补全 + 高精度框架匹配

核心原则AI 是助手,不是替身
用 AI 处理 重复、低价值 的工作(如写测试、_scaffolding),把时间花在 业务逻辑、架构设计 上——这才是开发者的核心竞争力。

按照此指南操作,你将大幅提升编码效率,同时保证代码质量。动手试一试,今天就让 AI 为你写一半的代码! 🚀

Read more

无需任何拓展Copilot接入第三方OpenAI接口教程

禁止搬运,转载需标明本文链接 省流:修改"C:\Users\你的用户名称\.vscode\extensions\github.copilot-chat-0.35.0\package.json"中的"when": "productQualityType != 'stable'"为"when": "productQualityType == 'stable'",即可在copilot添加支持openAI的第三方接口 我在寻找怎么让copilot接入第三方接口的时候,通过别人的贴子(长期有效)接入第三方 OpenAI 兼容模型到 GitHub Copilot-ZEEKLOG博客发现了官方的讨论Add custom OpenAI endpoint configuration

By Ne0inhk
本地部署 Kimi K2 全指南(llama.cpp、vLLM、Docker 三法)

本地部署 Kimi K2 全指南(llama.cpp、vLLM、Docker 三法)

Kimi K2 是 Moonshot AI 于2025年7月11日发布的高性能多专家语言模型(MoE),支持最大 128K 上下文,激活参数规模为 32B,具备极强的推理、代码生成与多轮对话能力。自从其权重以多种格式开源以来,许多开发者希望将其部署在本地,以获得更高的私密性和灵活性。 本文将详细介绍三种主流本地部署路径,并提供完整的配置步骤和使用建议。 📦 准备工作(通用部分) 在进行部署前,请准备如下环境与资源: ✅ 最低硬件配置建议: 项目要求存储空间≥ 250 GB(用于量化模型,若使用 FP8 请预留 1 TB)内存≥ 128 GB RAM(越大越流畅)GPU≥ 24 GB 显存,推荐多卡(如 2×A100、H100)操作系统Linux(Ubuntu 推荐)

By Ne0inhk
AIGC实战——CycleGAN详解与实现

AIGC实战——CycleGAN详解与实现

AIGC实战——CycleGAN详解与实现 * 0. 前言 * 1. CycleGAN 基本原理 * 2. CycleGAN 模型分析 * 3. 实现 CycleGAN * 小结 * 系列链接 0. 前言 CycleGAN 是一种用于图像转换的生成对抗网络(Generative Adversarial Network, GAN),可以在不需要配对数据的情况下将一种风格的图像转换成另一种风格,而无需为每一对输入-输出图像配对训练数据。CycleGAN 的核心思想是利用两个生成器和两个判别器,它们共同学习两个域之间的映射关系。例如,将马的图像转换成斑马的图像,或者将苹果图像转换为橙子图像。在本节中,我们将学习 CycleGAN 的基本原理,并实现该模型用于将夏天的风景图像转换成冬天的风景图像,或反之将冬天的风景图像转换为夏天的风景图像。 1. CycleGAN 基本原理 CycleGAN 是一种无需配对的图像转换技术,它可以将一个图像域中的图像转换为另一个图像域中的图像,而不需要匹配这两个域中的图像。它使用两个生成器和两个判别器,其中一个生成器将一个域中的图像

By Ne0inhk
用 OpenAI Whisper + pyannote.audio 打造“谁在说什么”的全栈语音理解系统

用 OpenAI Whisper + pyannote.audio 打造“谁在说什么”的全栈语音理解系统

只做语音识别的系统,只能回答“说了什么”; 只有说话人分离的系统,只能回答“谁在什么时候说话”; 把两者拼在一起,你就有了一个真正能看懂对话的机器。 这篇文章,我们从工程落地的角度,聊一聊:如何把 OpenAI 的 Whisper 语音识别模型,和 pyannote.audio 的说话人分离管线拼成一个“谁在什么时候说了什么”的完整解决方案。 我们会回答这三个核心问题: 1. 技术思路:Whisper + pyannote.audio 的组合到底在解决什么问题? 2. 工程实现:从一段音频到“带说话人标签的转写结果”,需要哪些关键步骤? 3. 实战建议:在真实业务里,这种方案要怎么做取舍、怎么优化? 全文尽量站在“要上线一个能工作的系统”的视角,而不是“能跑就行的 demo”。 一、为什么一定要把 Whisper 和 pyannote.

By Ne0inhk