An extensible test framework for CLI programs, REST APIs, GraphQL, gRPC, browsers, and network protocols. Declarative YAML tests. Zero third-party dependencies.
suite: "User API Tests"
tags: [api, smoke]
tests:
- name: "Create user returns 201"
connector: http
steps:
- action: request
method: POST
path: /users
body:
name: "Alice"
email: "alice@example.com"
assert:
- status: 201
- body.name: {equals: "Alice"}
- elapsed: {less_than: 2s}
capture:
user_id: body.id
- name: "Verify user exists"
connector: http
steps:
- action: request
method: GET
path: /users/${capture.user_id}
assert:
- status: 200
- body.email: {equals: "alice@example.com"}Everything you need for comprehensive testing, in a single binary with zero dependencies.
Define tests as data, not code. Describe what to assert, not how to execute. Familiar to Playwright and assertion-based test users.
CLI, HTTP, SSH, gRPC, GraphQL, and browser connectors. Add new protocols by implementing a single Go interface.
Headless Chromium, Firefox, and WebKit via Chrome DevTools Protocol. Selectors, interactions, screenshots, network interception.
Parallel test execution distributed across nodes via SSH. Configurable concurrency, ramp-up, and duration. Locust-style scaling.
Every test captures timing data automatically. Structured binary TLV logs with nanosecond timestamps for benchmark analysis.
Built with the Go standard library. No node_modules, no pip packages, no dependency hell. One binary, every platform.
Built-in test coverage measurement with configurable thresholds. Know exactly which tests ran, which steps executed, which assertions fired.
Declarative fuzz targets integrated with Go's built-in fuzzing. Corpus management and automated edge-case discovery.
Equality, contains, regex, JSON path, HTTP status, headers, timing, collections. Extensible assertion library with clear error messages.
Test anything that speaks a protocol.
| Protocol | Connector | Status | Features |
|---|---|---|---|
| HTTP/1.1, HTTP/2 | http | v0.0.1 | TLS 1.2/1.3, self-signed certs, request/response assertions |
| REST APIs | http | v0.0.1 | CRUD, auth (Bearer, Basic, API key), JSON/XML, pagination, HATEOAS |
| GraphQL | http | v0.0.1 | Queries, mutations, subscriptions, introspection, variables |
| gRPC / Protobuf | grpc | v0.0.1 | Unary, client/server/bidi streaming, .proto + reflection |
| SSH | ssh | v0.0.1 | Key-based auth, command execution, tunneling |
| CLI Programs | cli | v0.0.1 | stdin/stdout/stderr, exit codes, filesystem side-effects |
| Chromium / Firefox / WebKit | browser | v0.0.1 | CDP, selectors, interactions, screenshots, network mocking |
| HTTP/3 (QUIC) | http | planned | Pending Go stdlib or from-scratch QUIC |
| SMTP | smtp | planned | Send, auth, envelope validation |
| IMAP | imap | planned | Mailbox access, search, fetch |
One command. No dependencies.
$ go install github.com/asymmetric-effort/scrutineer/cmd/scrutineer@latestOr download a pre-built binary from Releases for Linux, macOS, or Windows (AMD64 / ARM64).
# Install scrutineer
$ go install github.com/asymmetric-effort/scrutineer/cmd/scrutineer@latest
# Install browsers (for browser testing)
$ scrutineer browsers install
# Run tests
$ scrutineer run
# Run with JSON output
$ scrutineer run --format json
# Dump binary telemetry logs
$ scrutineer log-dump scrutineer.logBuild once, test everywhere.
AMD64 / ARM64
AMD64 / ARM64
AMD64 / ARM64