2009-03-22 8 views
9

私のコードベースは、単体テストのカバレッジを高いものにしているとしましょう。 (特定のポイントを超えて、カバレッジを増やしても良いROIは得られません)Pythonでパフォーマンスベースの(ベンチマーク)ユニットテストを行う方法

次はパフォーマンスをテストします。コードをベンチマークして、新しいコミットが不要に遅くならないことを確認します。私はSafariのzero tolerance policyがコミットからの減速に非常に興味を持っていました。私はスピードへのコミットメントのレベルがほとんどのプロジェクトで良いROIを持っているかどうかは確信していませんが、少なくともスピード回帰が起こったことを警告して、それについて判断することができます。

環境はLinux上ではPythonですが、BASHスクリプトでも実行可能だった提案は私を非常に幸せにします。

答えて

7

可能であれば、システムレベルでパフォーマンステストを行いたい場合があります。データとビヘイビアをできるだけ実稼働環境に近い状態でアプリケーションを全体としてテストします。

これは簡単ではなく、自動化して一貫した結果を得ることがさらに難しくなります。

パフォーマンステストにVMを使用することはできません(実稼働環境がVMで動作していない場合でも、何も実行していないホストでVMを実行する必要がない場合)。

パフォーマンスユニットテストを行うと言うと、それは価値があるかもしれませんが、実際にシステムレベル(開発者の頭の中だけではない)に存在する問題を診断するために使用されている場合に限ります。

また、単体テストの単位のパフォーマンスは、状況によってはパフォーマンスが反映されないことがあるため、まったく役に立たない可能性があります。

+0

+1:AND ...パフォーマンステストは、絶対的なパフォーマンス目標がある場合にのみ意味があります。まれです。軍事的および埋め込み制御システムに不可欠である。 –

+1

申し訳ありません@ S.Lott - 私はあなたに強く同意します。 2人または3人以上の人がプロジェクトに取り組んでおり、応答性の期待を持ったエンドユーザーがいる場合、チームは目標を達成するためのパフォーマンスを自動的に監視することができます。さもなければ、機能後の機能は、性能および顧客体験に対するその効果の真の理解なしで追加される。 –

2

MarkRはそうです...実世界のパフォーマンステストを行うことが重要です、そして、単体テストでややこしいかもしれません。それが言えば、標準ライブラリのcProfileモジュールを見てください。これは少なくとも、実行速度のコミットからコミットまでの相対的な意味を与えるために有用であり、ユニットテスト内で実行することは可能ですが、もちろん、オーバーヘッドを含む詳細の結果が得られますユニットテストフレームワーク自体の

あなたの目的が耐性がない場合は、これよりも堅牢なものが必要になります...ユニットテストのcProfileはまったくそれをカットせず、誤解を招く可能性があります。

2

私はパフォーマンステストを行うときに、一般にデータ入力のテストスイートを用意して、プログラムがそれぞれのプロセスを処理するのにかかる時間を測定します。

パフォーマンスは毎日または毎週ログに記録できますが、すべての機能が実装されるまでパフォーマンスについて心配するのは特に便利ではありません。

パフォーマンスが低すぎる場合は、cProfileを実行して同じデータ入力で実行し、ボトルネックがどこにあるかを確認してください。

5

システムレベルでのパフォーマンスのテストが最終的にはより重要であることに同意しますが、FunkLoad http://funkload.nuxeo.org/はUnitTestスタイルの負荷テストをPythonで実行したいと思っています。

マイクロベンチマークは、コードベースで特定のアクションをスピードアップしようとしているときに機能します。後続のパフォーマンス単体テストを実行することは、最適化したばかりのアクションが、将来のコミット時に意図せずにパフォーマンスが後退しないようにするのに役立ちます。

関連する問題