flaskチュートリアルで、テストする項目にきましたが、pytestとcoverageという仕組みを利用していてよくわかりませんでした。
まずはpytestについてどんな風に使うかみてみよう
flaskでWebアプリを作成するチュートリアルを進めていましたが、「pytest」と「coverage」というPythonモジュールを利用していましたので、どんなにチュートリアルを読んでも、どんなルールでそうなるのか?と疑問が出るばかりでした。そこで、まずはPythonのテストツールである「pytest」について使い方などを調べてみることにしました。
pytestの公式ドキュメントはこちらです。
こんな人の役に立つかも
・pytestがどんなものか知りたい人
・Pythonのテストツールpytestを使いたい人
・flaskのテストをしたく、pytestを理解したい人
Pytestを使うために環境準備
実際に動作させてpytestがどんなものなのかみていくことにしましょう。まずは動作させるために環境を作成します。
Python仮想環境の構築
Pytestだけのテストを行いたいので、新しく仮想環境を作成したいと思います。
私はmacの場合、普段「ユーザー/Python」という階層にPythonプログラムを作成します。windowsの場合は「C:¥Users¥ユーザー¥Python」という階層にPythonプログラムを作成します。
まずはPythonフォルダに移動して、「pytest」というフォルダを作成しました。
$ cd Python
$ mkdir pytest
そして、今回はpytest階層に仮想環境を作成してPythonプログラムを実行していきたいと思います。
$ Python3 -m venv venv
windowsの場合次のようなコマンドになります。
> py -3 -m venv venv
仮想環境構築後のフォルダ構成は次のような感じになっています。
pytestのインストール
仮想環境をvenvとして作成しましたので、venv仮想環境を立ち上げてpytestをインストールします。
$. venv/bin/activate
(venv)$ pip install pytest
windowsの場合は、仮想環境実行コマンドが「venv¥Script¥activate」となります。
これでPython仮想環境でpytestを実行する準備ができました。
Pytestを使ってみる
シンプルな例
次のPythonプログラムを「test_sample.py」として「pytest」フォルダ内に作成しましょう。
# content of test_sample.py
def inc(x):
return x + 1
def test_answer():
assert inc(3) == 5
このプログラムでは、inc(x)という関数を定義していて、返り値として1を加算したものを返しています。
テストを行う内容を定義したプログラムは、下の「test_answer()」という関数で、assertを行います。ここで重要なのが、「test_●●」と関数の名前を定義することです。
テストのための関数ではassertを記載します。
「assert」は、条件式を後ろに記載して、条件がTrueではない時に例外を投げます。
今回は、assertで5という数値が返ってきて欲しいというような意味合いになりますが・・・実際は次のようになります。
それでは、次のコマンドでテストを開始します。
$ pytest
assertで定義された「inc(3) == 5」がエラーですよ、と出ました。assertで設定したテストが評価されていることがわかります。
pytestコマンドのルール
pytestは、特に設定がない場合、現在実行している「pytest」階層の中からテストを集めます。今回はシンプルな例なので、カレントディレクトリである「pytest」からテストを取得してきます。
pytestコマンドでテストとして認識されるものには次のルールがあります。
①「test_●●.py」または、「●●_test.py」というファイル名を探索します
②「def test_●●()」という関数を探して、この数がテスト数になります。
試しに「sample2_test.py」を追加してみました。
結果、2個のテストが検出されました。また、関数名につける「test_」は後ろではダメなようですね。
シンプルな使い方のまとめ
・「test_●●.py」または「●●_test.py」にテスト関数「test_●●()」を作成する。
・「test_●●()」関数に「assert」で期待したい動作を記載する。
ルールの記載は公式ドキュメントの次のページにありました。
pytestにはいくつかの使い方があるようなので、もう少しみていきたいと思います。