Python ユニットテスト備忘録

Python ユニットテスト備忘録

今回は、Pythonのユニットテストに関して少しまとめておこうと思います。

 

テストフレームワーク

現状よく聞くのは、下記2つですかね。あとはdoctestとかですかね。

nose

nose is nicer testing for python

py.test

私が普段使用しているのは、このツールです。
pytest: helps you write better programs

 

書くときに考える処理の流れ

いろいろやり方はあると思いますが、下記が個人的にはわかりやく、実装しやすいと思いました。

1. 準備
実行に必要なデータを準備する。

2. 実行
テストしたメソッドの実行します。
ここは実行だけです。

3. 確認
期待する結果を準備します。
また実行した結果が、期待する結果になっているか確認します。

 

事前準備

pythonのテストが実行する前にclassで共通する実装をしておきます。
initializeなどをよくここでします。

setUp, setDown

各テストメソッドの前後に実行されます。

setUpClass, tearDownClass

クラス全体に1度だけ実行されます。

 

モック

mockは特定のオブジェクトの代理をしてユニットテストを円滑に進めるためのモジュールです。

patch デコレータ

指定したモジュールパス(文字列)が指すオブジェクトをMockオブジェクトに差し替えます。

どこにパッチするのか

実行したい対象のメソッドで、必要になるオブジェクトに対して、patchを行います。

どこにパッチするか

モックへの値の格納

patchしたオブジェクトに対して、与えたい値を定義する必要があります。
その場合、2つの方法があります。

【return_value】
毎回同じ値を返します。
上でも記載していますが、下記のように使用します。

【side_effect】
異なった返却値を返せたり、例外を起こすことが可能です。
※return_value と side_effect を同時に指定した場合、side_effect が優先されるようです。

モックが呼ばれた時の引数を検証

【call_args】
最後に呼び出された時の引数を返します。
もし呼び出されたことがなければ、Noneを返します。

【call_args_list】
モックの呼び出しを順に記録したリストです。
複数回モックが呼ばれる際に使用します。
モックを作成してから一度も呼び出しを行なっていない場合は、空のリストが返されます。

 

用語の確認

モンキーパッチ

モンキーパッチは、オリジナルのソースコードを変更することなく、実行時に動的言語(例えばSmalltalk, JavaScript, Objective-C, Ruby, Perl, Python, Groovy, など)のコードを拡張したり、変更したりする方法である。

 

参考記事

https://qiita.com/FGtatsuro/items/eea263bc15ebfb9767cd
[python] まだmockで消耗してるの?mockを理解するための3つのポイント\
デコレータの役割