nose まとめ5 (nose plugin)

はじめに

nose のプラグインの作成方法です。

役割

テスト関数から外れた処理をする場合は、プラグインを作成する必要があります。

たとえば、次のような場合にプラグインを作成します。

  • 各テスト実行後に特定処理を実行させたいが、テスト関数ごとに teardown を書くのがめんどくさい。
  • レポートの出力形式を独自のものにしたい。

書き方

nose.plugins.Plugin を継承したクラスを作成します。

必要なことは、 name を指定すること、プラグインを動作させたいエントリポイントをオーバーライドすることです。

name は、実行時にプラグインを指定するときに使用します。

エントリポイントは、プラグインの動作を定義します。

   from nose.plugins import Plugin

   class AfterLog(Plugin):
     """テスト実行ごとに、ログを出力させます。
     """

     name = 'afterlog'


プラグインを afterlog という名前で登録しています。
実行時には、 --with-afterlog というオプションが生成されており、 --with-afterlog を付与するとプラグインが呼び出されます。

   def afterTest(self, test):
     fd = open('/Users/kuma8/Desktop/log.txt', 'a')
     fd.write('after ')
     fd.write(test.__repr__())
     fd.write('\n')
     fd.close()

テスト実行後に、ファイルに記録させています。

afterTest というエントリポイントは、テスト実行後に実行されます。

ソースコード

テスト関数実行ごとに実行関数をファイルに記録する。

# coding: utf-8

from nose.plugins import Plugin

class AfterLog(Plugin):
  """テスト実行後にログを書き出す。
  """

  name = 'afterlog'
  score = 2 # run late

  def __init__(self):
    super(AfterLog, self).__init__()

  def afterTest(self, test):
    fd = open('/tmp/log.txt', 'a')
    fd.write('after ')
    fd.write(test.__repr__())
    fd.write('\n')
    fd.close()

動作結果

$ nosetest -v --with-afterlog ex1_test.py
$ cat /tmp/after.txt
after Test(sample_test.add_test)

thanks

@aodag先生と@shimizukawa先生に教えてもらいました。
だいたい、1,2時間あれば nose plugin かけますよ。