Clickアプリケーションのテスト—クリックドキュメント

提供:Dev Guides
Click/docs/6.x/testing
移動先:案内検索

Clickアプリケーションのテスト

基本的なテストのために、Clickはclick.testingモジュールを提供します。このモジュールは、コマンドラインアプリケーションを呼び出してその動作を確認するのに役立つテスト機能を提供します。

これらのツールは、単純化のためにインタプリタの状態全体を変更し、スレッドセーフではないため、実際にはテストにのみ使用する必要があります。

基本的なテスト

Clickアプリケーションをテストするための基本的な機能は、コマンドラインスクリプトとしてコマンドを呼び出すことができる CliRunner です。 CliRunner.invoke()メソッドは、コマンドラインスクリプトを分離して実行し、出力をバイトとバイナリデータの両方としてキャプチャします。

戻り値は Result オブジェクトであり、キャプチャされた出力データ、終了コード、およびオプションの例外が添付されています。

例:

import click
from click.testing import CliRunner

def test_hello_world():
    @click.command()
    @click.argument('name')
    def hello(name):
        click.echo('Hello %s!' % name)

    runner = CliRunner()
    result = runner.invoke(hello, ['Peter'])
    assert result.exit_code == 0
    assert result.output == 'Hello Peter!\n'

サブコマンドのテストでは、 CliRunner.invoke()メソッドの args パラメーターにサブコマンド名を指定する必要があります。

例:

import click
from click.testing import CliRunner

def test_sync():
    @click.group()
    @click.option('--debug/--no-debug', default=False)
    def cli(debug):
        click.echo('Debug mode is %s' % ('on' if debug else 'off'))

    @cli.command()
    def sync():
        click.echo('Syncing')

    runner = CliRunner()
    result = runner.invoke(cli, ['--debug', 'sync'])
    assert result.exit_code == 0
    assert 'Debug mode is on' in result.output
    assert 'Syncing' in result.output

ファイルシステムの分離

ファイルシステムを操作する基本的なコマンドラインツールの場合、 CliRunner.isolated_filesystem()メソッドが役立ちます。このメソッドは、空のフォルダーを設定し、現在の作業ディレクトリをに変更します。

例:

import click
from click.testing import CliRunner

def test_cat():
    @click.command()
    @click.argument('f', type=click.File())
    def cat(f):
        click.echo(f.read())

    runner = CliRunner()
    with runner.isolated_filesystem():
        with open('hello.txt', 'w') as f:
            f.write('Hello World!')

        result = runner.invoke(cat, ['hello.txt'])
        assert result.exit_code == 0
        assert result.output == 'Hello World!\n'

入力ストリーム

テストラッパーを使用して、入力ストリーム(stdin)の入力データを提供することもできます。 これは、次のようなプロンプトのテストに非常に役立ちます。

import click
from click.testing import CliRunner

def test_prompts():
    @click.command()
    @click.option('--foo', prompt=True)
    def test(foo):
        click.echo('foo=%s' % foo)

    runner = CliRunner()
    result = runner.invoke(test, input='wau wau\n')
    assert not result.exception
    assert result.output == 'Foo: wau wau\nfoo=wau wau\n'

プロンプトは、入力データを出力ストリームにも書き込むようにエミュレートされることに注意してください。 隠された入力が予想される場合、これは明らかに起こりません。