pytestを使用してpythonで書かれたプログラムのテストを自動化します。
※使用例としては、Google Cloudのサービスを呼び出す処理に対しての例が多いです。
pytestとは
参考:公式ページ
pythonには標準でユニットテスト用の仕組みはある様ですが、
現在は、外部ライブラリのpytestを使用するのが主流みたいです。
環境構築
以下のコマンドを実行してインストール
pip install pytestrequirements.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の派生系です。使用方法も同じです。