8

os.popen呼び出しでドキュメントの例を汚染しないコマンドライン(ターミナル)から起動することを目的としたスクリプトをテストするためのpython doctest文字列を作成する方法はありますか?

#!/usr/bin/env python
# filename: add
"""
Example:
>>> import os
>>> os.popen('add -n 1 2').read().strip()
'3'
"""

if __name__ == '__main__':
    from argparse import ArgumentParser
    p = ArgumentParser(description=__doc__.strip())
    p.add_argument('-n',type = int, nargs   = 2, default = 0,help  = 'Numbers to add.')
    p.add_argument('--test',action = 'store_true',help  = 'Test script.')
    a = p.parse_args()
    if a.test:
        import doctest
        doctest.testmod()
    if a.n and len(a.n)==2:
        print a.n[0]+a.n[1]

popenを使用せずにdoctest.testmod()を実行すると、スクリプトがbash(またはDOS)シェルではなくpythonシェル内で実行されるため、テストが失敗するだけです。

LLNLの高度なPythonコースでは、.pyモジュールとは別のファイルにスクリプトを配置することを提案しています。ただし、doctest文字列は、引数の解析を行わずに、モジュールのみをテストします。そして、私のos.popen()アプローチは、サンプルのドキュメントを汚染します。もっと良い方法はありますか?

4

3 に答える 3

4

あなたが望む答えのようなものを見つけました: shell-doctest

于 2012-07-12T05:14:21.203 に答える
1

doctestPython コードを実行するためのものなので、どこかで変換を行う必要があります。コマンドライン インターフェースを 経由で直接テストすることに決めた場合、1 つの可能性は、に渡す前にdoctestへの正規表現置換を行い、ラッパーを取り出すことです。__doc__argparseos.popen

clean = re.sub(r"^>>> os\.popen\('(.*)'\).*", r"% \1", __doc__)
p = ArgumentParser(description=clean, ...)

(もちろん、あなたが「良い」と考えるものに応じて、それを行うためのあらゆる種類のより良い方法があります).

これにより、エンドユーザーのためにクリーンアップされます。ソース内でよりきれいに見えるようにしたい場合は、別の方法を使用できます。コマンドラインの例を docstring に入れ、doctest.testmodule() を使用しないでください。docstring を実行しdoctest.script_from_examples、後処理してos呼び出しを挿入します。(次に、何かに埋め込んで でテストできるようにする必要がありますrun_docstring_examples。)doctest入力が有効な python であるかどうかは気にしないので、次のことができます。

>>> print doctest.script_from_examples("""
Here is a commandline example I want converted:
>>> add -n 3 4
7
""")
# Here is a commandline example I want converted:
add -n 3 4
# Expected:
## 7

これにより、ヘルプに python プロンプトが引き続き表示さ>>>れます。これが気になる場合は、文字列を双方向で処理する必要があるかもしれません。

于 2012-04-02T11:50:44.303 に答える