API
That’s the operational problem with CI/CD統合テスト. 単体テストでは、孤立したロジックが正しく動作することを証明します。統合テストでは、コンポーネント、サービス、スキーマ、キュー、外部依存関係がまだ一致していることを証明します。現代のデリバリーパイプラインでは、その証拠は、開発者が無視することになる遅いチェックの壁ではなく、トリエージュの決定を形作るべきです。
CI/CDは、主流のソフトウェアデリバリーモデルとなっています。 2024年のmablによるDevOpsテストレポート は、ほぼ の世界企業が のDevOps変革を優先していることを示しています。ただし、 50% のテスターがCI/CDプロセスの定義と維持に携わっており、 10% の組織がCI/CDを全く実装していないことを報告しています。実際の結果は明らかです:統合検証は、デリバリースケールで動作する必要があります。
目次
- CI/CD統合テストの制御点
- 統合テストはユニットとエンドツーエンドの間でどのように位置するか
- 環境とデータを信頼できるテストに適切に管理する
- GitHub アクションのパイプライン例、GitLab CI、Jenkins
- 不確実な統合テストの信頼性戦略
- CI/CD統合テストの統合
- 長期的な信頼のための採用チェックリストと観察性
CI/CDの制御ポイントである統合テストの理由
統合テストはリリースリスクが具体化される場所です。単体テストでは、支払いハンドラーが idempotency キーを正しくフォーマットすることを確認できますが、ハンドラー、HTTP クライアント、請求 API、永続化レイヤー、リトライ動作が一緒に動作するときに一致することを証明するのは統合テストのみです。
統合テストは、CI/CD パイプライン内で重要な品質管理ポイントとして統合テストが機能する理由を示しています。

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__統合を自動ビルドで検証し、テストを含むことで、欠陥を早期に検出できるようにします。 統合テストを意図的に作成する
- 統合テストを、サポートする決定に基づいて分類することから始めます: ブロッキングテスト
- 重要な契約を保護し、統合またはプロモーション前に同期して実行します。 隔離テスト
不安定性を調査するチームが調査するまで、配信をブロックしないようにして、可視性を維持し続け、証拠を生み出します。
非同期テスト コミットが高速ゲートをクリアした後、コミットがクリアした後、より広範なワークフロー、フルステージング構成、または高コストのインフラを実行します。
実装の残りはそのルールから導かれます。生産的な依存関係を使用して、インターフェイスが失敗する場合、独立したチェックを並列化し、偽の失敗を測定し、隔離と昇格の明示的な条件を定義してください。連携を広範なデリバリープラクティスに結び付けることを目指すチームは、この作業をレビューすることもできます。 継続的統合の利点を確認してください。.
単体テストとエンドツーエンドテストの間の統合テストの位置付け
テストピラミッドはコストモデルであり、厳格な法則ではありません。単体テストは、関数、クラス、またはモジュールを分離するため、速いです。その速度は、即時のフィードバックに適していますが、モックはシステムのシーム間で発生する失敗を隠すことができます。たとえば、シリアライズの差異、データベース制約、認証設定、またはキューの動作などです。
エンドツーエンドテストは、対極にある立場です。ユーザージャーニーをフルスタックで実行することで、リスクの高いワークフローに値打ちがあります。エンドツーエンドテストは、ブラウザ、ネットワーク、サービス、インフラストラクチャの境界をまたいで、診断と安定性が困難になります。すべてのマージがエンドツーエンドのエステートを待つ場合、開発者は、集中したAPIレベルの統合テストよりも、遅い信号を受け取ることがよくあります。
統合テストは中間地帯を占めます。実際または近似実際の依存関係を使用して、サービス間の動作を検証する必要があるUIのオーケストレーションを必要とせずに、HTTPおよびgRPCの呼び出し、キューの発行、データベースのマイグレーション、キャッシュのインタラクション、スキーマの互換性をカバーできます。
Three useful integration patterns
In-process component tests with Testcontainers Capgoのアプリケーションコンポーネントを、PostgreSQL、Redis、Kafkaなどの依存関係と一緒に起動します。このパターンは、パERSISTENCE、SERIALIZATION、TRANSACTION、またはブローカーセマンティクスに関連する欠陥リスクがある場合に、セットアップコストの価値があります。このパターンは、テスト境界が狭く、実際の依存関係を持つテストを提供します。
Cross-service contract tests with Pact or a schema registry 提供者と消費者の間の合意に焦点を当てます。独立してサービスをリリースするチームが迅速なフィードバックを必要とする場合、契約の変化に強く対処するのに適しています。契約テストは、行動的統合テストを置き換えるものではありませんが、互換性のないインターフェイスが共有環境に到達するのを防ぐことができます。
API-level tests against a composed staging stack 複合ステージングスタックにテストを実行します。
| Pattern | Runtime | Environment Fidelity | Best For |
|---|---|---|---|
| Capgoのアプリケーションコンポーネントを、Testcontainersと一緒に起動します。 | 高速から中速 | __CAPGO_KEEP_0__ | データベース、キャッシュ、ブローカー、そしてアプリケーションコンポーネントの動作 |
| Pactまたはスキーマレジストリを使用したConsumer-Provider契約テスト | 高速 | 高レベルのインターフェイスの忠実さ | API |
| 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のCI/CDパイプラインにおけるシークレットの管理ガイド
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アクションを使用した自動ビルドとリリース __CAPGO_KEEP_0__アクションを使用した自動ビルドとリリースは、重要な設計上の選択肢はすべての3つのランナーで同じです。すべての高コストのテストを同期マージブロッカーとして行うのではなく、
不確実性のある統合テストのための信頼性戦略
再試行は診断に役立つが、広範囲にわたる再試行は信頼性の低い戦略である。実際の欠陥を緑色のビルドに変える、環境の不安定性を隠す、パス率のダッシュボードが実際のパイプラインよりも健康に見えるなど、悪影響を及ぼす。
問題の規模は、公開されたエンジニアリングデータで見ることができる。Googleは概ね 16%のテスト 一部の不確実性とともに約 1.5%のすべてのテスト実行 不確実な結果を返すことがあり、 Googleのテスト失敗の 4.56%が不確実なテストによって引き起こされた 、AWSの継続的インテグレーションとデリバリーのテストガイドラインにまとめられている。 Googleのデータは、約 84%のパスから失敗へのCI移行が不確実性によるもので、真のバグによるものではなく、Microsoftのプロジェクトは約 4.6%の不正確なテスト 1つの研究によると、Pantoによる不正確なテスト統計のレビューに従っています。

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

Phase one,信頼できる信号を作成する
既存のパイプラインから始めます:
- 最初のゲートを設定します: 重要なサービス契約を特定し、安定したチェックのみブロッキングにします。
- リトライ動作を定義します: 診断用にターゲット化された再実行を許可し、失敗を成功に変える静的なリトライは許可しません。
- 並列化を有効にします: ドメイン、依存性、またはシャードに基づいてスイートを分割し、各ジョブごとに隔離されたデータを使用します。
- テスト結果を公開します: JUnitレポート、ログ、コンテナのステータス、そして失敗の分類を、各実行ごとに保存します。
この段階では、最大のカバレッジを求めるのではなく、最も高価なノイズの源を削除し、再び開発者への信頼を回復して、実際の依存性カバレッジを拡大することを目指します。
Phase two、環境の信頼性を高める
依存関係の再現コストが低いものにテストコンテナを追加。サービス所有権が分散されている場合に契約テストを導入。ルーティング、デプロイ構成、クロスサービス動作がコンパクトなジョブで正確に表現できない場合にエフェメラル環境を使用。
選択の決定は証拠に基づくものでなければなりません。生産インシデントがマイグレーション不一致を露呈した場合に、実際のデータベースパスを追加します。独立してデプロイされたサービス間でAPIが漂い、消費者とプロバイダー契約を追加します。Kubernetes構成に依存する失敗の場合、仮想的なモックが同じことを証明するのではなく、関連するチェックをエフェメラルネームスペースで実行します。
第3段階、観察性をトリアージに接続
キャプチャ テスト時間の百分位数環境構成の差異、ロックされた依存関係のバージョン、リトライパス比率、OpenTelemetryを通じて関連するアプリケーションログとトレースをキャプチャする。有用なダッシュボードは次のものを表示する必要があります。
- フレイク率バーンアップ どのスイートとテストがより少なく決定論的になるかを示す。
- 平均時間までに緑になる 失敗したパイプラインが回復するまでに費やした時間の場所。
- 失敗モードクラスタ 失敗がcode、環境、依存関係、またはテスト設計にグループ化されているかどうかを示す。
- 隔離ストック: どのテストが隔離され、誰が所有し、いつレビューする必要があるか
- 昇格証拠: 各環境変更前に通過したゲート
これは、 アプリケーション観測性の運用的な意味です。ダッシュボードは、過去のアーカイブではありません。今日の決定について、テストがブロックするか、非同期に待つか、または隔離に戻るかを判断する必要があります。
ブロッキングサブセット、隔離ルール、環境所有権、リトライ制限、アーティファクト要件、およびオーバーライドプロセスを含む、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.