3

モジュールのコンパイル段階でノーズ ユニット テスト フレームワークがテストを実行することは可能ですか?

実際、次の構造で何かをテストしたいと思います。

x = 123
# [x is used here...]
def test_x():
  assert (x == 123)
del x  # Deleted because I don't want to clutter the module with unnecessary attributes

モジュールをインポートした後に明らかに test_x() を実行するため、nosetests は x が未定義であることを教えてくれます。モジュールを使用した後に不要なリソースを解放しながら、コンパイル段階でノーズにテストを実行させる方法はありますか?

4

2 に答える 2

2

noseのメイン開発者であるJasonPellerinによると、noseユニットテストフレームワークはコンパイル中にテストを実行できません。これは、モジュールの「構築」とテストルーチンの両方が特定の変数にアクセスする必要がある場合に発生する可能性があります(テストがない場合は削除されます)。

1つのオプションは、名前の前に「__」を付けることにより、ユーザーがこれらの不必要に保存された変数を使用しないようにすることです(これは、クラス構築で使用される変数でも機能します。これらは、これらの「プライベート」グローバルの1つにすることができます)。

もう1つの、おそらくよりクリーンなオプションは、モジュールをタスク専用にすることです。このモジュールには、モジュール「それ自体」(つまりテストなし)とそのテスト(およびテストがない場合は共有する必要がない)によって共有される変数が含まれます。テスト)。

これらのオプションの問題は、テストがなかった場合に削除される可能性のある変数が、テストコードで使用する方がよいという理由だけで、代わりにメモリに保持されることです。少なくとも、上記の2つのオプションを使用すると、ユーザーはこれらの変数を使用するように誘惑されたり、それらが何であるかを不思議に思う必要を感じたりすることはありません。

于 2009-05-24T20:23:12.557 に答える
2

これを処理する簡単な方法は、TESTING フラグを設定して、次のように記述することです。

if not TESTING:
    del x

ただし、テストはコードとは異なる状況で実行されるため、モジュールを実際に適切にテストすることはできません。

適切な答えは、実際に変数が原因で重大なパフォーマンスの問題が発生していない限り、手動で変数をクリーンアップすることに煩わされるべきではないということです。Premature Optimizationを読んでください。これは重要な概念です。いつか発生するかもしれない問題ではなく、抱えている問題を解決してください。

于 2009-05-21T11:14:36.893 に答える