Pytest plugin for runs tests directly from Markdown files
Project description
markdown-pytest
The markdown-pytest
plugin is a pytest
plugin that allows you to run tests
directly from Markdown files.
With this plugin, you can write your tests inside Markdown files, making it easy to read, understand and maintain your documentation samples. The tests are executed just like any other Pytest tests.
Sample of markdown file content:
<!-- name: test_assert_true -->
```python
assert True
```
Will be shown as
assert True
Restrictions
Since there is no way to add attributes to a block of code in markdown, this module only runs those tests that are marked with a special comment.
The general format of this comment is as follows: parts separated by semicolons are a colon separated key-value pairs, the last semicolon is optional, and parts not containing a colon bill be ignored.
Example:
<!-- key1: value1; key2: value2 -->
Multiline example:
<!--
key1: value1;
key2: value2;
-->
This comment should be placed right before the block of code, exactly upper the backticks, for example:
<!-- name: test_name -->
```python
```
The name
key is required, and blocks that do not contain it will be ignored.
Some Markdown parsers support two or three dashes around comments, this module
supports both variants. The case
parameter is optional and might be used for
subtests, see "Code split" section.
Additionally, a code block can be put inside the comment block to hide some initialization from the readers.
<!-- name: test_name
```python
init_some_variable = 123
```
-->
```python
assert init_some_variable == 123
```
Common parsing rules
This module uses its own, very simple Markdown parser, which only supports code block parsing. In general, the parsing behavior of a file follows the following rules:
-
Code without
<!-- name: test_name -->
comment will not be executed. -
Allowed two or three dashes in the comment symbols
For example following line will be parsed identically:
<!-- name: test_name --> <!--- name: test_name ---> <!-- name: test_name ---> <!--- name: test_name -->
-
Code blocks with same names will be merged in one code and executed once
-
The optional comment parameter
case
will execute the block as a subtest. -
Indented code blocks will be shifted left.
For example:
<!-- name: test_name --> ```python assert True ```
Is the same of:
<!-- name: test_name --> ```python assert True ```
Code split
You can split a test into multiple blocks with the same test name:
Markdown:
This block performs import:
<!-- name: test_example -->
```python
from itertools import chain
```
`chain` usage example:
<!-- name: test_example -->
```python
assert list(chain(range(2), range(2))) == [0, 1, 0, 1]
```
Will be shown as
This block performs import:
from itertools import chain
chain
usage example:
assert list(chain(range(2), range(2))) == [0, 1, 0, 1]
subtests support
Of course, you can break tests into subtests by simply adding case: case_name
to the markdown comment.
<!-- name: test_counter -->
```python
from collections import Counter
```
<!--
name: test_counter;
case: initialize_counter
-->
```python
counter = Counter()
```
<!--
name: test_counter;
case: assign_counter_value
-->
```python
counter["foo"] += 1
assert counter["foo"] == 1
```
Will be shown as
from collections import Counter
counter = Counter()
counter["foo"] += 1
assert counter["foo"] == 1
Fictional Code Examples
Code without <!-- name: test_name -->
comment will not be executed.
```python
from universe import antigravity, WrongPlanet
try:
antigravity()
except WrongPlanet:
print("You are on the wrong planet.")
exit(1)
```
Will be shown as
from universe import antigravity, WrongPlanet
try:
antigravity()
except WrongPlanet:
print("You are on the wrong planet.")
exit(1)
Usage example
This README.md file can be tested like this:
$ pytest -v README.md
======================= test session starts =======================
plugins: subtests, markdown-pytest
collected 3 items
README.md::test_assert_true PASSED [ 33%]
README.md::test_example PASSED [ 66%]
README.md::test_counter SUBPASS [100%]
README.md::test_counter SUBPASS [100%]
README.md::test_counter PASSED [100%]
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file markdown_pytest-0.3.2.tar.gz
.
File metadata
- Download URL: markdown_pytest-0.3.2.tar.gz
- Upload date:
- Size: 8.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.7.1 CPython/3.11.7 Darwin/23.4.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | ddb1b746e18fbdaab97bc2058b90c0b3d71063c8265a88a8c755f433f94a5e12 |
|
MD5 | e4a13fb0002b1b982371f875cc916aba |
|
BLAKE2b-256 | cac81da6e4461b88418469a1349e0da0973fd6e0e00c08a03bacc53a0553cb00 |
File details
Details for the file markdown_pytest-0.3.2-py3-none-any.whl
.
File metadata
- Download URL: markdown_pytest-0.3.2-py3-none-any.whl
- Upload date:
- Size: 9.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.7.1 CPython/3.11.7 Darwin/23.4.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2faabe7bfba232b2b2075d6b552580d370733c5ff77934f41bcfcb960b06d09f |
|
MD5 | 05817384f1526a493fa0af573061088d |
|
BLAKE2b-256 | cfa11592c58d441f7385bdcec53b06a4865a188c00f19abeff955a129e99f7c4 |