describe定义测试套件,it定义具体用例;二者是bdd风格的核心函数,非语法关键字,用于构建“套件—用例”层级结构,支持嵌套与钩子,确保测试清晰、独立、可维护。

JavaScript 单元测试中,describe 和 it 是行为驱动开发(BDD)风格的核心组织单元,用于构建清晰、可读、可维护的测试结构。它们不是语法关键字,而是测试框架(如 Jest、Mocha、Jasmine)提供的函数,共同形成“套件—用例”层级关系。
describe:定义测试套件,划定作用域
每个 describe 表示一个逻辑功能模块或被测对象(如一个类、一个工具函数集合、一个 React 组件),它接收两个参数:一个描述性字符串和一个回调函数。该回调内可声明共享变量、设置钩子(beforeEach/afterEach),并嵌套其他 describe 或 it。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 内部定义的变量(如
let calculator)在本套件所有 it 中可访问,但不会泄漏到外部套件 - 支持多层嵌套,适合表达状态分支,例如:
describe('when user is logged in')包含多个权限相关 it - 钩子函数 beforeAll/afterAll 在整个套件开始前/结束后执行一次;beforeEach/afterEach 则在每个 it 前后各执行一次
it:定义具体测试用例,聚焦单一行为
it(也可写作 test,二者完全等价)代表一个最小可验证的行为断言,比如“加法函数传入 2 和 3 应返回 5”。它也接受描述字符串和回调函数两个参数。回调内只应包含:准备数据、调用被测代码、使用 expect 做断言。
- 每个 it 是独立执行的,其内部声明的变量是局部作用域,不影响其他用例
- 描述文字应使用完整句子,以 “should…” 或 “when… then…” 开头,例如:
it('should return 0 when given empty array', () => { ... }) - 避免在一个 it 中做多个断言;一个用例只验证一个关注点,失败时定位更精准
典型嵌套结构示例
以下是一个真实可用的 Jest 测试片段,展示层级如何反映业务逻辑:
describe('UserAuthService', () => {
let authService;
beforeEach(() => {
authService = new UserAuthService();
});
describe('#login', () => {
it('should resolve with user object on valid credentials', async () => {
const result = await authService.login('alice', 'pass123');
expect(result).toHaveProperty('id');
expect(result).toHaveProperty('name', 'Alice');
});
it('should reject with error on invalid password', async () => {
await expect(authService.login('alice', 'wrong')).rejects.toThrow('Invalid credentials');
});
});
describe('#logout', () => {
it('should clear session token', () => {
authService.setToken('abc123');
authService.logout();
expect(authService.getToken()).toBeNull();
});
});
});
常见误区与建议
- 不要把不同模块的测试混在同一个 describe 里——每个文件通常对应一个被测源文件,顶层 describe 名称应与被测对象一致
- 避免在 describe 外部或钩子中执行实际断言;expect 只应在 it 回调中出现
- 不推荐用 it.only 或 describe.skip 长期留在代码库中,它们仅用于临时调试
- 当多个 it 共享相同输入输出模式时,可考虑用 test.each(Jest)或 it.each 减少重复
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










