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

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

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

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

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

基本的なテスト

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

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

hello.py

import click

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

test_hello.py

from click.testing import CliRunner
from hello import hello

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

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

sync.py

import click

@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')

test_sync.py

from click.testing import CliRunner
from sync import cli

def test_sync():
  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

.invoke()に渡される追加のキーワード引数は、最初のContextオブジェクトを構築するために使用されます。 たとえば、固定端子幅に対してテストを実行する場合は、次を使用できます。

runner = CliRunner()
result = runner.invoke(cli, ['--debug', 'sync'], terminal_width=60)

ファイルシステムの分離

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

cat.py

import click

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

test_cat.py

from click.testing import CliRunner
from cat import cat

def test_cat():
   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)の入力データを提供することもできます。 これは、次のようなプロンプトのテストに非常に役立ちます。

prompt.py

import click

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

test_prompt.py

from click.testing import CliRunner
from prompt import prompt

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

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