网罗开发 (小红书、快手、视频号同名)

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
📣 公众号“Swift社区”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“fzhanfei”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!


摘要

在现代软件开发中,测试是不可或缺的一环。然而,手动编写测试代码通常费时又枯燥,还容易出现遗漏。AI 工具如 GitHub Copilot 和 Tabnine 的出现,让“自动生成测试”成为可能。本文将围绕如何利用 AI 辅助生成高质量单元测试展开,从 prompt 编写技巧到集成 Jest(前端)与 Pytest(后端)的完整实践,带你掌握高效生成、精准覆盖的测试方法。

为什么我们需要 AI 自动生成测试?

每个开发者都知道测试很重要,但真正愿意“花时间写测试”的不多:

  • 写测试太繁琐,逻辑复杂的代码写起来更累;
  • 需求迭代频繁,测试常常来不及同步;
  • 很多团队没有完整的测试覆盖率规范和工具;
  • 测试代码“难写但没产出”,性价比低。

AI 工具能自动识别函数意图并生成初步的测试代码,甚至还能分析边界条件和异常情况,替我们做一些“重复脑力劳动”。

AI 工具概览:Copilot vs Tabnine

GitHub Copilot

基于 OpenAI Codex 引擎,Copilot 插件能实时在 IDE 中补全代码,包括测试代码生成。例如:

// 输入函数定义:
function sum(a, b) {
  return a + b;
}

// Copilot 自动生成测试:
test('adds 1 + 2 to equal 3', () => {
  expect(sum(1, 2)).toBe(3);
});

Tabnine

Tabnine 侧重于局部代码智能补全,支持多语言、私有模型部署,适合对隐私要求高的场景。但其测试代码自动补全能力目前弱于 Copilot。

结合测试框架实战演示

使用 Copilot + Jest 生成 JavaScript 测试

示例函数:
function isEven(num) {
  if (typeof num !== 'number') throw new Error('Invalid input');
  return num % 2 === 0;
}
Copilot 自动补全测试:
describe('isEven', () => {
  it('returns true for even numbers', () => {
    expect(isEven(4)).toBe(true);
  });

  it('returns false for odd numbers', () => {
    expect(isEven(5)).toBe(false);
  });

  it('throws error for non-numeric input', () => {
    expect(() => isEven('a')).toThrow('Invalid input');
  });
});
分析:
  • 覆盖了正常、异常、边界情况;
  • Copilot 自动补全结构完整;
  • 可以根据函数注释增强准确性。

使用 Copilot + Pytest 生成 Python 测试

示例函数:
def divide(a, b):
    if b == 0:
        raise ValueError("Cannot divide by zero")
    return a / b
Copilot 生成测试代码:
import pytest
from your_module import divide

def test_divide_normal():
    assert divide(10, 2) == 5

def test_divide_zero():
    with pytest.raises(ValueError):
        divide(5, 0)

Prompt 工程技巧:让 AI 更“懂你”

给函数写注释

/**
 * Check if a user is adult
 * @param {number} age - Age of the user
 * @returns {boolean}
 */
function isAdult(age) {
  return age >= 18;
}

注释中如果提及边界值、输入类型,Copilot 更容易理解函数意图。

手动写 1~2 个测试用例引导 AI 补全更多

test('returns true for 18', () => {
  expect(isAdult(18)).toBe(true);
});
// Copilot 会接着补全更多边界测试用例

实战场景案例

微服务接口测试生成

对一个 HTTP 接口函数:

// loginUser(email, password)

Prompt:
// @desc Test loginUser API with valid and invalid credentials

Copilot 自动生成:

describe('loginUser', () => {
  it('should return token for valid credentials', async () => {
    const res = await loginUser('test@example.com', 'password123');
    expect(res.token).toBeDefined();
  });

  it('should throw error for invalid credentials', async () => {
    await expect(loginUser('wrong', 'bad')).rejects.toThrow();
  });
});

数据库逻辑测试(Node + Prisma)

// createUser(name, email)

AI 自动补全:

test('creates user in DB', async () => {
  const user = await createUser('Alice', 'alice@example.com');
  expect(user).toHaveProperty('id');
});

QA 环节:常见问题解答

Q1:AI 生成的测试可靠吗?

  • 可以作为“初始版本”,仍需人工校验。
  • 建议对边界条件、异常处理手动补充。

Q2:AI 测试能覆盖所有逻辑吗?

  • 不能。AI 模型缺乏业务上下文,仅根据已有代码推测。
  • 更复杂的业务流程建议人工编写或引导式生成。

Q3:需要给 AI 喂什么样的 Prompt?

  • 最小可运行函数定义
  • 明确注释
  • 提供函数签名或接口文档
  • 少量引导性测试代码

总结

AI 自动生成测试并不能替代完整的测试工程,但它在提升效率、降低重复工作、加速开发验证上展现出极大价值。尤其是在初期项目搭建、接口验证阶段,AI 能生成一个“不错的起点”。

掌握 prompt 编写技巧、结合框架工具(如 Jest、Pytest)、通过人工精调完善边界和业务流程,是让 AI 成为你测试好搭档的关键。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐