2012-08-30 12 views
14

私は、メソッドが変更された場合、実行する時間がX msを超えないようにしたいという状況に直面しています(本質的に遅い場合、当社のWebページ上の検索結果、および売上に悪影響を及ぼす)ユニットテストでアサーションとして経過時間を使用

単体テストがあります(特にpythonでコードが実行され、py.testを使用します)。最初の考えは、関数がX ms未満で実行されなかった場合、テストを失敗としてマークすることです(または警告を発する)。

しかし、これは危険です(たとえば、すべてのコンピュータが同じ速度であるわけではありません)。また、単体テストの仕事であるとは思えません。

誰かが同様の状況に直面しましたか?私のスピードは機能ですが、コードが進化するにつれてそのような機能が失われないようにしたいと思います。

ユニットテストが答えではない場合は、他にどのような方法をお勧めしますか?

おかげ

答えて

4

最初にpytest-timeout pluginを調べることができます。現在は秒を指定することしかできません(浮動小数点数として)。しかし、ピスタン番号などのより適応性の高いタイミングで動作するように拡張することができます。そのため、コンピュータがどれほど速くピストーンのベンチマークを実行し、キャッシュされる可能性があるかを測定し、テストのピストーン数を指定します。取ることが許可されています。

2

あなたが開発者との間に専用のビルド/テストサーバー、またはほぼ同等のハードウェアを持っている場合、それはミリ秒の時間制限を持って大丈夫です。再現性が重要です - あなたは何かを書くことができるかもしれません、devsがその後の結果と比較される彼らのマシンで "ベースライン"テストを実行することができます。

pyunitperfモジュールには、時間制限と負荷テスト機能があります。それは長い間(2009年)更新されていませんが、あなた自身をロールバックしようとするならば、始めるのに適しています。

また、ms単位のテスト時間は何も教えてくれないことを覚えておいてください。リビジョン間でパフォーマンスを比較するためにのみ使用している限り、大丈夫です。

+0

私たちは専用のテストサーバーを用意していますが、開発者にはマシン上でテストを実行することを推奨しています。あなたが言ったように、繰り返し性は素晴らしい考えです。ありがとう。 –

関連する問題