A payment service change can pass thousands of unit tests and still break production because the billing API interprets an idempotency key differently than the service expects. The failure may sit unnoticed until a nightly integration job reaches the interface, long after the commit has moved through the fast part of the pipeline.
サービス変更は、単位テストを数千回通過しても、実稼働で破損する可能性があります。サービスは、idempotencyキーを異なる方法で解釈しているからです。 失敗は、長い間、コミットがパイプラインの高速部分を通過した後、夜間の統合ジョブがインターフェイスに到達するまで、気づかれません。 CI/CD統合テスト. 単体テストでは、孤立したロジックが正しく動作することを証明します。統合テストでは、コンポーネント、サービス、スキーマ、キュー、外部依存関係がまだ一致していることを証明します。現代のデリバリーパイプラインでは、その証拠は、開発者が無視することになるスローのチェックの壁ではなく、トリエージュの決定を形作るべきです。
CI/CDは、主流のソフトウェアデリバリーモデルとなっています。 2024年のDevOpsテストレポート mabl から ほぼ 50% の世界の組織 10% CI/CDの優先順位を付けていると報告されています。ただし、
のテスター
- CI/CDプロセスの定義と維持に携わっています。さらに
- 統合テストは単体テストとエンドツーエンドテストの間でどのように位置するか
- 環境とデータを信頼性のあるテストに適切に管理する
- GitHub アクションのパイプライン例、GitLab CI、Jenkins
- 不確実性のある統合テストの信頼性戦略
- Gating Policies and Deployment Promotion Rules
- 長期的な信頼のための採用チェックリストと観察性
CI/CDの制御ポイントである統合テストの理由
統合テストはリリースリスクが具体化される場所です。単体テストでは、支払いハンドラーが idempotency キーを正しくフォーマットすることを確認できますが、ハンドラー、HTTP クライアント、請求 API, 永続化レイヤー、リトライ動作が一緒に動作するときに一致することを証明するのは統合テストのみです。
統合テストは、継続的インテグレーションと継続的デリバリーの間の自然な制御ポイントです。コミットは単に単体スイートが緑の場合でなく、生産的なアレンジメントでインターフェイスを変更した場合にのみ、信頼できる証拠を生み出すことで昇格されるべきです。

The distinction matters because frequent integration without automated verification only moves defects faster. A systematic review of CI/CD improvement approaches identified recurring priorities that include reducing build and test time, improving visibility into results, supporting continuous testing, detecting faults, and improving deployment reliability. Another review in the same research record defines continuous integration around frequent code integration verified by an automated build that includes tests, so defects can be detected quickly.
自動検証なしで頻繁に統合すると、欠陥は速く進むだけです。CI/CD改善アプローチの体系的なレビューは、ビルドおよびテスト時間の短縮、結果への視覚化の向上、継続的なテストのサポート、欠陥の検出、展開の信頼性の向上など、繰り返される優先事項を特定しました。同研究レコードの別のレビューでは、自動ビルドにテストを含む頻繁な__CAPGO_KEEP_0__統合を定義し、欠陥を早期に検出できるようにしました。
制御ポイントを意図的に作成する
- 統合テストを開始するには、次の決定をサポートするように分類する必要があります。 ブロッキングテスト
- 重要な契約を保護し、統合またはプロモーション前に同期して実行します。 隔離テスト
- 不安定性を調査するチームが調査する間、配信をブロックしないようにして、可視性を維持し、証拠を継続的に生産します。 非同期テスト
コミットが高速ゲートをクリアした後、コミットが高速ゲートをクリアした後、より広範なワークフロー、フルステージング構成、または高コストのインフラを実行します。
CI/CD統合テストの重要性を議論するのではなく、どのテストが特定のプロモーション決定に影響を与えるのに十分に信頼性と価値があるかを判断するのが実用的です。 実用的なルールです。
実装の残りはそのルールから導かれます。 依存関係がインターフェイスで失敗する場合にプロダクションライクの依存関係を使用し、独立したチェックを並列化し、偽の失敗を測定し、隔離と昇格の明示的な条件を定義してください。 この作業をより広範なデリバリープラクティスに接続するチームは、また 継続的インテグレーションの利点をレビューすることもできます。.
統合テストはユニットテストとエンドツーエンドテストの間で位置しています。
テストピラミッドはコストモデルであり、厳密な法則ではありません。ユニットテストは、関数、クラス、またはモジュールを分離するため、速いです。 その速度は即時フィードバックに適していますが、モックはシステムのシームで発生する失敗を隠すことができます。 例えば、シリアライズの差異、データベース制約、認証設定、またはキューの動作などです。
エンドツーエンドテストは、対照的な立場を占めます。ユーザージャーニーをフルスタックで実行するため、リスクの高いワークフローに値打ちがあります。 また、ブラウザ、ネットワーク、サービス、インフラストラクチャの境界をまたいで、診断と安定性が難しくなります。 すべてのマージがエンドツーエンドのエステートを待つ場合、開発者は、集中したAPIレベルの統合テストよりも少しだけ情報を提供する遅い信号を受け取ります。
統合テストは中間地帯を占めます。 実際または近似実際の依存関係を使用して、サービス間の動作を検証する必要はありませんが、UIのオーケストレーションが必要ありません。 この層は、HTTPおよびgRPCの呼び出し、キューの発行、データベースの移行、キャッシュの相互作用、スキーマの互換性をカバーできます。
Three useful integration patterns
インプロセス コンポーネント テスト (Testcontainers) アプリケーション コンポーネントを起動し、依存関係として PostgreSQL、Redis、Kafka などを開始します。このパターンは、保存、シリアライズ、トランザクション、またはブローカ セマンティクスが含まれる欠陥リスクの場合に、セットアップコストの価値があります。このパターンは、テスト境界が狭く、実際の依存関係を持つテストを提供します。
契約間の相互作用を確認するために、Pact またはスキーマ レジストリを使用するクロスサービス コントラクト テスト サービス間の契約を確認することに焦点を当てます。独立してサービスをリリースするチームが、契約の変化に対して迅速なフィードバックが必要な場合に、強力な選択肢です。契約テストは、行動的統合テストを置き換えるものではありませんが、共有環境に到達する前に不互換なインターフェイスを防ぐことができます。
API-level のテスト 複数のデプロイ済みサービスを実際のネットワークパスを通じて呼び出します。このパターンは、ルーティング、認証、サービス ディスカバリー、デプロイ構成、またはインフラストラクチャ ポリシーが重要なワークフローに使用します。重要なビジネス パスを絞り込むことが重要です。なぜなら、完全なステージング スタックのプロビジョニングコストが高く、失敗したときに分離するのが難しいからです。
| パターン | 実行時 | 環境の忠実さ | 適切なもの |
|---|---|---|---|
| インプロセス コンポーネント テスト (Testcontainers) | 高速から中速 | __CAPGO_KEEP_0__ | 依存関係 |
| データベース、キャッシュ、ブローカー、そしてアプリケーションコンポーネントの動作 | Pactまたはスキーマレジストリを使用したConsumer-Provider契約テスト | 高速 | API and event compatibility between independently released services |
| API | __CAPGO_KEEP_0__ | 中速から遅い | 高レベルのシステムの類似性 |
ネットワークパス、認証、ルーティング、そして重要なマルチサービスワークフロー 10分未満のマージコミットごとに次に、広範なシナリオを非同期実行に移行します。 この分割に広範な基盤を持つチームは、 自動テストに含まれるものを確認するしかし、統治原則は単純です: 実際性を支払うのは、リリース決定を変更する場合のみです。
環境とデータの管理
正確なテストを保証するには、環境とデータの管理が不可欠です。 不正確な環境とデータは、信頼できない結果につながります。 CI/CD統合テスト 信頼できるCI/CD統合テストには、依存関係の境界を明確にし、データの状態を再現可能にする環境戦略が必要です。

最初に、信頼できる依存関係から始めます。 Testcontainersは、各ジョブごとに廃棄可能なPostgreSQL、Redis、Kafkaのインスタンスをプロビジョニングできます。 Docker自体の利点ではなく、バージョン、構成、起動、終了の制御が重要です。
再現可能なジョブシーケンス
固定シーケンスを使用して、テストが code 自己設定を改善するのではなく、固定シーケンスを使用してください:
- 依存関係を開始する。 PostgreSQL コンテナを起動し、実際のヘルス チェックを待つのではなく、実行中のプロセスがトラフィックを受け入れる準備ができていると仮定するのではなく、待つ。
- マイグレーションを適用する。 アプリケーションが使用する同等のマイグレーション パスを実行する。テスト スキーマを手動で管理するのではなく、生産環境とずれが生じないようにする。
- 決定論的ファイクスをロードする。 シナリオに必要なレコードのみをシードし、並列実行が互いの状態を変化させるのを防ぐために、各ジョブに分離されたデータを与える。
- 契約アサーションを実行する。 リクエスト形式、レスポンス動作、イベントスキーマ、ステータス遷移、保存結果を検証する。
- すべてを解体する。 テストが失敗しても、後続のジョブが汚染された状態を継承しないように、コンテナと一時ボリュームを破棄する。
90秒のPostgreSQL起動時間がマイグレーションとトランザクションの欠陥を検出するのに十分なコストとなる場合、それを許容する。完全なステージング クラスターは別の決定である。インフラストラクチャの消費量が増加し、構成のずれが生じ、失敗の起源が増える。最小限の忠実な環境から始め、契約カバレージまたは生産インシデントが小さい境界が欠落している意味のある失敗モードを示す場合に境界を広げる。
意図的に仮想化を使用する。
第三者システムは、すべてのパイプラインで安全にプロビジョニングできません。WireMock、Mountebank、Hoverflyは依存関係をシミュレートできますが、シミュレーションは維持される契約として扱う必要があります。ただし、理想的なレスポンスのみを返すモックでは、認証期限切れ、リクエスト制限、不正なペイロード、タイムアウトハンドリング、スキーマの進化などを明らかにしません。
ephemeralプレビューエンビロメントは、複数のデプロイされたサービスが協調して動作するリスクに依存する場合に便利です。Docker Composeは、CI組み込みのローカルコンポジションを提供し、Kubernetesの名前空間は、デプロイメントの動作自体をテストする必要がある場合にプルリクエストエンビロメントを分離できます。どのアプローチを使用しても、依存関係のバージョンを固定し、各実行で使用された構成を記録する必要があります。
シークレットにはデータと同じ規律が必要です。テストフィクスチャ外に資格情報を保存し、プラットフォームの保護されたメカニズムを通じてアクセスを回転させる必要があります。 CapgoのCI/CDパイプラインにおけるシークレットの管理に関するガイド 環境ライフサイクルについての短いビジュアルウォークスルーは、チームが環境ライフサイクルについて一致することができます。
__CAPGO_KEEP_0__アクションのパイプライン例、GitLab CI、Jenkins
Pipeline Examples for GitHub Actions, GitLab CI, and Jenkins
__CAPGO_KEEP_0__アクション
GitHub
A matrix is effective when integration tests can be divided by domain or shard. Service containers keep dependencies close to the runner, while JUnit output gives pull requests and downstream systems a stable result format.
name: integration
on:
pull_request:
jobs:
integration:
strategy:
fail-fast: false
matrix:
suite: [billing, orders, notifications]
runs-on: ubuntu-latest
services:
postgres:
image: postgres:16
env:
POSTGRES_PASSWORD: test
POSTGRES_DB: app_test
options: >-
--health-cmd "pg_isready -U postgres -d app_test"
--health-interval 5s
--health-timeout 5s
--health-retries 12
redis:
image: redis:7
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: npm ci
- run: npm run test:integration, --suite=${{ matrix.suite }}
- if: always()
uses: actions/upload-artifact@v4
with:
name: junit-${{ matrix.suite }}
path: test-results/*.xml
Pin the action and dependency versions to reduce environment drift. GitHub Actions exposes parallelism primarily through matrices and separate jobs, so use a matrix only when each shard has isolated data and predictable duration.
GitLab CI
GitLab CI can separate preparation, test execution, and reporting. Child pipelines are useful when a large repository owns multiple services with different integration environments. Artifacts preserve JUnit results even when the test job fails.
stages:
- build
- integration
build-image:
stage: build
script:
- docker build --tag "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA" .
- docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA"
integration:
stage: integration
parallel:
matrix:
- SUITE: [billing, orders, notifications]
image: "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA"
services:
- name: postgres:16
alias: postgres
- name: redis:7
alias: redis
script:
- ./scripts/migrate-test-db.sh
- npm run test:integration, --suite="$SUITE" --reporter=junit
artifacts:
when: always
reports:
junit: test-results/*.xml
Use GitLab child pipelines when service ownership or deployment topology makes a single monolithic file difficult to maintain. Keep the parent pipeline responsible for the promotion decision, otherwise an individual child can pass while the overall release signal remains ambiguous.
Jenkins
Jenkins is useful when teams need self-hosted agents or unusual network access. A declarative Jenkinsfile can assign Docker-based agents and run suites in parallel, but the team owns plugin, controller, agent, and image maintenance.
pipeline {
agent none
stages {
stage('Build') {
agent { docker 'node:22' }
steps {
sh 'npm ci'
sh 'npm run build'
stash name: 'build', includes: 'dist/**'
}
}
stage('Integration') {
parallel {
stage('Billing') {
agent { docker 'my-org/integration-runner:stable' }
steps {
unstash 'build'
sh './scripts/start-test-dependencies.sh'
sh 'npm run test:integration, --suite=billing'
}
}
stage('Orders') {
agent { docker 'my-org/integration-runner:stable' }
steps {
unstash 'build'
sh './scripts/start-test-dependencies.sh'
sh 'npm run test:integration, --suite=orders'
}
}
}
}
}
post {
always {
junit 'test-results/*.xml'
}
}
}
| Feature | GitHub Actions | GitLab CI | Jenkins |
|---|---|---|---|
| Parallel execution | マトリックスジョブと分離されたジョブ | parallel マトリックスジョブと |
宣言的 parallel ステージと分散されたエージェント |
| 環境制御 | ホストされたランナーまたは自社のランナー | ホストされたランナーまたは自社のランナー | 自社のコントローラーとエージェント |
| 結果の可視性 | アーティファクトとチェックアノテーション | JUnitレポートとアーティファクト | JUnitパブリッシャーとビルド履歴 |
| バージョン再現性 | 固定アクション、イメージ、セットアップバージョン | 固定イメージとランナー設定 | 固定エージェントイメージと制御されたプラグイン |
| 最適な運用 | GitHub-センターのリポジトリ | GitLab-センターの配信 | 自社で拡張的なカスタマイズが必要なチーム |
GitHubを使用しているチーム向け 自動ビルドとリリースのGitHub Actions __CAPGO_KEEP_0__ Actionsを使用すると、自動ビルドとリリースが可能になります。重要な設計上の選択肢は、すべての3つのランナーで同じです。すべての高コストのテストを同期マージブロッカーとして実行しないことです。
信頼性戦略: フレーキーな統合テスト
再試行は診断に役立つが、全面的な再試行は信頼性の策略としては劣ります。実際の欠陥を真っ黒のビルドに変えるだけでなく、環境の不安定性を隠し、パス率のダッシュボードが管道の実際の状態よりも健康に見えるようにします。
問題の規模は、公開されたエンジニアリングデータで見ることができます。Googleは、概して 16%のテスト 一部の不確実性と約 1.5%のすべてのテスト実行 不確実な結果を返すことがありました。 また、別の研究では 4.56%のGoogleテスト失敗 は不確実なテストによって引き起こされたと、AWSの継続的インテグレーションとデリバリーのテストガイドにまとめられています。 Googleのデータも、約 84%のパスから失敗へのCI移行が不確実性によるもので、真のバグによるものではなく、Microsoftのプロジェクトでは約 4.6% の不正確なテスト 1 つの研究では、Panto による不正確なテスト統計のレビューに従っています。

ポリシーを変更する前に測定する
不正確性を追跡する:
不正確な失敗 ÷ 総実行 × 100
7 から 30 日のウィンドウを使用します。 それぞれのスイート、テスト、ランナーイメージ、依存関係、環境ごとに、計算してください。ランナー上でしか失敗しないテストと、すべての環境で失敗するテストは、異なる対処方法です。次の分類を使用します:
製品の失敗:
- 関連するゲートをブロックし、__CAPGO_KEEP_0__ または契約を修正します。 block the relevant gate and fix the code or contract.
- 環境の問題: 修復:健康チェック、リソースの制限、ネットワーク、依存関係の設定。
- テストの問題: 修復:アサーションの順序、共有状態、タイミング、クリーンアップ、またはフィクスチャの設計。
- 未分類の不安定性: 一時的に隔離するが、所有者と有効期限を割り当ててください。
通常の原因を排除する
共有の可変状態は順序依存性を生じる。各ジョブに隔離されたスキーマ、ユニークな識別子、またはトランザクションロールバック境界を与えます。非同期システムには、有界タイムアウトを持つ条件に基づくポーリングが必要であり、任意の睡眠ではなく。期限切れのロジックに時刻をインジェクトし、コンテナの健康を待ち、プロセスの起動を待つのではなく。
シャーディングは壁時計時間を短縮しますが、悪いテストを修正しません。シャードを独立して実行し、各シャードのログを保存し、診断のために失敗したテストまたはシャードのみを再実行してください。環境の問題が 1 つだけあれば、パイプライン全体を再実行する必要はありません。
テストは、環境で実行される環境で連続して緑の実行を満たすまで、隔離から解除されることはありません。チームが選択したしきい値は、ポリシーに記録されます。隔離ラベルを削除することによって、テストが隔離から解除されることはありません。
ゲーティング ポリシーとデプロイメント プロモーション ルール
品質ゲートは、次の環境に進むには、このアーティファクトが十分な信頼できる証拠を持っているかどうかを答える質問に答えるべきです。ゲートは、組織が蓄積したすべてのテストをダンプグラウンドにしたりしないでください。
警告の差は、強制されていないことです。2025年の調査で引用された TestkubeのCI/CDテスト分析 によると 72%の組織 CI/CDで自動化されたQAを持っていますが 26% テストが失敗したときにデプロイをブロックする品質ゲートを実施していません。採用だけでは、リリースの決定は記憶、急務、または手動チェックリストに任せています。
ステージごとにゲートを使用します。
コミット時には、高速なユニットテストと保護されたインターフェイスの変更または重要な部分を保護する安定した統合サブセットにブロックします。
| ステージング時には、より広範な組み合わせされた環境チェックとデプロイ構成の検証を追加します。 | プロダクション前に、承認済みアーティファクト、成功した保護された環境検証、およびリスクモデルがそれを必要とする場合の明示的な承認を必要とします。 | ステージ | 通過率が必要です。 |
|---|---|---|---|
| コミットまたはプルリクエスト | すべてのブロックチェックが通っている | ブロックセット外のテストのみ | 自動マージ保護 |
| ステージングプロモーション | すべての重要な統合チェックが通っている | 文書化されたオーナーとリスクレビューの場合のみ許可 | チームまたはサービスオーナー |
| キャニラーオールロールアウト | プロモーションチェックとライブヘルスシグナルが通っている | 保護されたパスをカバーしない隔離テストは存在しない | オンコールまたはリリースオーナー |
| CI/CD統合テスト | すべての必要なゲートが監査証拠で通過 | ブロッキングパス隔離なし | 明示的な承認が必要な場合 |
「通過率」と「目標パーセンテージ」を混同しないでください。スイートは高い通過率を示すことができますが、重要な支払いまたは認証パスで繰り返し失敗することもあります。重要なパスカバレージを動作に基づいて定義し、次にそれらのチェックを決定論的に通過させる必要があります。
バイパスを表示する
ブランチ保護を設定して、ブロッキングチェックが失敗した場合にマージを防止します。環境保護ルールを設定して、プロモーションが必要な承認とアーティファクトを要求します。インシデントの際には人間のオーバーライドが必要になる場合がありますが、明示的な理由、名前の付いた承認者、タイムスタンプ、フォローアップチケットが必要です。
隔離は失敗を無視する許可ではありません。運用を進めるために証拠を保存するコントロールされた方法です。隔離されたテストが保護されたリリースパスをカバーしている場合、ポリシーはそれをブロッキング状態に戻すか、リスク決定が必要になるまでプロモーションを停止する必要があります。
CI/CD統合テストの採用チェックリストと長期的な信頼の観察性
チームはCI/CD統合テストに失敗することが多い。あるいは、すべてのマージを遅くする膨大なスイートから始めるか、生産環境で暴露される失敗を実際にテストしない広範なモックで高速スイートを作成する。段階的な採用計画は両方の罠を避けることができます。

Phase one,信頼できる信号を作成
既存のパイプラインから始めます:
- 最初のゲートを設定します: 重要なサービス契約を特定し、安定したチェックのみブロッキングにします。
- リトライ動作を定義します: 診断用にターゲット化された再実行を許可し、失敗を成功に変える静的なリトライは許可しません。
- 並列化を有効にします: ドメイン、依存性、またはシャードに基づいてスイートを分割し、各ジョブごとに隔離されたデータを使用します。
- テスト結果を公開します: JUnitレポート、ログ、コンテナのステータス、そして各実行ごとに失敗の分類を保存します。
この段階では、最大のカバレッジを求めるのではなく、最も高価なノイズの源を削除し、再び開発者への信頼を回復して、実際の依存性カバレッジを拡大します。
Phase two、環境の信頼性を高めます
依存関係の再現コストが低いものには、Testcontainersを追加します。サービス所有権が分散されている場合に契約テストを導入します。ルーティング、デプロイメント構成、クロスサービス動作がコンパクトなジョブで正確に表現できない場合に、エフェメラル環境を使用します。
生産インシデントがマイグレーション不一致を露呈した場合、実際のデータベースパスを追加します。独立してデプロイされたサービス間でAPIが漂い、消費者とプロバイダー契約を追加します。Kubernetes構成に依存する失敗の場合、エフェメラルネームスペースで関連するチェックを実行するのではなく、モックが同じことを証明することを装うのではなくします。
第3段階、観察性をトリアージに接続します。
キャプチャ テスト時間の百分位数環境構成の差異、ロックされた依存関係のバージョン、リトライパス比率、OpenTelemetryを通じて関連するアプリケーションログとトレースを通じて。
- 有用なダッシュボードは、以下を表示する必要があります。 フレイク率バーンアップ
- どのスイートとテストがより決定論的ではないようになりました。 平均時間を緑に戻す
- 失敗したパイプラインが回復するまでに費やした時間の平均値。 Whether failures group around code, environment, dependency, or test design.
- 隔離ストック: どのテストが隔離され、誰がそれを所有し、いつレビューする必要があるか
- プロモーション証拠: 各環境変更前に通過したゲート
これは、 アプリケーション観察性の運用的な意味です。ダッシュボードは、過去のアーカイブではありません。今日の決定について、テストがブロックするか、非同期に待つか、または隔離に戻るかを決定する必要があります。
ブロッキングサブセット、隔離ルール、環境所有権、リトライ制限、アーティファクト要件、オーバーライドプロセスを含む、1ページのチームポリシーを維持してください。失敗データが変更されたときに、重大インシデントが会話を強制するのではなく、レビューしてください。
Capgo provides CI/CD integrations for automating signed live-update bundle uploads after a web build, with channels that can support feature-branch, staging, and production workflows. If your CapacitorJS or Electron team needs to connect integration-test evidence to controlled mobile delivery, visit Capgo to evaluate the API and rollout workflow.