К основному содержанию
скилл Claude Code CX Codex Cursor GitHub Copilot

testing — скилл для Claude Code: писать и запускать тесты

Скилл помогает писать тесты для SQL и Rust: учит выбирать между форматами .sqltest, TCL и интеграционными тестами, показывает команды для запуска.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add tursodatabase/turso --skill testing -a claude-code
Открыть на GitHub

Что делает testing

Скилл охватывает три основных типа тестов. .sqltest — предпочтительный формат для новых тестов SQL-совместимости, они живут в sqlite/conformance/sqlite-sqltests/. TCL-тесты в папке testing/ постепенно вытесняются. Rust-интеграционные тесты в tests/integration/ нужны для регрессионных проверок и сложных сценариев.

Для запуска есть несколько команд: make test для основной сборки, make -C sqlite/conformance run-cli или cargo run -p sqltest -- run <file> для SQL-тестов, cargo test для Rust-тестов. При писании .sqltest нужно сначала конвертировать TCL командой cargo run -- convert, потом проверить результат через make -C sqlite/conformance run-rust и при необходимости подправить ожидаемый результат под новую базу.

Для утверждений в Rust советует использовать крейт asserting — его методы читаются проще, чем встроенные макросы. Есть встроенные помощники вроде row!, column и проверок плана запросов. Главное правило: каждое функциональное изменение должно иметь тест, который падает без этого изменения и проходит с ним.

Какие задачи решает

  • выбрать формат теста для своей задачи
  • конвертировать старые TCL-тесты в новый .sqltest
  • написать интеграционный тест на Rust с читаемыми утверждениями
  • запустить отдельный тест или целую сборку

Примеры запросов агенту

  • Покажи, как написать тест .sqltest для проверки SELECT с WHERE
  • Помоги конвертировать TCL-тест командой convert и исправить результат
  • Напиши Rust-тест с asserting для проверки ошибки в подключении

Как установить testing

1Через Skills CLI (Vercel)

npx skills add tursodatabase/turso --skill testing -a claude-code

2Вручную: положить файлы

~/.claude/skills/testing/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/testing/

Из того же набора10

Весь набор →
code-quality tursodatabase Набор правил корректности, Rust-паттернов и принципов без переусложнения для агентов, которые пишут код в вашем проекте. Claude Code CX Codex Cursor +1 1 800установок storage-format tursodatabase Справочник по формату файла SQLite: заголовок, страницы, B-деревья, ячейки, overflow и freelist, с привязкой к коду Turso. Claude Code CX Codex Cursor +1 1 300установок async-io-model tursodatabase Обучает агента архитектуре асинхронного ввода-вывода в Turso: явным стейт-машинам, типу IOResult и защите от багов повторного входа. Claude Code CX Codex Cursor +1 1 300установок debugging tursodatabase Скилл по отладке tursodb: сравнить байткод с SQLite, включить трейс-логи, прогнать ThreadSanitizer, воспроизвести баг по seed и замерить стек. Claude Code CX Codex Cursor +1 1 300установок index-knowledge tursodatabase Скилл автоматически создаёт иерархическую документацию AGENTS.md для кодовой базы. Анализирует структуру проекта, оценивает сложность каждой папки и генерирует файлы с инструкциями для ИИ-агентов. Claude Code CX Codex Cursor +1 1 300установок mvcc tursodatabase Справочник по экспериментальному MVCC в кодовой базе Turso: многоверсионность строк, изоляция снимков и ограничения памяти. Пригодится при отладке и разработке ядра базы данных. Claude Code CX Codex Cursor +1 1 200установок differential-fuzzer tursodatabase Скилл помогает запускать дифференциальный фаззер Turso и разбирать расхождения с SQLite. Нужен при поиске ошибок корректности в сгенерированных SQL-запросах. Claude Code CX Codex Cursor +1 1 200установок transaction-correctness tursodatabase Объясняет механику транзакций в Turso: как работает WAL, чекпоинты, восстановление после сбоя и правила конкурентного доступа. Claude Code CX Codex Cursor +1 1 200установок

Похожие

creating-oracle-to-postgres-migration-bug-report официальный github Создаёт структурированные баг-репорты для расхождений между Oracle и PostgreSQL при миграции. Нужен, когда дефект требуется описать с причиной и проверкой исправления. GitHub Copilot 1 800установок code-documenter https://github.com/Jeffallan Создаёт и проверяет документацию к коду, API и руководства. Нужен при добавлении docstring, JSDoc или спецификации OpenAPI. Claude Code CX Codex Cursor +1 5 700установок scaffolding-oracle-to-postgres-migration-test-project официальный github Создаёт пустой xUnit-проект интеграционных тестов для Oracle в .NET-решении. Нужен перед написанием базовых тестов на этапе Phase 3. GitHub Copilot 1 700установок playwright-expert https://github.com/Jeffallan Настраивает E2E-тестирование на Playwright, создаёт классы Page Object и помогает устранять нестабильные проверки через трассировку. Claude Code CX Codex Cursor +1 5 300установок debugging-wizard https://github.com/Jeffallan Разбирает ошибки, стек-трейсы и логи, чтобы найти причину сбоя. Нужен при падениях, исключениях и неожиданном поведении кода. Claude Code CX Codex Cursor +1 5 100установок state-machine jakubkrehel Создаёт временную страницу со всеми достижимыми состояниями одного компонента, мок-данными и переключателем. Нужен для правки визуальных состояний без изменений в самом компоненте. Claude Code CX Codex Cursor +1 3 500установок improve-codebase-architecture Matt Pocock Скилл ищет архитектурные узкие места в кодовой базе и показывает варианты углубления модулей в HTML-отчёте. Подойдёт для ревью перед рефакторингом. Claude Code 1 163 035установок design-taste-frontend Leonxlnx Скилл задаёт арт-дирекцию для публичных страниц и рабочих экранов, а затем проверяет результат в браузере по скриншотам. Нужен, когда интерфейс выглядит шаблонным или недоработанным. Claude Code CX Codex Cursor +1 673 100установок

Вопросы о testing

Как установить testing в Claude Code?

Выполни npx skills add tursodatabase/turso --skill testing -a claude-code. Скилл появится в ~/.claude/skills/testing/SKILL.md.

Какой формат теста выбрать?

.sqltest — предпочтительный выбор для новых тестов SQL-совместимости. TCL-тесты в testing/ вытесняются. Rust-интеграционные тесты используй для регрессионных проверок и сложных сценариев.

Как конвертировать TCL-тест в .sqltest?

Используй команду cargo run -- convert <путь_к_TCL_файлу> -o <выходная_папка>. Потом проверь результат через make -C sqlite/conformance run-rust и вручную исправь ожидаемый результат, если база была сгенерирована с другим seed.

Исходный текст

SKILL.md · MIT
---
name: testing
description: How to write tests, when to use each type of test, and how to run them. Contains information about conversion of `.test` to `.sqltest`, and how to write `.sqltest` and rust tests
---
# Testing Guide

## Test Types & When to Use

| Type | Location | Use Case |
|------|----------|----------|
| `.sqltest` | `sqlite/conformance/sqlite-sqltests/` | SQL compatibility. **Preferred for new tests** |
| TCL `.test` | `testing/` | Legacy SQL compat (being phased out) |
| Rust integration | `tests/integration/` | Regression tests, complex scenarios |
| Fuzz | `tests/fuzz/` | Complex features, edge case discovery |

**Note:** TCL tests are being phased out in favor of the `.sqltest` suites in `sqlite/conformance/`. The `.sqltest` format allows the same test cases to run against multiple backends (CLI, Rust bindings, etc.).

## Running Tests

```bash
# Main test suite (TCL compat, sqlite3 compat, Python wrappers)
make test

# Single TCL test
make test-single TEST=select.test

# SQL test runner
make -C sqlite/conformance run-cli

# OR
cargo run -p sqltest -- run <test-file or directory>

# Rust unit/integration tests (full workspace)
cargo test
```

## Writing Tests

### .sqltest (Preferred)
```
@database :default:

test example-addition {
    SELECT 1 + 1;
}
expect {
    2
}

test example-multiple-rows {
    SELECT id, name FROM users WHERE id < 3;
}
expect {
    1|alice
    2|bob
}
```
Location: `sqlite/conformance/sqlite-sqltests/*.sqltest`

You must start converting TCL tests with the `convert` command from the test runner (e.g `cargo run -- convert <TCL_test_path> -o <out_dir>`). It is not always accurate, but it will convert most of the tests. If some conversion emits a warning you will have to write by hand whatever is missing from it (e.g unroll a for each loop by hand). Then you need to verify the tests work by running them with `make -C sqlite/conformance run-rust`, and adjust their output if something was wrong with the conversion. Also, we use harcoded databases in TCL, but with `.sqltest` we generate the database with a different seed, so you will probably need to change the expected test result to match the new database query output. Avoid changing the SQL statements from the test, just change the expected result 

### TCL
```tcl
do_execsql_test_on_specific_db {:memory:} test-name {
  SELECT 1 + 1;
} {2}
```
Location: `testing/*.test`

### Rust Integration
```rust
// tests/integration/test_foo.rs
#[test]
fn test_something() {
    let conn = Connection::open_in_memory().unwrap();
    // ...
}
```

### Assertions

Prefer the [`asserting`](https://github.com/innoave/asserting) crate for anything more than trivial assertions. The assertions it offers are extensive
and make tests more readable. Some simple examples:

```rust
use asserting::prelude::*;

assert_that!(conn.execute("SELECT * FROM t1;")).is_err();
assert_that_code!(|| parse(bad_input)).panics_with_message("unexpected token");

assert_that!(&rows)
    .has_length(3)
    .any_satisfies(|r| r
    .name == "bob")
    .first_element_ref()
    .is_equal_to(&Row { id: 1, name: "alice".into() });

assert_that!(&header)
    .named("page 2 header")
    .satisfies_with_message("be a leaf table page", |h| h[0] == 0x0d);

// soft assertions: mark the test as failed but don't stop
verify_that!(&plan)
    .starts_with("SEARCH")
    .contains("USING INDEX")
    .soft_panic();
```

`crate::assertions` adds `row!` for result rows, plus `column` and query-plan
assertions:

```rust
use crate::assertions::{AssertColumn, AssertQueryPlan, Cell, NULL};

assert_that!(limbo_exec_rows(&conn, "SELECT id, name FROM t ORDER BY id"))
    .is_equal_to(vec![row![1, "alice"], row![2, NULL]]);

assert_that!(limbo_exec_rows(&conn, "SELECT id FROM t WHERE id = 1"))
    .single_element()
    .is_equal_to(row![1]);

assert_that!(limbo_exec_rows(&conn, "SELECT id, name FROM t"))
    .column(1)
    .contains(Cell::from("alice"));

assert_that!(limbo_exec_rows(&conn, "EXPLAIN QUERY PLAN SELECT id FROM t WHERE name = 'a'"))
    .uses_index("idx_name")
    .searches_table("t")
    .has_table_access_order(["t"]);
```

## Key Rules

- Every functional change needs a test
- Test must fail without change, pass with it
- Prefer in-memory DBs: `:memory:` (sqltest) or `{:memory:}` (TCL)
- Don't invent new test formats. Follow existing patterns
- Write tests first when possible

## Test Database Schema

`testing/system/testing.db` has `users` and `products` tables. See [docs/testing.md](../../../docs/testing.md) for schema.

## Logging During Tests

```bash
RUST_LOG=none,turso_core=trace make test
```
Output: `testing/system/test.log`. Warning: very verbose.

© tursodatabase · MIT · tursodatabase/turso

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой