Jest - 特殊测试场景

在本章中,我们将介绍使用 Jest 编写测试时可能遇到的特殊场景。这些场景将帮助您更有效地设置测试、管理测试执行和组织测试。它们包括:

Jest - 设置和拆卸

在测试中,通常需要在测试运行之前设置某些条件(设置),并在测试运行之后进行清理(拆卸)。 Jest 提供了称为 hooks 的特殊函数来处理这个问题。

全局设置和拆卸

Jest 允许您指定在测试套件中的所有测试之前和之后运行的设置和拆卸脚本。

  • 全局设置:在所有测试运行之前运行一次。
  • 全局拆卸:在所有测试完成后运行一次。

您可以在 jest.config.js 中配置这些脚本:

module.exports = {
    globalSetup: './setup.js', // 设置脚本的路径
    globalTeardown: './teardown.js', // 拆卸脚本的路径
};

测试设置和拆卸

如果您需要为每个单独的测试设置和拆卸环境,则可以使用 beforeAllafterAllbeforeEachafterEach 挂钩。

  • beforeAll: 在所有测试之前运行一次。
  • afterAll: 在所有测试之后运行一次。
  • beforeEach: 在每个测试之前运行。
  • afterEach: 在每个测试之后运行。

示例

beforeAll(() => {
    // 在所有测试之前设置
});

afterAll(() => {
    // 在所有测试之后清理
});

beforeEach(() => {
    // 在每个测试之前设置
});

afterEach(() => {
    // 在每个测试之后清理
});
这些钩子有助于初始化和清理测试所需的任何状态或依赖项。

Jest - Before/After 钩子

Jest 提供了四个钩子来帮助准备测试环境:

beforeAll

此钩子在测试套件中的任何测试之前运行一次。它非常适合设置共享资源,如数据库连接、模拟 API 等。

beforeAll(() => {
    console.log('Before All Tests');
});

afterAll

此钩子在完成所有测试之后运行一次。它对于清理在 beforeAll 中创建的资源非常有用。

afterAll(() => {
    console.log('After All Tests');
});

beforeEach

此钩子在每个单独测试之前运行。它为每个测试提供新的设置,通常用于重置变量、模拟实现或清理共享状态。

beforeEach(() => {
    console.log('Before Each Test');
});

afterEach

此钩子在每个测试完成后运行。它通常用于恢复模拟、清除状态或清理资源。

afterEach(() => {
    console.log('After Each Test');
});

Jest - 分组测试

分组测试对于组织测试用例非常重要,尤其是在大型文件或多个相关测试中。Jest 提供 describe 块 来分组测试,帮助以逻辑方式构建它们并在需要时运行特定组。

使用 describe

describe 块用于对共享通用设置或上下文的测试进行分组。您还可以嵌套 describe() 块来改进结构。

describe('Math operations', () => {
    describe('Addition', () => {
        test('should add numbers correctly', () => {
            expect(2 + 3).toBe(5);
        });
    });

    describe('Subtraction', () => {
        test('should subtract numbers correctly', () => {
            expect(5 - 3).toBe(2);
        });
    });
}); 

这将测试分为两个主要类别:加法减法

嵌套describe()

您还可以嵌套describe()块以实现更具体的组织。

describe('User Login', () => {
    describe('with valid credentials', () => {
        test('should allow login', () => {
            expect(true).toBe(true);
        });
    });

    describe('with invalid credentials', () => {
        test('should reject login', () => {
            expect(false).toBe(false);
        });
    });
});

Jest - 跳过和聚焦测试

有时,您可能希望暂时跳过测试(用于调试或开发)或专注于特定测试。Jest 提供 .skip.only 来处理这些情况。

使用 .skip 跳过测试>

如果您想暂时跳过测试或整个测试套件,可以使用 .skip。这会阻止 Jest 运行测试,但它在测试输出中仍然可见。

  • test.skip(): 跳过单个测试。
  • describe.skip(): 跳过特定 describe 块内的所有测试。
test.skip('this test is skipped', () => {
    expect(true).toBe(false);
});

同样,您也可以跳过一整组测试:

describe.skip('Math Operations', () => {
    test('adds numbers correctly', () => {
        expect(1 + 2).toBe(3);
    });
});

使用 .only 专注于特定测试>

如果您只想运行一个测试或一组测试,则可以使用 .only 专注于它。

  • test.only(): 仅运行此特定测试。
  • describe.only(): 仅运行此 describe 块内的测试
test.only('this is the only test that runs', () => {
    expect(2 + 2).toBe(4);
});

您还可以关注整个测试组:

describe.only('Math Operations', () => {
    test('adds numbers correctly', () => {
        expect(1 + 2).toBe(3);
    });
});

注意: 使用 .only 时,Jest 将仅运行指定的测试并跳过其他测试。这对于调试代码库的特定部分非常有用。