pytestを使ったユニットテスト

こんにちは、kotaです。

最近Pythonでのユニットテストを行うようになりまして、何かいいテストランナーはないのかなと調べた結果、出力がわかりやすいpytestを使い始めました。
今回は、pytestの導入方法と、pytestでカバレッジを取得する方法、コードの変更を自動で検出してテストを再実行する方法を書きます。

1. 導入方法

まずpytestはpipでインストールします。

pip install pytest

pytestだけでは、カバレッジの取得等はできないのでpytestのプラグインもインストールします。

テストカバレッジの取得にはpytest-covを使い、自動でテストを再実行させるにはpytest-xdistを使います。
これらのプラグインもpipでインストールできます。

pip install pytest-cov
pip install pytest-xdist

pytestのプラグインは他にもたくさんありますが、今回はこの2つの使い方だけを説明します。
興味がある方は、記事の最後にプラグインがまとまったサイトのリンクを載せるのでそちらをご覧下さい。

2. テストの実行

テストの実行はコマンドラインから行います。

py.test [...]

具体的には以下のようにテストの対象を指定します。

py.test test_mod.py   # モジュール内のテストを実行
py.test somepath      # 指定したパスの全てのテストを実行
py.test -k string     # string を含む名前をもつテストのみを実行

もし何も指定しなければ、カレントディテクリ配下にある全てのテストを実行します。
テストの対象となるのはtest_*.py や*_test.pyという名前のファイルやtest_から始まる関数等です。

3. オプションの指定

カバレッジの取得やテストの再実行などはオプションで指定します。

py.test -f [...]                            # テスト対象に変化がある場合、自動的にテストを再実行
py.test --cov=[...] [...]                   # cov=[...] には、カバレッジを取得したい対象を指定、その後にテストの対象を指定
py.test --cov-report=html --cov=[...] [...] # カバレッジをhtml形式で出力

これ以外にも、様々なオプションがありますが、毎回指定するオプションがあればpytest.iniというファイルに以下のように記述することで、オプションの入力を省略できます。

[pytest]
addopts = --cov-report=html

短いですが、こんな感じで導入できるのと、unittestやnoseで書いたユニットテストにもpytestは使えるので、新しくどのテストツールを使おうか迷った時には一度試しに使ってみるのもいいのではないでしょうか。

最後に、参考にしたサイトを紹介します。