testing

SQL and Rust testing guide covering test types, execution, and writing patterns. Three primary test formats: .sqltest (preferred for SQL compatibility across backends), TCL .test (legacy, being phased out), and Rust integration tests for regression and complex scenarios Run tests via make test for the full suite, make -C testing/sqltests run-cli for SQL tests, or cargo test for Rust tests .sqltest format uses simple declarative syntax with @database , test blocks, and expect sections; TCL tests are being converted automatically with the convert command, though manual adjustment of expected results is often needed due to database seed differences Every functional change requires a test that fails without the change and passes with it; prefer in-memory databases ( :memory: ) for test isolation

INSTALLATION
npx skills add https://github.com/tursodatabase/turso --skill testing
Run in your project or agent environment. Adjust flags if your CLI version differs.

SKILL.md

$2a

Single TCL test

make test-single TEST=select.test

SQL test runner

make -C testing/sqltests run-cli

OR

cargo run -p test-runner -- run

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: `testing/sqltests/tests/*.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 testing/sqltests 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

do_execsql_test_on_specific_db {:memory:} test-name {

SELECT 1 + 1;

} {2}


Location: `testing/*.test`

### Rust Integration

// tests/integration/test_foo.rs

#[test]

fn test_something() {

let conn = Connection::open_in_memory().unwrap();

// ...

}


## 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](https://github.com/tursodatabase/turso/blob/HEAD/.claude/skills/testing/../../../docs/testing.md) for schema.

## Logging During Tests

RUST_LOG=none,turso_core=trace make test

BrowserAct

Let your agent run on any real-world website

Bypass CAPTCHA & anti-bot for free. Start local, scale to cloud.

Explore BrowserAct Skills →

Stop writing automation&scrapers

Install the CLI. Run your first Skill in 30 seconds. Scale when you're ready.

Start free
free · no credit card