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))

def test_eq_with_msg():
    eq_(1, (3 - 2), msg='error')

ok_ ... AがTrueであるか比較する。

「ok_」関数は、指定の値がTrueであることを確認します。Falseの場合AssertionErrorが送信されます。msgパラメータを指定することで、Failed時のメッセージをカスタマイズすることができます。

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

def test_ok():
    ok_(True)

def test_ok_with_msg():
    ok_(True, msg='error')

その他のアサーション関数

Python標準のUTフレームワークで提供されているアサートメソッドも関数レベルで使用することができます。(もともとは、unittest.TestCaseクラスを継承しないと使えない。)

使い方ですが、提供されているメソッドをスネークケースに読みかえればよいです。

assertEquals -> assert_equals

詳細な仕様は、Pythonドキュメントを参照してください。とりあえず、以下のメソッドが使えるようです。

assert_almost_equal
assert_almost_equals
assert_dict_contains_subset
assert_dict_equal
assert_equal
assert_equals
assert_false
assert_greater
assert_greater_equal
assert_in
assert_is
assert_is_instance
assert_is_none
assert_is_not
assert_is_not_none
assert_items_equal
assert_less
assert_less_equal
assert_list_equal
assert_multi_line_equal
assert_not_almost_equal
assert_not_almost_equals
assert_not_equal
assert_not_equals
assert_not_in
assert_not_is_instance
assert_not_regexp_matches
assert_raises
assert_raises_regexp
assert_regexp_matches
assert_sequence_equal
assert_set_equal
assert_true

raises ... 指定の例外が送信されたことを確認する。

「raises」デコレータは、指定の例外が送信されることを確認します。指定外の例外が送信された場合は、その例外がそのまま送信されます。また、例外が送信されなかった場合は、AssertionErrorが送信されます。

@raises(ValueError)
def test_raises():
    raise ValueError

timed ... 指定の時間でテストが終了するか確認する。

「timed」デコレータは、テストが指定の時間で終了することを確認します。所定時間でテストが完了しなかった場合、TimeExpiredが送信されます。

@timed(1)
def test_timed():
    time.sleep(10)

with_setup ... 指定のsetup/teardownメソッドを実行する。

「with_setup」デコレータは、指定の関数・メソッドを前処理・後処理として利用します。

def create_file():
    with open('/home/sbkro/sample.txt', mode='w') as fp:
        fp.write('hoge')

def delete_file():
    if os.path.exists('/home/sbkro/sample.txt'):
        os.remove('/home/sbkro/sample.txt')

@with_setup(setup=create_file, teardown=delete_file)
def test_with_setup():
    ok_(os.path.exists('/home/sbkro/sample.txt'))

istest ... テストを実行する。

「istest」デコレータは、その関数・メソッドがテストとして実行します。

@istest
def sample_istest():
    eq_(1, 1)

nottest ... 該当テストをスキップする。

「nottest」デコレータは、指定の関数・メソッドの実行をスキップします。

@nottest
def test_nottest():
    eq_(1, 1)

set_trace ... ブレークポイントを設定する。

「set_trace」関数は、指定した箇所にブレークポイントを設定します。nosetestを実行すると、関数の実装箇所で処理が中断します。

詳細は、pdbのドキュメントを参照してください。

def test_set_trace():
    set_trace()  # ここで処理が止まる。
    eq_(1, 1)


Comments

comments powered by Disqus