bun-test-basics — скилл для Claude Code: тесты на bun:test
Скилл подсказывает синтаксис bun:test: ассерты, describe/it, модификаторы skip, only, each и запуск тестов.
npx skills add secondsky/claude-skills --skill bun-test-basics -a claude-codeЧто делает bun-test-basics
Скилл даёт агенту шпаргалку по встроенному тестраннеру Bun. Внутри — как писать тесты через import { test, expect, describe } from "bun:test", какие файлы Bun находит сам (*.test.ts, *_test.ts, *.spec.ts, *_spec.ts), и как запускать: bun test, отдельный файл или фильтр по имени через --test-name-pattern.
Отдельный блок — модификаторы. test.skip пропускает тест, test.todo оставляет заглушку, test.failing помечает известный баг, test.each разворачивает таблицу кейсов, test.concurrent и test.serial управляют параллельностью. Есть список матчеров: равенство, числа, строки, массивы, объекты, исключения, промисы.
Осторожно с test.only. В Bun 1.3 и новее bun test в CI завершается с ненулевым кодом, если файл его использует. Это инструмент для локальной отладки, коммитить его не стоит. Из CLI-флагов пригодятся --timeout (по умолчанию 5000 мс), --bail, --watch, --randomize с --seed, а для CI — репортер --reporter=junit с --reporter-outfile.
Какие задачи решает
- написать первый тест на
bun:testбез чтения документации - развернуть таблицу однотипных кейсов через
test.each - пометить известный баг через
test.failing, чтобы он не валил сборку - выгрузить результаты тестов в JUnit XML для CI
- разобраться, почему
expect is not defined
Примеры запросов агенту
- покажи, как написать тест на bun:test с describe и expect
- сделай параметризованный тест через test.each для сложения
- как запустить только тесты с «addition» в имени?
Как установить bun-test-basics
1Через Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill bun-test-basics -a claude-code2Вручную: положить файлы
~/.claude/skills/bun-test-basics/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/bun-test-basics/
1Через Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill bun-test-basics -a codex2Вручную: положить файлы
.agents/skills/bun-test-basics/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill bun-test-basics -a cursor2Вручную: положить файлы
.cursor/skills/bun-test-basics/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install secondsky/claude-skills bun-test-basics2Вручную: положить файлы
.github/skills/bun-test-basics/SKILL.md1Через Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill bun-test-basics -a gemini-cli2Командой платформы
gemini skills install https://github.com/secondsky/claude-skills --path plugins/bun/skills/bun-test-basicsВручную: положить файлы
.devin/skills/bun-test-basics/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill bun-test-basics -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о bun-test-basics
Как установить bun-test-basics в Claude?
Выполните npx skills add secondsky/claude-skills --skill bun-test-basics -a claude-code. После этого скилл окажется в ~/.claude/skills/bun-test-basics/SKILL.md.
Что делает bun-test-basics?
Подсказывает агенту синтаксис bun:test: импорты, describe/it, модификаторы skip, only, todo, failing, each, набор матчеров и флаги CLI.
Чем опасен test.only?
В Bun 1.3 и новее bun test в CI падает с ненулевым кодом, если в файле остался test.only. Используйте его только для локальной отладки.
Исходный текст
SKILL.md · MIT
---
name: bun-test-basics
description: "Use for bun:test syntax, assertions, describe/it, test.skip/only/each, and basic patterns."
metadata:
version: "1.0.0"
license: MIT
---
# Bun Test Basics
Bun ships with a fast, built-in, Jest-compatible test runner. Tests run with the Bun runtime and support TypeScript/JSX natively.
## Quick Start
```bash
# Run all tests
bun test
# Run specific file
bun test ./test/math.test.ts
# Run tests matching pattern
bun test --test-name-pattern "addition"
```
## Writing Tests
```typescript
import { test, expect, describe } from "bun:test";
test("2 + 2", () => {
expect(2 + 2).toBe(4);
});
describe("math", () => {
test("addition", () => {
expect(1 + 1).toBe(2);
});
test("subtraction", () => {
expect(5 - 3).toBe(2);
});
});
```
## Test File Patterns
Bun discovers test files matching:
- `*.test.{js|jsx|ts|tsx}`
- `*_test.{js|jsx|ts|tsx}`
- `*.spec.{js|jsx|ts|tsx}`
- `*_spec.{js|jsx|ts|tsx}`
## Test Modifiers
```typescript
// Skip a test
test.skip("not ready", () => {
// won't run
});
// Only run this test
test.only("focus on this", () => {
// other tests won't run
});
// NOTE: in Bun 1.3+ `bun test` exits non-zero in CI when a file uses
// `test.only`. Use it for local debugging only — never commit it.
// Placeholder for future test
test.todo("implement later");
// Expected to fail
test.failing("known bug", () => {
throw new Error("This is expected");
});
```
## Parameterized Tests
```typescript
test.each([
[1, 1, 2],
[2, 2, 4],
[3, 3, 6],
])("add(%i, %i) = %i", (a, b, expected) => {
expect(a + b).toBe(expected);
});
// With objects
test.each([
{ a: 1, b: 2, expected: 3 },
{ a: 5, b: 5, expected: 10 },
])("add($a, $b) = $expected", ({ a, b, expected }) => {
expect(a + b).toBe(expected);
});
```
## Concurrent Tests
```typescript
// Run tests in parallel
test.concurrent("async test 1", async () => {
await fetch("/api/1");
});
test.concurrent("async test 2", async () => {
await fetch("/api/2");
});
// Force sequential when using --concurrent
test.serial("must run alone", () => {
// runs sequentially
});
```
## Common Matchers
```typescript
// Equality
expect(value).toBe(4); // Strict equality
expect(obj).toEqual({ a: 1 }); // Deep equality
expect(value).toStrictEqual(4); // Strict + type
// Truthiness
expect(value).toBeTruthy();
expect(value).toBeFalsy();
expect(value).toBeNull();
expect(value).toBeDefined();
expect(value).toBeUndefined();
// Numbers
expect(value).toBeGreaterThan(3);
expect(value).toBeGreaterThanOrEqual(3);
expect(value).toBeLessThan(5);
expect(value).toBeCloseTo(0.3, 5); // Floating point
// Strings
expect(str).toMatch(/pattern/);
expect(str).toContain("substring");
expect(str).toStartWith("Hello");
expect(str).toEndWith("world");
// Arrays
expect(arr).toContain(item);
expect(arr).toContainEqual({ a: 1 });
expect(arr).toHaveLength(3);
// Objects
expect(obj).toHaveProperty("key");
expect(obj).toHaveProperty("key", value);
expect(obj).toMatchObject({ a: 1 });
// Exceptions
expect(() => fn()).toThrow();
expect(() => fn()).toThrow("message");
expect(() => fn()).toThrow(CustomError);
// Async
await expect(promise).resolves.toBe(value);
await expect(promise).rejects.toThrow();
// Negation
expect(value).not.toBe(5);
```
## CLI Options
```bash
# Timeout per test (default 5000ms)
bun test --timeout 20
# Bail after N failures
bun test --bail
bun test --bail=10
# Watch mode
bun test --watch
# Random order
bun test --randomize
bun test --seed 12345
# Concurrent execution
bun test --concurrent
bun test --concurrent --max-concurrency 4
# Filter by name
bun test -t "pattern"
```
## Output Reporters
```bash
# Dots (compact)
bun test --dots
# JUnit XML (CI/CD)
bun test --reporter=junit --reporter-outfile=./results.xml
```
## Common Errors
| Error | Cause | Fix |
|-------|-------|-----|
| `Test timeout` | Test exceeds 5s | Use `--timeout` or optimize |
| `No tests found` | Wrong file pattern | Check file naming |
| `expect is not defined` | Missing import | Import from `bun:test` |
| `Assertion failed` | Test failure | Check expected vs actual |
## When to Load References
Load `references/matchers.md` when:
- Need complete matcher reference
- Custom matcher patterns
Load `references/cli-options.md` when:
- Full CLI flag reference
- Advanced execution options
© secondsky · MIT · secondsky/claude-skills