关于 testing-unit
面向多语言开发者的单元测试技能,涵盖 JavaScript、Python、Go、Ruby、Swift 和 Java 的测试框架,重点是模拟依赖与隔离测试。
主要功能
- 01创建模拟对象与桩响应
- 02隔离测试并减少副作用
- 03支持多语言测试框架
- 04配置测试框架与测试环境
- 05在 CI/CD 中集成单元测试
适用场景
- 01为新函数编写单元测试
- 02模拟 API 或数据库依赖
- 03排查测试失败并重构代码
- 04在 TDD 工作流中验证实现
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ alphaonedev/ openclaw-graph --skill testing-unit安装后在 Claude Code 中输入/testing-unit确认已加载。
详细介绍
用途
此技能帮助 AI 使用 Jest/Vitest(JavaScript)、pytest(Python)、Go 的 testify、RSpec(Ruby)、XCTest(Swift)和 JUnit5(Java)等框架进行单元测试。它专注于模拟依赖项、创建存根,并确保测试隔离,以便在受控环境中验证代码行为。
适用场景
在编写新的单元测试、调试现有测试,或重构需要隔离测试的代码时使用此技能。可用于 TDD 工作流、模拟外部 API 或数据库,或确保函数能够独立运行。例如,当函数依赖网络调用时,可模拟该调用,以便在本地进行测试,而无需真实依赖项。
主要功能
- 模拟:为函数或模块创建模拟对象,例如在 Jest 中使用
jest.mock('module')替换实际实现。 - 存根:定义存根响应,例如在 pytest 中使用
monkeypatch.setattr()伪造对象方法。 - 隔离:隔离运行测试,例如使用 Go 的 testify 进行断言而不产生副作用,或使用 JUnit5 的
@TempDir隔离文件操作。 - 特定框架功能:支持 Jest/Vitest 断言(例如
expect().toBe())、pytest 的 setup/teardown fixture、RSpec 的double模拟对象、XCTest 的setUp()隔离功能,以及 JUnit5 的@Mock注解。 - 配置格式:使用 Jest 的
jest.config.js和{ testEnvironment: 'node', setupFilesAfterEnv: ['<rootDir>/setupTests.js'] }配置自定义模拟;使用 pytest 的pytest.ini和[pytest] addopts = -v启用详细输出。
使用模式
要完成单元测试任务,请按以下步骤操作:1)确定要模拟的依赖项(例如 HTTP 调用)。2)在测试文件中设置模拟对象或存根。3)编写断言以验证输出。4)使用相应标志运行测试。对于 TDD,先编写一个失败的测试,再实现代码。在 Jest 中,使用 describe() 块组织测试;在 pytest 中,使用 fixture 进行共享设置。始终通过避免全局状态来隔离测试——在 Jest 中使用 beforeEach(),或在 pytest 中使用 @pytest.fixture(scope='function')。
常用命令/API
- Jest/Vitest:使用
npx jest --watchAll以交互模式运行测试;使用jest.mock('axios', () => ({ get: jest.fn().mockResolvedValue({ data: {} }) }));模拟模块。API:使用expect(value).toEqual(expected)进行断言。 - pytest:使用
pytest tests/ -v --cov执行测试并生成覆盖率;使用def test_function(monkeypatch): monkeypatch.setattr('module.func', lambda: 'stubbed')存根函数。API:使用@pytest.fixture实现隔离,例如def mock_db(): return {'query': lambda: []}。 - Go(testify):使用
go test -v ./...构建,并使用 testify 中的mock.Mock;例如,mockCtrl := gomock.NewController(t); mockObj := NewMockInterface(mockCtrl); mockObj.EXPECT().Method().Return(value)。 - RSpec:通过
rspec spec/运行;使用double('Object', method: -> 'stubbed')创建双重对象。API:使用expect { code }.to change { something }。 - XCTest:使用
xcodebuild test编译并运行;在 Swift 中使用protocol存根进行模拟,例如class MockService: ServiceProtocol { func fetchData() -> Data { return Data() } }。 - JUnit5:通过
./gradlew test执行;使用 Mockito:@ExtendWith(MockitoExtension.class) public class TestClass { @Mock private Dependency dep; @InjectMocks private ClassUnderTest cut; }。如果集成外部服务,请设置$API_KEY等环境变量,以便在测试中进行身份验证。
集成说明
通过将单元测试嵌入 CI/CD 管道来集成此技能,例如,在 GitHub Actions 工作流中添加 Jest,并使用 run: npm test。对于多语言项目,可使用 Nx 等工具为 Jest 和 pytest 设置 monorepo。配置环境变量来存放密钥,例如,在测试运行器中导出 $DATABASE_URL。关联 Jest 的 Istanbul 或 pytest 的 Coverage.py 等代码覆盖率工具;调试时,确保模拟对象通过 --no-cov 标志遵循这些工具的设置。对于依赖 API 的测试,将 $SERVICE_API_KEY 等环境变量注入测试命令,例如 pytest --api-key=$SERVICE_API_KEY。
错误处理
以明确的方式处理常见错误:对于 Jest 中的断言失败,检查堆栈跟踪,并使用 jest.fn().mockImplementation() 调试模拟对象;如果未调用模拟对象,添加 .toHaveBeenCalled() 断言。在 pytest 中,通过 try/except 包装来捕获 fixture 错误,例如:def test_with_fixture(fix): try: fix.setup() except Exception as e: pytest.fail(str(e))。对于 Go,使用 testify 的 assert.NoError(t, err) 在出现错误时让测试失败。在 RSpec 中,使用 allow(double).to receive(:method).and_raise(Error) 处理 double。对于 JUnit5,使用 @Test(expected = Exception.class) 处理预期的失败。始终使用 stub 隔离容易出错的代码,以防止错误级联;使用 jest --debug 或 pytest -s 等详细输出标志重新运行,以获取详细信息。
具体使用示例
-
Jest 模拟示例:要测试获取数据的函数,请模拟 fetch API:
jest.mock('node-fetch'); const fetch = require('node-fetch'); fetch.mockResolvedValue({ json: () => Promise.resolve({ data: 'mocked' }) }); test('fetches data', async () => { expect(await fetchData()).toEqual('mocked'); }); -
pytest Fixture 示例:要隔离依赖数据库的测试,请使用 fixture:
import pytest @pytest.fixture def mock_db(): return {'query': lambda: [{'id': 1}]} def test_query(mock_db): assert mock_db['query']()[0]['id'] == 1
图关系
- 相关:testing-integration(用于更全面的测试工作流)、code-debugging(用于修复测试失败)
- 聚类:testing(作为测试集群的一部分)、code-execution(用于在隔离环境中运行测试)
- 依赖:environment-setup(用于管理模拟对象等测试依赖)