文件预览

test-cases.md

查看 Code Review 技能包中的文件内容。

文件内容

test-cases.md

# Code Review 测试用例

> 版本: v1.0.0 | 更新: 2026-05-23

---

## 测试用例 1:SQL 注入检测(完整审查模式)

**输入**:
```java
public User getUser(String userId) {
    String query = "SELECT * FROM users WHERE id = " + userId;
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery(query);
    if (rs.next()) {
        User user = new User();
        user.setId(rs.getString("id"));
        user.setName(rs.getString("name"));
        return user;
    }
    return null;
}
```

**期望输出**:
- 至少检测到 S-01(SQL 拼接)🔴 严重
- 至少检测到 L-01(null 返回未处理)🟡 警告
- 至少检测到 P-J04 或类似(未使用连接池/预处理)🟡
- 给出参数化查询的修复代码
- 总体评级 ≤ 3 星

---

## 测试用例 2:PR 审查模式

**输入**:
```
审查这个 PR,变更如下:

diff --git a/auth.py b/auth.py
+def login(username, password):
+    if username == "admin" and password == "supersecret123":
+        return True
+    return False
```

**期望输出**:
- 检测到 S-02(硬编码密码)🔴
- 检测到逻辑问题(明文密码比较)🔴
- 检测到缺少日志记录 🔵
- PR 结论为 ❌ 不可合并
- 风险等级 🔴 高

---

## 测试用例 3:性能问题检测

**输入**:
```java
public List<Order> getOrders(List<String> userIds) {
    List<Order> allOrders = new ArrayList<>();
    for (String userId : userIds) {
        String sql = "SELECT * FROM orders WHERE user_id = " + userId;
        List<Order> orders = jdbcTemplate.query(sql, new OrderRowMapper());
        allOrders.addAll(orders);
    }
    return allOrders;
}
```

**期望输出**:
- 检测到 P-01(N+1 查询)🔴
- 检测到 S-01(SQL 拼接)🔴
- 给出批量查询的修复方案
- 给出使用 IN 子句的修复代码

---

## 测试用例 4:安全审查模式

**输入**:
```
安全审查这段 Python 代码:

@app.route('/search')
def search():
    query = request.args.get('q', '')
    results = eval(f"search_{query}()")
    return render_template_string(f"<h1>Results for {query}</h1><p>{results}</p>")
```

**期望输出**:
- 检测到 S-P01(eval 用户输入)🔴🔴
- 检测到 S-05(XSS — 未转义用户输入直接渲染)🔴
- 检测到 SSTI(服务端模板注入)🔴
- 3 个严重安全问题
- 安全审查结论:🔴🔴🔴 高危,不可上线

---

## 测试用例 5:可维护性审查

**输入**:
```java
public void processOrder(Order order) {
    if (order != null) {
        if (order.getItems() != null) {
            if (order.getItems().size() > 0) {
                for (int i = 0; i < order.getItems().size(); i++) {
                    Item item = order.getItems().get(i);
                    if (item.getPrice() > 0) {
                        if (item.getQuantity() > 0) {
                            double total = item.getPrice() * item.getQuantity();
                            System.out.println("Item: " + item.getName() + " Total: " + total);
                        }
                    }
                }
            }
        }
    }
}
```

**期望输出**:
- 检测到 M-02(嵌套超过 3 层)🟡
- 检测到 S-09(System.out.println 而非 logger)🟡
- 检测到 P-J02(LinkedList 场景不适用,但 get(i) 在循环内)🟡
- 检测到 M-04(魔法数字 0)或 L-08(边界条件)🔵
- 给出卫语句重构建议

---

## 测试用例 6:快速自查模式

**输入**:
```
快速检查:
async function deleteAllUsers() {
    const users = await db.query('SELECT * FROM users');
    for (const user of users) {
        await db.query(`DELETE FROM users WHERE id = ${user.id}`);
    }
}
```

**期望输出**:
- 快速格式:⚠️ 有 N 个问题
- 至少检测到 SQL 拼接 🔴
- 至少检测到串行删除(可批量)🟡
- 至少检测到危险操作无确认 🔴
- 简洁输出,不超过 10 行

---

## 测试用例 7:Go 语言代码审查

**输入**:
```go
func (s *Server) HandleLogin(w http.ResponseWriter, r *http.Request) {
    username := r.URL.Query().Get("user")
    password := r.URL.Query().Get("pass")
    
    if username == "admin" && password == os.Getenv("ADMIN_PASS") {
        token := strconv.Itoa(rand.Int())
        http.SetCookie(w, &http.Cookie{
            Name:  "session",
            Value: token,
        })
        w.Write([]byte("OK"))
    }
    w.Write([]byte("FAIL"))
}
```

**期望输出**:
- 检测到 S-G02(math/rand 用于生成 session token)🔴
- 检测到 S-08(密码通过 URL 参数传递)🔴
- 检测到 S-G03(HTTP handler 无超时)🟡
- 检测到逻辑问题(无论登录成功失败都写入响应)🟡
- 给出 crypto/rand 和 http.Cookie Secure/HttpOnly 的修复建议

---

## 测试用例 8:中文项目审查

**输入**:
```
review 这个 Java 方法:

/**
 * 计算订单总金额
 */
public double 计算总价(List<商品> 商品列表) {
    double 总额 = 0;
    for (int i = 0; i < 商品列表.size(); i++) {
        总额 += 商品列表.get(i).get价格() * 商品列表.get(i).get数量();
    }
    // 打八折
    总额 = 总额 * 0.8;
    return 总额;
}
```

**期望输出**:
- 检测到 M-04(魔法数字 0.8 折扣率)🔵
- 检测到 L-04(金额使用 double 而非 BigDecimal)🟡
- 检测到命名规范问题(中文方法名在 Java 中不推荐)🔵
- 审查输出使用中文
- 建议使用常量 `DISCOUNT_RATE = 0.8` 和 BigDecimal

---

## 评分标准

| 维度 | 满分 | 标准 |
|------|------|------|
| 问题检出率 | 30 | 找到所有主要问题 |
| 严重级别准确 | 20 | 评级与实际风险匹配 |
| 修复建议质量 | 25 | 修复代码可直接使用 |
| 输出格式规范 | 15 | 符合对应模式的输出格式 |
| 做得好的指出 | 10 | 正面反馈也有 |