継続的インテグレーションパイプラインで信頼できる十分な自動テストがあるのはいつですか?


10

テストとの継続的な統合は、常に「出荷可能な」コードがチェックインされていることを確認するのに役立ちます。

ただし、包括的なテストスイートを維持することは非常に難しく、多くの場合、ビルドにバグがあるように感じます。

CIパイプラインテストに自信を持たせるには、どのくらいのテストが必要ですか。十分なテストがあるかどうかを判断するために、ある種のメトリックを使用していますか?

回答:


16

一般に

継続的インテグレーションパイプラインで信頼できる十分な自動テストがあるのはいつですか?

自信を持ってやりたいことを考えれば、答えは明らかになるでしょう。最終的には、1-1でマッピングされます。すべてのテストで、テストする1つのことに自信が持てます。

  • ユニットテストでは、クラス(またはモジュール)がテスト対象の機能を実行していることを確認できます。
  • 統合テストでは、いくつかのユニットがテストされた方法で連携することを確信できます。
  • エンドツーエンドのテストでは、アプリケーション全体がテストで記述されている方法で特定のことを実行することを確信できます。

あなたが質問を作成した方法から、あなたはおそらく現在、例えばビジネスの全体像を考えているでしょう:

私のアプリがXを実行できることを確信したいと思います。

したがって、Xを実行しようとするエンドツーエンドのテストを作成し、それが正しく実行されるかどうかを確認します。

より具体的

それはすべて非常に自己参照的ですが、それはそれが重要なことだからです。単純にそこではないことにより。

たとえば、料理のレシピを作成するアプリを作成するとします。特徴の1つは、さまざまな種類のチーズをさまざまな量で追加すると、それらがすべて溶けるように正しい温度と時間が得られることです。

したがって、の単体テストを記述できますCheeseMeltCalculator。このテストでは、ゴーダ100gとエメンタールチーズ200gを与え、温度と時間が正しくなることを確認します。つまりCheeseMeltCalculator、100グラムのゴーダと200グラムのチーズで機能するという自信を持つことができます。このテストを200gではなく300g Goudaで繰り返すと、さまざまな値で正しく機能することが確信できます。あなたはのためのテストを追加することができ0-1かつint.MaxValueゴーダのグラムは、コードがつまずかないことを確信するために(あるいは意図したとおりに正しくトリップ)奇妙な入力のために。

統合テストを作成して、CheeseMeltCalculator食品全体の温度と時間の計算プロセスに正しく組み込まれていることを確認できます。これがうまくいかなくても、CheeseMeltCalculator上記のテストで問題がなければ、バグが他の計算機にあるか、別の計算機のデータが結合される方法にあると確信できます。

そして最後に、レシピ全体を作成するためのエンドツーエンドのテストを記述できます。チェックする項目の1つは、結果の温度と時間です。前の2つのレベルのテストは問題ないが、これがうまくいかない場合は、これらの部分が正しいことと、温度計算がアプリケーションにどのように統合されているかについて間違いがあることを再度確信できます。たとえば、ユーザー入力が正しく転送されていない可能性があります。

そして最後に、これらすべてのテストが問題なければ、「いくつかの異なる種類のチーズを異なる量で追加すると、すべてが溶けるように正しい温度と時間が得られる」と確信できます。

ロングストーリーショート

重要なのは、「正しく機能する」テストを実行できないことです。テストできるのは、「Xを実行すると、Yが発生する」だけです。

しかし、これはまさにプロジェクトの技術仕様にあるべきものです。「いくつかの異なる種類のチーズを異なる量で追加すると、すべてが溶けるように正しい温度と時間が得られます」などのステートメントは、完成品の動作についてクライアントに明確な期待を与えるだけでなく、回転させることもできます。自動テストに。

追加情報

ユーザーRichardが編集にこの情報を追加しました:

マーティン・ファウラーは彼のウェブサイトで最も一般的な戦略について非常に素晴らしい要約を持っていますhttps : //martinfowler.com/articles/microservice-testing/

私はこれを削除したくありませんが、私はこれを言いたいです:この回答と比較して、それは「要約」ではなく、素晴らしいグラフィックスとすべてを備えた、より詳細な説明です。

私のアドバイスは次のとおりです。私の答えを読んだ後で、すべてが理にかなっている場合は、完了です。それでも不明点がある場合は、少し時間を置いて、リンクされた記事を読んでください。


これは良い概念図です。私たちのテストカバレッジに自信を与えるのに役立つと思われる指標の例はありますか?
stonefruit

@stonefruit本当にそうではありませんが、私はあなたが必要とする答えを正確に持っていると思います:Testivus On Test Coverage
R. Schmitz

@stonefruitそのたとえの数である80%に関して、これはこの文脈でより頻繁に聞く数です。主にパレートの原則による-最後の20%のカバー率は作業の80%です。つまり、80%から100%にするには、そもそも80%にするのに比べて4倍の労力が必要です。それがありますしばしば行き過ぎが、衛星のためにあなたにしている書き込み制御コードを想像:バグがポップアップした場合、あなたはちょうどそれを修正することはできません。その場合、カバレッジを100%にすることは、価値のある投資です。
R.シュミッツ

私は3人目のプログラマーのようです。はは。結局のところ、サテライトの例で述べたように、リスクベースのアプローチを取ることに戻ります。
stonefruit

1
@stonefruitたぶん、あなたが最初の人かもしれません。カバレッジが0%の既存のプロジェクトがある場合は、80%まで死の行進を開始しないでください。代わりに、実際には、「いくつかの優れたテストを書くだけです。金曜日の後半をテストの作成に使うかもしれません。私の経験では、最初にベストエフォートリワード比のテストを自動的に思い付くでしょう。すべてのテストで少し自信がつきます。
R.シュミッツ

4

求める信頼度を計算できるメトリックはありません。自信は、何かをしてから成功するか、失敗してそこから何かを学ぶことによって構築されます。

テストカバレッジに自信を与える唯一の「メトリック」は、次のとおりです。

  1. 生産で見つかった欠陥の数
  2. コードベースをリファクタリングし、テストカバレッジに依存して回帰の欠陥をキャッチできますか?

自動テストは特効薬ではありません。各リリースサイクル中に検出された製品の欠陥の数を追跡する必要があります。この数値が下がると、より優れたソフトウェアが提供されます。自動テストと継続的インテグレーションは、より優れたソフトウェアを提供するために使用するツールにすぎません。

実際に測定できる唯一の測定基準は、「より優れたソフトウェアを提供していますか」です。

そしてそれでも、それは主観的です。


他の回答と比較して、この回答は可能なメトリックに対処します。提案された指標をより意味のあるものにすることを考えています。おそらく、生産で見つかった欠陥の数を見つけることに加えて、リスク管理に基づいて各欠陥にスコアを付け、しきい値を設定します(たとえば、過去3か月に見つかった30ポイントの欠陥)。しきい値に達することは、バグのあるコードの技術的負債が指数関数的に増加する前に、可能性のあるバグについてシステムのレビューを行うことを示す場合があります。
ストーンフルーツ

2

継続的インテグレーションパイプラインで信頼できる十分な自動テストがあるのはいつですか?

ほとんどの経済環境では、十分な信頼性(> 99%)を実装するための予算はありませんが、限られた予算を管理する必要があります。それはすべて費用対効果の比率に関するものです。

  • 自動化されたテストの中には、実装するのに安価なものもあれば、非常に高額なものもあります。
  • 実際のリスク管理に応じて、一部のリスクはテストでカバーする必要がありますが、他のリスクはカバーできません。

したがって、実際には、簡単/安価/危険なテストは実装されますが、高価な/可能性の低いテストは実装されません。

ソフトウェア開発のサブゴールの1つは、テストが容易で安価なアーキテクチャ(Test-driven_developmentを適用してテスト容易性を設計する)を作成して、自動テストを手頃な価格に保つことです。

私がいることを前提としPareto_principleはあまりにも、ここでは、保守/テスト可能なソフトウェアに適用することができます:それは、余分な20%より多くのお金を費やして、あなたが80%の余分な利益を得ることを言います。残りの20%の利益を増やすには、追加の80%のお金を使う必要があります。

コードカバレッジミュー テーションカバレッジなどのテスト指標を適用して、テストされていない可能性のあるソースコードを表示できます。

ただし、カバレッジが100%であっても、コードにバグがないことを確信することはできません。

管理はコードメトリックスが好きです。「コードカバレッジ> = 80%」が管理者によって強制されている一方で、開発者が自動テストをサポートしていない場合は、高いカバレッジでテストコードを作成して、誤ったセキュリティ感を与えないことを証明する方法があります。


1

ここでの秘訣は、完全なカバレッジについて心配することではなく、変更のリスクを管理することです。

パイプラインを使用して、すでに本番環境にあるものとまったく同じバージョンをデプロイしているとしましょう-回帰エラーのリスクは何ですか?ゼロ(変更がないため)。

ここで、画面の1つのテキストを変更したいとします。テキストが正しく表示されることを確認するためのテストを追加しました(議論のために、それが本当に重要なテキストであると仮定しましょう)。回帰エラーがないことを確認するには、他にどのようなテストが必要ですか?現実的にはなし...

したがって、各リリースを有効にするために必要な自動テストの数は、アプリケーションのサイズではなく、変更のサイズの関数です。小さな低リスクの変更を行う場合は、リスクを軽減するために必要なテストがはるかに少なくなります。

しかし、ちょっと待ってください...これはCIとCDのポイントとうまく調和していませんか?

うん!すべての変更とデルタを非常に小さく保つことにより、テストではなくプロセスを通じて多くの回帰リスクを軽減します。さらに、問題は実際には自動化の1つにはなりません(これは、使用するツールにすぎません)。単にテストとリスク選好の問題です。自動化を完全に忘れて、変更が問題を引き起こしていないことを確認するために、変更に対してどのテストを実行しますか?その質問への答えは、手動テストプロセスからCIシステムに変わりません。唯一の利点は、これらの回帰テストの多くが以前の機能で以前に開発された可能性があり、CIはより小さく、より安全な変更を行うことをお勧めします。

TLDR

テストは、変更のリスクを軽減するためのものです。デルタがゼロの展開にはリスクがないため、リスクはありません。変更を小さく保つことにより、それらを検証するために必要なテストを特定することがはるかに容易になります-自動化の再利用性はおまけです。


0

これは、製品を手動でテストする場合と同じ指標です。

実際には、これらの信頼度の低いゾーンを特定するのは簡単です。製品を出荷していると仮定すると、出荷可能であるという自信を高めるパイプライン後の手動ステップがあると思います。これらは、自動プロセス自体の信頼性を向上させるために自動化する必要がある領域です。

自動化は継続的な取り組みです。製品が向上するにつれて、成長し、向上します。欠陥は、CIを再考するとともに、コードを再考する理由です。そして、ここでの明るい側面は、製品自体への信頼が達成可能であるということです-自動化への信頼も達成可能です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.