私が取り組んでいるプロジェクトは、Pythonパッケージとしてラップされたビジネスロジックソフトウェアです。アイデアは、さまざまなスクリプトまたはアプリケーションがそれをインポートし、初期化してから使用するというものです。
現在、初期化を行い、さまざまなことを設定するトップレベルのinit()メソッドがあります。良い例は、db接続を使用してSQLAlchemyを設定し、後でアクセスできるようにSAセッションを保存することです。これは、私のプロジェクトのサブパッケージ(つまり、myproj.model.Session)に格納されているため、モデルをインポートした後、他のコードが機能するSAセッションを取得できます。
簡単に言えば、これは私のパッケージをステートフルなものにします。私はプロジェクトの単体テストを書いていますが、この安定した動作にはいくつかの問題があります。
- テストは分離する必要がありますが、私のパッケージの内部状態はこの分離を破ります
- メインのinit()メソッドの動作は状態に依存するため、テストできません。
- 将来のテストは、よく知られているモデル状態(たとえば、事前に入力されたsqlite インメモリデータベース)を持つ(まだ書き込まれていない)コントローラー部分に対して実行する必要があります。
現在の構造はBest(possible)Practice(tm)ではないため、どういうわけかパッケージをリファクタリングする必要がありますか?:)
それをそのままにして、毎回すべてをセットアップ/ティアダウンする必要がありますか?完全な分離を実現する場合、つまり、すべてのテストでデータベースを完全に消去して再入力することを意味しますが、それはやり過ぎではありませんか?
この質問は、実際には全体的なコードとテストの構造に関するものですが、その価値については、テストにnose-1.0を使用しています。Isolateプラグインがおそらく役立つことはわかっていますが、テストスイートで奇妙なことをする前にコードを取得したいと思います。