# Run Through Jepsen Tutorial
## Metadata
**Status**:: #x
**Zettel**:: #zettel/literature
**Created**:: [[2026-06-14]]
**URL**:: [github.com](https://github.com/jepsen-io/jepsen/blob/main/doc/tutorial/01-scaffolding.md)
**GitHub**:: [doitian/jepsen.etcdemo](https://github.com/doitian/jepsen.etcdemo)
## Synopsis
A test framework in Clojure that has integration with model checkers and fault injection (via Nemesis).
## Highlights
### Test scaffolding
- The option `{:pure-generators true}` is no longer needed in newer version of Jepsen.
### Database automation
- Jepsen uses hostnames n1, n2, … for nodes by default. Create a nodes file that each line is a hostname or IP and use `--nodes-file` to use the nodes file.
- Jepsen uses root:root by default.
- Use `(debian/install ["ca-certificates"])` to install missing packages.
- Jepsen use `scp` to download log files. Use test option `:remote` to specify following function to adopt the same auth mechanism used by the test:
```clojure
(def sftp-remote
"Like jepsen.control's default sshj remote, but without the shell-out SCP
wrapper. The SCP wrapper invokes the system `scp` binary, which can't use the
test's :ssh password and prompts interactively when no key is present. sshj's
own SFTP up/download honors username+password auth, so log-file downloads work
with root:root."
(-> (sshj/->SSHJRemote sshj/concurrency-limit nil nil nil)
retry/remote))
```
### Refining Tests
- Crash operations increase the space to explore thus degrade the testing performance. Convert crash operations to failures to improve the performance.