2

私は Python - Django Web サイトに取り組んでいます。VCS として GIT を使用しています。継続的インテグレーションのために、私は Jenkins CI を使用しています。Python を使用して 2 つの仮想環境をセットアップしました。1 つは開発用、もう 1 つは運用前用です。

私の問題: Web サイト用に書かれた多くの単体テスト、リグレッション、スモーク テストがあります。私の開発用と本番前の両方の virtualenv は、Jenkins CI に接続されています。

最近、コードの変更がプッシュされるたびに、Jenkins CI の両方の環境でテストがランダムに失敗します。コードの変更が進められていないのに、テストがランダムに失敗することがあります。

トラブルシューティングが完了しました:

  • ローカルでテストを実行し、合格しています。
  • Jenkins CI で ([今すぐビルド] ボタンを使用して) いくつかのビルドを手動で行いましたが、テストは成功しています。
  • 失敗したテストを個別に実行しましたが、まだ合格しています。

以前のビルドで失敗したテストは、次のビルドで成功しました。また、以前のビルドで成功したいくつかのテストは、次のビルドでは失敗しました。誰かが私にできることを提案できますか?

4

1 に答える 1

9

テストがランダムに失敗する原因となる環境要因を特定する必要があります。

私が見たいくつかのことがこれを引き起こします:

  • メモリ - CI マシンで実行されている他のものがあり、それらすべてを実行して自分のものを構築するのに十分なメモリがありません
  • 時間 - 時間に応じて失敗するコードがコードにあります。たとえば、2 月 29 日に失敗するコードがありました。何回も成功したので、私たちを驚かせました。1 桁しかない場合、秒数のフォーマットに失敗したようなものである可能性があります。
  • 外部の依存関係 - あなたのテストは、稼働している他のサーバーに依存しています。ダウンしたり、非常にビジーになったりすると、テスト コードに応答せず、テストは失敗します。これは、データベース サーバーである可能性があります。
  • データベース コンテンツ - データベースに対して実行するテストのすべての前提条件を正しく設定していない可能性があります
  • 同時実行性 - マルチスレッド コードは、条件が適切な場合 (または単に間違っている場合) にのみ失敗することがあります。外部要因によって引き起こされたわずかなランダムな遅延により、コードが機能するか、失敗する可能性があります。マルチスレッド コードでは競合状態を見落としがちです。
  • サーバー (または CPU) - テスト マシンの特定のサーバーまたはコアで実行すると、テストが失敗することがあります。もちろん、テスト マシンが 1 台しかない場合、これは起こり得ません。しかし、1 台のマシンで何かが壊れていたり、接続が不十分 (ファイアウォール ルール) であったり、他のプロセスが実行されていたり、メモリが少ない (または多い) 場合、そのマシンで実行するようにランダムに割り当てられたときにテストが失敗する可能性があります。
  • [ここにあなたのものを挿入してください] - そして、さらに 100 万あります。

これらは解決が難しい問題です。特に彼らが正当な理由もなく去った場合。本番システムの厄介なバグを修正するために急いでいるときに戻ってくると思うので、緊張します。

于 2012-12-31T20:31:49.213 に答える