pytestを使用したPythonのテスト自動化(モックの活用、検証の例)

pytestを使用してpythonで書かれたプログラムのテストを自動化します。

※使用例としては、Google Cloudのサービスを呼び出す処理に対しての例が多いです。

pytestとは

参考:公式ページ

pythonには標準でユニットテスト用の仕組みはある様ですが、
現在は、外部ライブラリのpytestを使用するのが主流みたいです。

環境構築

以下のコマンドを実行してインストール

pip install pytest

requirements.txtなどがあれば、pytestを追記します。

モック

テストコードを組む上で、最初に引っかかるのがモックな気がします。
私が試したやつを紹介していきます。

patch

以下の例は、実行している<メソッド名2>の中で<メソッド1>が実行されている場合の例です。

返却値を固定で「{‘result’: True}」にする場合の例

# メソッド1の返却値を定義
mock_return = {
  'result': True,
}

with patch(<ファイルパス1>.<クラス名1>.<メソッド名1>, return_value=mock_return)
    result = <クラス名2>.<メソッド名2>(<引数>)

1回目の返却値が「{‘result’: False}」、2回目の返却値が「{‘result’: True}」の場合の例
return_valueではなく、side_effectになっている点に注意です。

# メソッド1の返却値を定義
mock_returns = [
  {
    'result': False,   #1回目
  },
  {
    'result': True,    #2回目
  }
]

with patch(<ファイルパス1>.<クラス名1>.<メソッド名1>, side_effect=mock_returns)
    result = <クラス名2>.<メソッド名2>(<引数>)

Exceptionを発生させる場合の例

with patch(<ファイルパス1>.<クラス名1>.<メソッド名1>, side_effect=Exception("Table not found"))
    result = <クラス名2>.<メソッド名2>(<引数>)

monkeypatch

monkeypathは「setattr」「setitem」「setenv」などのメソッドを持っており、
それによって変数等に値を設定してモック化することができます。

<使い方>

monkeypath(クラス名, 対象の変数 or メソッド, ダミー)

使用例 testクラスの変数variをmockという値に書き換える

monkeypath(test, 'vari', 'mock')

検証(Assert)

検証用のメソッド等を紹介していきます。


assert_called

対象のメソッドが呼ばれたことを確認する

<使用例>

本体のコード(main.py)

from google.cloud import pubsub_v1

def execute_publish():
    ...
    # pub/sub
    pubsub_publisher = pubsub_v1.PublisherClient()
    ...
    pubsub_publisher.publish('sample')
    ...

テストコード(test_main.py)

def mock_clients():
    with patch("main.pubsub_v1.PublisherClient") as mock_pub_sub_client:
         # main.pubsub_v1.PublisherClientの戻り値をmock_pubsub_instanceとして定義
         mock_pubsub_instance = mock_pubsub_client.return_value

         yield {
             "pubsub": mock_pubsub_instance
         }

def test_main_execute_publish(mock_clients):
    ...
    # pub/subのpublishメソッドが呼び出されたことを検証
    mock_client['pubsub'].publish.assert_called()

assert_called_once

対象が1回だけ呼び出されたことを確認する。
assert_calledの派生系です。使用方法も同じです。


関連ページ

コメントする