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

基本的なテストではClickは click.testing コマンドラインアプリケーションを呼び出し、その動作をチェックするのを助けるテスト機能を提供するモジュール。

これらのツールは、簡単のために、解釈器全体の状態を変更し、いかなる方法でもスレッドが安全ではないので、実際にはテストにのみ使用されなければならない!

基礎テスト.

Clickアプリケーションをテストする基本的な機能は CliRunner これは,コマンドラインスクリプトとしてコマンドを呼び出すことができる.♪the CliRunner.invoke() 方法:コマンドラインスクリプトを分離して実行し、出力をバイトおよびバイナリデータとして捕捉する。

返り値は Result 捕捉された出力データ、ログアウトコード、およびオプションの例外が付加されたオブジェクト。

hello.py
import click

@click.command()
@click.argument('name')
def hello(name):
   click.echo(f'Hello {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'

サブコマンドテストには args パラメータ CliRunner.invoke() 方法:

sync.py
import click

@click.group()
@click.option('--debug/--no-debug', default=False)
def cli(debug):
   click.echo(f"Debug mode is {'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() 初期文脈オブジェクトを構築するために使用される.例えば、固定端子幅に対してテストを実行する場合には、以下のコマンドを使用することができる。

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(f"foo={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'

また、入力データも出力ストリームに書き込むようにシミュレーションが提示されることに注意されたい。入力を隠す必要がある場合、このような状況は明らかに起こらないだろう。