PythonのUT Framework「nose」まとめ (3) - nose.tools編 -

noseまとめの3回目。nose.toolsの使い方について整理しました。

nose.toolsって?

noseには、テスト作成に便利な関数・デコレータ群が用意されています。これらを活用することで、可読性の良いテストコードを実装することができます。

使い方

nose.toolsを使うためには、nose.toolsパッケージをインポートしてください。ただそれだけです。

from nose.tools import *  # noqa

ツール紹介

nose.toolsで提供されているツール群についてご紹介致します。(使い方の分からないmake_decorator除く。情報提供求む)

eq_ ... AとBが同じであるか比較する。

「eq_」関数は、2つ値が同値であることを確認します。異なる場合AssertionErrorが送信されます。msgパラメータを指定することで、Failed時のメッセージを変更することができます。

Failed時には、引数が例外のメッセージとして出力されるので、なるべくAssert関数よりこちらを使うことを推奨します。

def test_eq():
    eq_(1, (3 - 2 ...
more ...

PythonのUT Framework「nose」まとめ (2) - 前処理・後処理編 -

noseまとめの2回目。今回は、テストの前処理・後処理について整理しました。

ユニットテストにおける前処理・後処理とは?

まずは一般的な話ですが、ユニットテストは、モジュールごとに独立して動作させる必要があります。

どういうことかと言いますと...

  • テストを実行させるために、事前条件を設けてはいけない。(例: Bというテストを動作させるためには、Aというテストを事前に実行させる必要がある。)
  • また、テストの実行が後の処理に影響を与えてはいけない。(例: Aというテストを実行した結果ゴミが残り、Bというテストの実行に失敗する。)

このように、良いテストを実装するためには、テストの準備・後片付けが必要となります。そして、主要のユニットテスト・フレームワークには、テストの前処理・後処理を実行させる仕組みが用意されています。

noseの前処理・後処理

noseで前処理・後処理を行うためには、setup及びteardownメソッドを実装します。noseは、メソッド名から自動的に前処理・後処理を判別し、適切なタイミングで実行してくれます。

関数の場合

def setup():
    '''テストの前処理'''
    pass

def teardown():
    '''テストの後処理'''
    pass

クラスの場合

class TestClass ...
more ...

PythonのUT Framework「nose」まとめ (1) - 導入編 -

Pythonで使えるユニットテスト・フレームワーク「nose」について、情報をまとめてみます。

特徴

「nose」は、Pythonで使えるユニットテスト・フレームワークの一つです。他のフレームワークを使ったことがないので、なんとも言えないのですが...

  • Class継承する必要がなく、シンプルなテストが書ける。
  • 豊富なオプション・ツール類が提供されている。
  • プラグインによる拡張機能がある。

などが、特徴かなと思います。普通に使う分にはシンプルで使い勝手が良いです。

他のフレームワークが気になる方は、Wikipediaを参考にしてみてください。

Install

pipコマンドを使ってインストールします。

$ pip install nose

未確認ですが、pipが使えない環境は、easy_installも使えるみたいです。

$ easy_install nose

初めてのユニットテスト

noseを使ったテストの流れを説明します。

1. 実装(プロダクトコード ...

more ...

datetime.nowを使ったコードを単体テストする方法

前回と同じくPythonのUTに関するメモ書き。 datetime.now(現在日時)を利用したコードの単体テストの方法についてまとめます。

まずは、サンプルコード。現在日時を取得するメソッドです。

import datetime

def echo_current_time():
    return 'current time: {0}'.format(
        datetime.datetime.now().strftime('%Y-%m-%d')
    )

if __name__ == '__main__':
    print(echo_current_time())

以下は、UTコードになります。実行時間によって結果が変わるので、datetimeにモックを当てたくなりますが、下記の通りエラーになります。

from mock import patch
from nose.tools import eq_, nottest

@patch('datetime.datetime.strftime')
def test_echo_current_time ...
more ...

関数デコレータを単体テストする方法

Pythonの関数デコレータのテストについて、あまり情報がなかったので調べてみました。

まずはサンプル。FLAGがFalseの時に、例外が出る関数デコレータです。

FLAG = True

def deco(func):
    import functools

    @functools.wraps(func)
    def wrapper(*arg, **kwargs):
        if FLAG:
            func(*arg, **kwargs)
        else:
            raise Exception('FLAG is false.')

    return wrapper

@deco
def hoge():
    print 'hoge'

if __name__ == '__main__':
    hoge() # print 'hoge'

    FLAG = False
    hoge()  # raise Exception

テストメソッドを記述するためには、以下の2つのことを行う必要があります ...

more ...