Pytest插件,可以直接从Markdown文件运行测试
项目描述
markdown-pytest
markdown-pytest
插件是一个pytest
插件,允许您直接从Markdown文件运行测试。
使用此插件,您可以在Markdown文件中编写测试,使文档示例易于阅读、理解和维护。测试的执行方式与其他Pytest测试相同。
Markdown文件内容示例
<!-- name: test_assert_true -->
```python
assert True
```
将显示为
assert True
限制
由于Markdown中没有添加属性到代码块的方法,此模块仅运行带有特殊注释的测试。
此注释的一般格式如下:由分号分隔的部分是冒号分隔的键值对,最后一个分号是可选的,不包含冒号的部分将被忽略。
示例
<!-- key1: value1; key2: value2 -->
多行示例
<!--
key1: value1;
key2: value2;
-->
此注释应放置在代码块之前,正好位于反引号上方,例如
<!-- name: test_name -->
```python
```
需要 name
键,不包含此键的块将被忽略。
一些 Markdown 解析器支持注释周围有两条或三条破折号,此模块支持两种变体。可选的 case
参数可能用于子测试,请参阅“代码拆分”部分。
此外,可以在注释块内放置代码块以隐藏一些初始化信息,不让读者看到。
<!-- name: test_name
```python
init_some_variable = 123
```
-->
```python
assert init_some_variable == 123
```
常见解析规则
此模块使用自己的非常简单的 Markdown 解析器,它只支持代码块解析。通常,文件的解析行为遵循以下规则
-
没有
<!-- name: test_name -->
注释的代码将不会执行。 -
注释符号允许有两条或三条破折号
例如以下行将被解析为相同的内容
<!-- name: test_name --> <!--- name: test_name ---> <!-- name: test_name ---> <!--- name: test_name -->
-
具有相同名称的代码块将被合并为一个代码块并执行一次
-
可选的注释参数
case
将执行该块作为子测试。 -
缩进的代码块将被向左移动。
例如
<!-- name: test_name --> ```python assert True ```
等同于
<!-- name: test_name --> ```python assert True ```
代码拆分
您可以将测试拆分为多个具有相同测试名称的块
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]
```
将显示为
此块执行导入
from itertools import chain
chain
使用示例
assert list(chain(range(2), range(2))) == [0, 1, 0, 1]
子测试支持
当然,您可以通过在 Markdown 注释中添加 case: case_name
来简单地分解测试为子测试。
<!-- 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
```
将显示为
from collections import Counter
counter = Counter()
counter["foo"] += 1
assert counter["foo"] == 1
虚构代码示例
没有 <!-- name: test_name -->
注释的代码将不会执行。
```python
from universe import antigravity, WrongPlanet
try:
antigravity()
except WrongPlanet:
print("You are on the wrong planet.")
exit(1)
```
将显示为
from universe import antigravity, WrongPlanet
try:
antigravity()
except WrongPlanet:
print("You are on the wrong planet.")
exit(1)
使用示例
此 README.md 文件可以像这样进行测试
$ 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%]