Skip to content

Commit 3163456

Browse files
committed
doc: Expand rustdoc's documentation for testing
1 parent fe8b360 commit 3163456

File tree

1 file changed

+89
-0
lines changed

1 file changed

+89
-0
lines changed

doc/rustdoc.md

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,92 @@ javascript and a statically-generated search index. No special web server is
8585
required for the search.
8686

8787
[sundown]: https://github.com/vmg/sundown/
88+
89+
# Testing the Documentation
90+
91+
`rustdoc` has support for testing code examples which appear in the
92+
documentation. This is helpful for keeping code examples up to date with the
93+
source code.
94+
95+
To test documentation, the `--test` argument is passed to rustdoc:
96+
97+
~~~
98+
rustdoc --test crate.rs
99+
~~~
100+
101+
## Defining tests
102+
103+
Rust documentation currently uses the markdown format, and code blocks can refer
104+
to any piece of code-related documentation, which isn't always rust. Because of
105+
this, only code blocks with the language of "rust" will be considered for
106+
testing.
107+
108+
~~~
109+
```rust
110+
// This is a testable code block
111+
```
112+
113+
```
114+
// This is not a testable code block
115+
```
116+
117+
// This is not a testable code block (4-space indent)
118+
~~~
119+
120+
In addition to only testing "rust"-language code blocks, there are additional
121+
specifiers that can be used to dictate how a code block is tested:
122+
123+
~~~
124+
```rust,ignore
125+
// This code block is ignored by rustdoc, but is passed through to the test
126+
// harness
127+
```
128+
129+
```rust,should_fail
130+
// This code block is expected to generate a failure
131+
```
132+
~~~
133+
134+
Rustdoc also supplies some extra sugar for helping with some tedious
135+
documentation examples. If a line os prefixed with a `#` character, then the
136+
line will not show up in the HTML documentation, but it will be used when
137+
testing the code block.
138+
139+
~~~
140+
```rust
141+
# // showing 'fib' in this documentation would just be tedious and detracts from
142+
# // what's actualy being documented.
143+
# fn fib(n: int) { n + 2 }
144+
145+
do spawn { fib(200); }
146+
```
147+
~~~
148+
149+
The documentation online would look like `do spawn { fib(200); }`, but when
150+
testing this code, the `fib` function will be included (so it can compile).
151+
152+
## Running tests (advanced)
153+
154+
Running tests often requires some special configuration to filter tests, find
155+
libraries, or try running ignored examples. The testing framework that rustdoc
156+
uses is build on `extra::test`, which is also used when you compile crates with
157+
rustc's `--test` flag. Extra arguments can be passed to rustdoc's test harness
158+
with the `--test-args` flag.
159+
160+
~~~
161+
// Only run tests containing 'foo' in their name
162+
rustdoc --test lib.rs --test-args 'foo'
163+
164+
// See what's possible when running tests
165+
rustdoc --test lib.rs --test-args '--help'
166+
167+
// Run all ignored tests
168+
rustdoc --test lib.rs --test-args '--ignored'
169+
~~~
170+
171+
When testing a library, code examples will often show how functions are used,
172+
and this code often requires `use`-ing paths from the crate. To accomodate this,
173+
rustdoc will implicitly add `extern mod <crate>;` where `<crate>` is the name of
174+
the crate being tested to the top of each code example. This means that rustdoc
175+
must be able to find a compiled version of the library crate being tested. Extra
176+
search paths may be added via the `-L` flag to `rustdoc`.

0 commit comments

Comments
 (0)