2009-04-19 12 views
3

私はDjangoでオークションシステムを作成しました。単体テストを作成したいが、アプリケーションは時間に敏感である(例えば、広告主が請求される金額は、広告がウェブサイト上でどのくらいアクティブであるかの関数である)。このタイプのアプリケーションをテストするための良いアプローチは何ですか?Pythonでの時間の影響を受けやすいアプリケーションのテスト

可能な解決策は次のとおりです。DateFactory classは、テストで予測可能な日付を生成するいくつかの方法と、プロダクションのリアルタイム値を提供します。このアプローチについて考えているのですか、実際に何か他のことを試してみましたか?

答えて

3

あなたが提供したリンクでは、単体テストのためにメソッドにパラメータを追加するという考え方を幾分拒否していますが、ビジネスロジックを拡張したものとして正当化できると思う場合もあります。私の意見では、これはあなたのモデルをより柔軟に、おそらくもっと表現力豊かにすることができるコントロールの逆の形です。例:

これは、基本的に、私のロジックを検証する目的で自分のユニットテストが独自の日付/時刻を提供することを可能にします。

参照されたブログの議論は、これがAPIをうんざりさせているようだ。しかし、の生産ユースケースでは、現在の日付/時刻を代替値で置き換えるというケースが発生しました。言い換えれば、制御アプローチの逆転は最終的に私のアプリケーションの必要な部分になった。

1

一般的に私は、生産コードが(セマンティクスが許す限り)入力として日付オブジェクトを取るようにしようとします。多くのテスト環境では、記述したDateFactoryは、人が行うことです。

Pythonでは、静的モジュールのメソッドDatetime.nowまたはTime.nowを直接変更することもできます。テストのティアダウンでそれらを置き換えるには、ここで注意する必要があります。これは、テストしているクラスを変更できない(または変更することができない)場合に特に便利です。

は、設定方法が失敗するわずかなpossiblityがあれば、私は最後の置換を行うあなたは

def setUp(self) 
     self.oldNow = Datetime.now 
     Datetime.now = self._fakenow 
     ... 

    def tearDown(self) 
     Datetime.now = self.oldNow 

を持ってこれを行うにしてください。

特に、tearDown部分を忘れる心配が必要な場合は、カスタムDateFactoryを使用する方が安全です。

関連する問題