跳转到主要内容

shell命令的Doctest

项目描述

https://img.shields.io/pypi/v/docshtest.svg Travis CI build status Appveyor CI build status Test coverage

Shell Doctest - 快速、简洁、不拘小节

特性

  • 快速编写shell中的doctest

  • 在Windows、Linux、Python 2.7、Python 3.5+上运行

  • 简洁,因为它没有依赖其他项目,一个python文件

  • Doctest感觉

  • 可以混合python测试和shell测试

  • 仅检查标准输出(虽然,您可以将测试命令调整为输出对标准输出有意义的内容。)

当前状态

这是一个早期alpha代码。

主要问题和缺点

  • 块尾和最后的\n未正确测试

  • 在当前目录中执行测试,可能产生后果。

  • 不支持检查错误级别

  • 不支持适当的混合标准错误和标准输出内容

  • 仅限于bash测试(需要bash -n等效功能)

  • doctests命令块的粗略检测依赖于bash -n错误输出。不确定这是否非常稳定。

次要问题,但没有更好

  • 硬编码的第一处错误导致失败。

  • 硬编码对<BLANKLINE>的支持

可能的演变

  • 分析

  • 支持python文件(通过提取文档前进行)

  • 集成到nosetests?可能吗?

  • 输出着色?

  • 覆盖率集成?

安装

由于docshtest已在PyPI上提供,因此您无需下载代码的GIT版本。所以您应该能够运行

pip install docshtest

如果您已下载了GIT源代码,则可以通过传统方式安装当前版本

python setup.py install

如果您没有GIT源代码,但想从GitHub获取最新主分支或分支,您也可以

pip install git+https://github.com/vaab/docshtest

甚至可以选择特定的修订版本(分支/标签/提交)

pip install git+https://github.com/vaab/docshtest@master

用法

快速入门

docshtest是针对shell命令的doctest。这意味着它允许您在文档中集成一些shell代码示例及其预期输出,这些输出实际上是可验证的。

首先请注意,您正在阅读的这些文档行存储在一个README.rst文件中,该文件很快将包含一些如何运行docshtest以及预期结果的示例。

首先想到的例子就是运行docshtest在此文档上

docshtest README.rst

您可以自己检查,这已在CI流程中完成。

让我们向您介绍编写可测试文档的基础知识…

所以这是它的工作方式

$ cat <<'EOF' > mydoc.rst   ## First test file

This is standard RST, we can include runnable test blocks::

    $ echo 'hello world'
    hello world

EOF

请注意,需要缩进,以及在要执行命令之前需要"$ "(美元符号后跟一个空格)。请参阅以下部分以了解docshtest如何确定您的shell代码的结束以及输出的开始。

输出在您的命令结束之后开始,也需要缩进,并将与实际命令输出匹配。如果存在不匹配,测试将失败,并且docshtest将取消任何剩余的测试。如果匹配,则将执行下一个测试块。

要运行我们的测试

$ ./docshtest mydoc.rst
#0001 - success (line          4)

多行命令

多行命令通过一个非常简单但有点脏的方法检测,docshtest将简单地提供确切的代码,仅从第一行开始到shell解释器,如果shell解释器有抱怨,它将尝试再次添加下一行到输出。

这允许记录/测试多行shell代码,如

$ cat <<EOF > mydoc.rst   ## First test file

Multiline commands::

    $ for a in \$(seq 1 3); do
        echo "foo\$a"
      done
    foo1
    foo2
    foo3

EOF
$ ./docshtest mydoc.rst
#0001 - success (lines       4-6)

请注意,for循环体或done的额外缩进是不必要的,但为了阅读而推荐

$ cat <<EOF > mydoc.rst   ## First test file

Multiline commands::

    $ for a in \$(seq 1 3); do
      echo "foo\$a"
    done
    foo1
    foo2
    foo3

EOF
$ ./docshtest mydoc.rst
#0001 - success (lines       4-6)

失败的测试将显示预期输出和当前输出

$ cat <<EOF > mydoc.rst   ## First test file

Multiline commands::

    $ for a in \$(seq 1 3); do
      echo "foo\$a"
    done
    foo1
    foo4
    foo3

EOF
$ ./docshtest mydoc.rst
#0001 - failure (lines       4-6):
  command:
  | for a in $(seq 1 3); do
  |   echo "foo$a"
  | done
  expected:
  | foo1
  | foo4
  | foo3
  |
  output:
  | foo1
  | foo2
  | foo3
  |

但请注意,如果这些输出更大,将打印标准统一差异

$ cat <<EOF > mydoc.rst   ## First test file

Multiline commands::

    $ for a in \$(seq 1 6); do
      echo "foo\$a"
    done
    foo1
    foo3
    foo4
    foo5
    foo6

EOF
$ ./docshtest mydoc.rst
#0001 - failure (lines       4-6):
  command:
  | for a in $(seq 1 6); do
  |   echo "foo$a"
  | done
  expected:
  | foo1
  | foo3
  | foo4
  | foo5
  | foo6
  |
  output:
  | foo1
  | foo2
  | foo3
  | foo4
  | foo5
  | foo6
  |
  diff:
  --- expected
  +++ output
  @@ -1,4 +1,5 @@
   foo1
  +foo2
   foo3
   foo4
   foo5

修改所有执行代码

您可以通过--regex REGEX(或-r REGEX)选项在执行之前转换所有执行的代码

$ cat <<'EOF' > mydoc.rst   ## First test file

Our tested command is 'foo'

    $ foo 'hello world'
    hello world

EOF
$ ./docshtest -r '#\bfoo\b#echo#' mydoc.rst
#0001 - success (line          4)

条件测试

您可能希望有条件测试,仅在特定测试成功时触发。此功能使用元命令,这些命令作为给定块中的shell注释指定

$ cat <<'EOF' > mydoc.rst

Our tested command is 'foo'

    $ echo $ENVVAR       ## docshtest: if-success-set VAR_WAS_SET
    0
    $ echo 'var is set'  ## docshtest: ignore-if VAR_WAS_SET
    SHOULDFAIL
    $ echo 'var is not set'  ## docshtest: ignore-if-not VAR_WAS_SET
    SHOULDFAIL

EOF
$ ENVVAR=0 ./docshtest mydoc.rst
#0001 - ignored (line          4): if-success-set VAR_WAS_SET
#0002 - ignored (line          6): ignore-if VAR_WAS_SET
#0003 - failure (line          8):
  command:
  | echo 'var is not set'  ## docshtest: ignore-if-not VAR_WAS_SET
  expected:
  | SHOULDFAIL
  |
  output:
  | var is not set
  |

编码

docshtest将假设一切是“UTF-8”

$ cat <<'EOF' > mydoc.rst

Our tested command is 'foo'

    $ echo "éà"
    éà
    $ echo "é"
    e

EOF

$ ./docshtest mydoc.rst
#0001 - success (line          4)
#0002 - failure (line          6):
  command:
  | echo "é"
  expected:
  | e
  |
  output:
  | é
  |

命令行

docshtest支持常见的GNU标准--help选项

$ ./docshtest --help

docshtest - parse file and run shell doctests

Usage:

    docshtest (-h|--help)
    docshtest [[-r|--regex REGEX] ...] DOCSHTEST_FILE


Options:

    -r REGEX, --regex REGEX
              Will apply this regex to the lines to be executed. You
              can have more than one patterns by re-using this options
              as many times as wanted. Regexps will be applied one by one
              in the same order than they are provided on the command line.


Examples:

     ## run tests but replace executable on-the-fly for coverage support
     docshtest README.rst -r '/\bdocshtest\b/coverage run docshtest.py/'
<BLANKLINE>
<BLANKLINE>

第一个参数是必要的

$ ./docshtest
Error: please provide a rst filename as argument. (use '--help' option to get usage info)

当然,它应该是文件的路径

$ ./docshtest notexistent
Error: file 'notexistent' not found.

贡献

欢迎任何建议或问题。非常欢迎推送请求,请查看指南。

推送请求指南

您可以发送任何代码。我会查看它,并自己将其集成到代码库中,并保留您作为作者。这个过程可能需要时间,并且如果您遵循以下指南,将花费更少的时间

  • 尽量保持80列宽。

  • 按最小关注点分离您的提交。

  • 每个提交都应该通过测试(以便于二分查找)

  • 每个功能/错误修复提交应包含代码、测试和文档。

  • 欢迎提交包含排版或代码美化的小修改的前次提交。这些提交的提交说明中应使用标签 !minor

  • 提交消息应遵循 gitchangelog 规则(检查 git log 获取示例)

  • 如果提交解决了问题或完成了功能的实现,请在摘要中提及。

如果您对此处未解答的指南有任何疑问,请检查当前的 git log,您可能找到以前的提交,它将向您展示如何处理您的问题。

许可

版权所有 (c) 2012-2020 Valentin 实验室。

BSD 许可证 下授权。

变更日志

0.0.3 (2020-12-14)

修复

  • 支持 utf-8 编码。[Valentin 实验室]

0.0.1 (2019-02-11)

  • 首次导入。[Valentin 实验室]

项目详情


下载文件

下载您平台对应的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分发

docshtest-0.0.3.tar.gz (14.4 kB 查看哈希值)

上传时间 源代码

构建分发

docshtest-0.0.3-py2.py3-none-any.whl (13.0 kB 查看哈希值)

上传时间 Python 2 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面