CI/CD पाइपलाइन में टेस्टिंग

CI/CD टेस्टिंग क्वालिटी एश्योरेंस का वह हिस्सा है जो हर बार कोड बदलने पर अपने-आप चलता है: pipeline बदलाव को build करती है, एक सोचे-समझे क्रम में जाँचें चलाती है, नतीजे प्रकाशित करती है और तय करती है कि बदलाव प्रोडक्शन की ओर आगे बढ़ सकता है या नहीं। टेस्टर के लिए pipeline वह जगह है जहाँ आज ज़्यादातर regression जाँच होती है, जहाँ टेस्ट फ़ेलियर सबसे पहले दिखते हैं, और जहाँ रिलीज़ का फ़ैसला या तो सबूत पर टिका होता है या नहीं।

यह गाइड इस विषय का प्रवेश-द्वार है। यह continuous integration, delivery और deployment, pipeline के टेस्ट स्टेज और उनका क्रम क्यों मायने रखता है, क्वालिटी गेट, रिपोर्ट और artifacts, एनवायरनमेंट और secrets, पैरलल execution, flaky टेस्ट की नीति और लाल pipeline का ट्राइएज समझाती है। दो संकरी गाइड गहराई में जाती हैं: एक smoke, sanity और regression टेस्टिंग की तुलना करती है और regression टेस्ट चुनना दिखाती है; दूसरी डिप्लॉयमेंट के बाद के वेरिफ़िकेशन को कवर करती है — post-deploy smoke टेस्ट, canary रिलीज़ और rollback।

Continuous integration, continuous delivery और continuous deployment

Continuous integration (CI) हर डेवलपर के काम को साझा mainline में बार-बार — कम से कम रोज़ — merge करने की प्रैक्टिस है, जिसमें हर merge को एक ऑटोमेटेड, self-testing build से वेरिफ़ाई किया जाता है। Martin Fowler का व्यापक रूप से संदर्भित विवरण वे नियम जोड़ता है जिनसे यह काम करता है: build तेज़ रखें, टूटा build तुरंत ठीक करें, और लाल mainline को सबकी समस्या मानें। CI टीम की आदत है जिसे एक टूल सहारा देता है, ख़ुद टूल नहीं; लंबे समय तक चलने वाली branch पर हफ़्ते में एक बार चलने वाला CI सर्वर continuous integration नहीं है।

Continuous delivery CI को इस तरह बढ़ाती है कि pipeline पास करने वाला हर बदलाव रिलीज़ के लायक हो: वह एक बार build होता है, प्रोडक्शन जैसे एनवायरनमेंट में टेस्ट होता है और एक बटन दबाकर प्रोडक्शन में डिप्लॉय किया जा सकता है। डिप्लॉय का फ़ैसला इंसानी या बिज़नेस फ़ैसला रहता है। Continuous deployment यह फ़ैसला हटा देती है: सभी ऑटोमेटेड स्टेज पास करने वाला हर बदलाव अपने-आप प्रोडक्शन में जाता है। टेस्टर के लिए यह फ़र्क़ अहम है क्योंकि continuous deployment में कोई मैनुअल चेकपॉइंट नहीं बचता — जो pipeline नहीं जाँचती, उसे यूज़र के देखने से पहले कोई नहीं जाँचता।

  • Continuous integration — mainline में बार-बार merge, हर merge ऑटोमेटेड build और टेस्ट से वेरिफ़ाई।
  • Continuous delivery — हर पास होने वाला बदलाव डिप्लॉय-योग्य; रिलीज़ कब हो यह कोई व्यक्ति चुनता है।
  • Continuous deployment — हर पास होने वाला बदलाव अपने-आप डिप्लॉय; डिप्लॉयमेंट के बाद का वेरिफ़िकेशन आख़िरी सुरक्षा-जाल बन जाता है।
  • तीनों में ऑटोमेटेड टेस्ट ही सबूत हैं। Pipeline उतनी ही भरोसेमंद है जितने उसके टेस्ट और उसके लागू किए गेट।

Pipeline के टेस्ट स्टेज और उनका क्रम क्यों मायने रखता है

Pipeline जाँचों को ऐसे क्रम में रखती है कि सबसे सस्ती, सबसे तेज़ और सबसे ज़्यादा फ़ेल होने की संभावना वाली जाँचें पहले चलें, और धीमी, महँगी और एनवायरनमेंट-निर्भर जाँचें बाद में — सिर्फ़ उन बदलावों पर जो पिछले स्टेज पार कर चुके हैं। यह समय पर लागू किया गया test pyramid है: डेवलपर को टाइपो का पता मिनटों में चलना चाहिए, चालीस मिनट के ब्राउज़र सूट के बाद नहीं। तेज़ फ़ीडबैक सुविधा भर नहीं है; फ़ीडबैक धीमा हो तो लोग बदलावों को बैच में जोड़ते हैं, और बड़े बैच में फ़ेलियर को किसी एक कारण से जोड़ना मुश्किल होता है।

सटीक स्टेज टीम-दर-टीम अलग होते हैं, पर ज़्यादातर pipeline मिलते-जुलते क्रम पर आ जाती हैं। हर स्टेज का एक समय-बजट होना चाहिए; स्टेज उससे बढ़ जाए तो टीम उसे पैरलल करती है, धीमे टेस्ट बाद के स्टेज में ले जाती है, या दोहराई गई कवरेज हटाती है।

  • Commit stage (मिनट) — static जाँचें (lint, type check, formatting, dependency और secret scanning), यूनिट टेस्ट और component टेस्ट जिनमें dependencies की जगह test doubles हों। हर push और pull request पर चलता है।
  • Integration और API स्टेज — असली डेटाबेस, queue और service containers के साथ एप्लिकेशन; API टेस्ट कॉन्ट्रैक्ट (OpenAPI) के विरुद्ध। यहीं ज़्यादातर बिज़नेस नियम उचित लागत पर वेरिफ़ाई होते हैं।
  • End-to-end / UI स्टेज — असली ब्राउज़र या डिवाइस से अहम यूज़र यात्राओं का छोटा सेट; सबसे धीमा और flakiness के प्रति सबसे संवेदनशील, इसलिए जानबूझकर छोटा रखा जाता है।
  • Non-functional स्टेज — छोटा performance smoke (मुख्य endpoints पर कुछ मिनट का लोड, latency और error rate की thresholds के साथ), security scans (static analysis, dependency vulnerabilities, बेसलाइन dynamic scan), मुख्य पेजों पर accessibility जाँच।
  • Post-deployment स्टेज — अभी-अभी डिप्लॉय हुए एनवायरनमेंट पर smoke टेस्ट और health checks, फिर synthetic monitoring। डिप्लॉयमेंट वेरिफ़िकेशन गाइड में विस्तार से।
  • Scheduled स्टेज — पूरा regression सूट, लंबे लोड टेस्ट और पूरे security scans हर बदलाव पर नहीं बल्कि रात में या हफ़्ते में चलते हैं, और उस owner को रिपोर्ट करते हैं जो फ़ेलियर पर कार्रवाई करता है।
एक बदलाव के स्टेज, क्रम से: सबसे सस्ती और तेज़ जाँचें पहले चलती हैं, और हर अगला स्टेज सिर्फ़ वही बदलाव देखता है जो पिछले स्टेज पार कर चुके हैं।
  1. 1Commit stageमिनट। Static जाँचें, यूनिट और component टेस्ट; हर push और pull request पर

    गेट: सिर्फ़ पास हुए बदलाव आगे जाते हैं

  2. 2Integration और APIअसली डेटाबेस, queue और services; कॉन्ट्रैक्ट के विरुद्ध API टेस्ट

    गेट: सिर्फ़ पास हुए बदलाव आगे जाते हैं

  3. 3End-to-end / UIअसली ब्राउज़र या डिवाइस में अहम यात्राओं का छोटा सेट

    गेट: सिर्फ़ पास हुए बदलाव आगे जाते हैं

  4. 4Non-functionalPerformance smoke, security scans, accessibility जाँच

    गेट: Deploy — continuous deployment में अपने-आप; continuous delivery में कोई व्यक्ति तय करता है

  5. 5Post-deploymentनए एनवायरनमेंट पर smoke टेस्ट और health checks, फिर synthetic monitoring

पहले: सबसे सस्ती, सबसे तेज़, फ़ेल होने की सबसे ज़्यादा संभावनाबाद में: धीमी, महँगी, एनवायरनमेंट-निर्भर

क्रम से बाहर
  • Scheduled: रात में या हफ़्ते मेंपूरा regression सूट, लंबे लोड टेस्ट और पूरे security scans; रिपोर्ट किसी owner को जाती है जो फ़ेलियर पर कार्रवाई करता है

उदाहरण के तौर पर क्रम: सटीक स्टेज टीम-दर-टीम अलग होते हैं।

आज़माएँ: OpenAPI → टेस्ट केस आज़माएँ: Concurrent रिक्वेस्ट टेस्ट जनरेटर आज़माएँ: रिस्पॉन्स टाइम एनालाइज़र

उदाहरण: commit, API, E2E और deploy स्टेज वाली pipeline

नीचे दिया workflow GitHub Actions syntax में लिखा एक उदाहरण है। यह पहले static जाँचें और यूनिट टेस्ट चलाता है, फिर migrations और सिंथेटिक seed डेटा के साथ एक अस्थायी PostgreSQL service container के विरुद्ध API टेस्ट, फिर चार पैरलल shards में बँटा ब्राउज़र सूट, और main branch पर staging में डिप्लॉय करके smoke स्क्रिप्ट चलाता है। हर टेस्ट job फ़ेल होने पर भी अपनी रिपोर्ट और artifacts अपलोड करता है (`if: always()`), क्योंकि बिना सबूत वाला फ़ेलियर जाँचने में सबसे महँगा होता है। GitLab CI और Jenkins यही ढाँचा `.gitlab-ci.yml` या Jenkinsfile में stages और jobs से व्यक्त करते हैं।

  • `needs` क्रम को स्पष्ट करता है: यूनिट या API टेस्ट फ़ेल हों तो E2E shards कभी शुरू नहीं होते।
  • `concurrency` के साथ `cancel-in-progress` उसी pull request पर नए push से दूसरा run शुरू होने पर पहले से चल रहा run रोक देता है, जिससे runner का समय बचता है। main और nightly schedule refs/heads/main वाला एक ही group साझा करते हैं; उन पर चल रहा run कभी रद्द नहीं होता, ताकि कोई डिप्लॉयमेंट बीच में न टूटे; फिर भी, हर concurrency group के डिफ़ॉल्ट व्यवहार की तरह, group में इंतज़ार कर रहा (pending) run नया run queue होने पर रद्द हो जाता है।
  • `timeout-minutes` अटके टेस्ट को घंटों इंतज़ार करते job की जगह दिखने वाले फ़ेलियर में बदल देता है।
  • Deploy token प्लेटफ़ॉर्म के secret store से आता है; डेटाबेस पासवर्ड literal सिर्फ़ इसलिए है क्योंकि container एक ही job तक जीता है।
  • Schedule डिफ़ॉल्ट branch पर चलता है; GitHub Actions में cron समय UTC में होते हैं, जब तक schedule में कोई time zone तय न किया गया हो।
# Example pipeline (GitHub Actions syntax). Adapt job names, scripts and versions to your project.
name: ci

on:
  pull_request:
  push:
    branches: [main]
  schedule:
    - cron: "0 1 * * *"   # nightly full regression, 01:00 UTC

concurrency:
  group: ci-${{ github.ref }}
  cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
  commit-stage:
    runs-on: ubuntu-latest
    timeout-minutes: 15
    steps:
      - uses: actions/checkout@v7
      - uses: actions/setup-node@v7
        with:
          node-version: 24
          cache: npm
      - run: npm ci
      - run: npm run lint
      - run: npm run typecheck
      - run: npm run test:unit          # writes reports/junit-unit.xml
      - uses: actions/upload-artifact@v7
        if: always()
        with:
          name: unit-reports
          path: reports/

  api-tests:
    needs: commit-stage
    runs-on: ubuntu-latest
    timeout-minutes: 20
    services:
      postgres:
        image: postgres:16
        env:
          POSTGRES_PASSWORD: ci-only-password   # throwaway container, not a real secret
        ports:
          - 5432:5432
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
    env:
      DATABASE_URL: postgres://postgres:ci-only-password@localhost:5432/postgres
    steps:
      - uses: actions/checkout@v7
      - uses: actions/setup-node@v7
        with:
          node-version: 24
          cache: npm
      - run: npm ci
      - run: npm run db:migrate
      - run: npm run db:seed            # synthetic test data only
      - run: npm run test:api           # writes reports/junit-api.xml
      - uses: actions/upload-artifact@v7
        if: always()
        with:
          name: api-reports
          path: reports/

  e2e:
    needs: api-tests
    runs-on: ubuntu-latest
    timeout-minutes: 30
    strategy:
      fail-fast: false
      matrix:
        shard: [1, 2, 3, 4]
    steps:
      - uses: actions/checkout@v7
      - uses: actions/setup-node@v7
        with:
          node-version: 24
          cache: npm
      - run: npm ci
      - run: npx playwright install --with-deps
      - run: npx playwright test --shard=${{ matrix.shard }}/4   # config starts the app
      - uses: actions/upload-artifact@v7
        if: always()
        with:
          name: e2e-results-${{ matrix.shard }}
          path: |
            playwright-report/
            test-results/

  deploy-staging:
    if: github.event_name == 'push' && github.ref == 'refs/heads/main'
    needs: e2e
    runs-on: ubuntu-latest
    environment: staging
    steps:
      - uses: actions/checkout@v7
      - run: ./scripts/deploy.sh staging
        env:
          DEPLOY_TOKEN: ${{ secrets.STAGING_DEPLOY_TOKEN }}
      - run: ./scripts/smoke.sh https://staging.example.com

आज़माएँ: YAML फ़ॉर्मेटर आज़माएँ: Cron एक्सप्रेशन जनरेटर आज़माएँ: Cron एक्सप्रेशन एक्सप्लेनर

क्वालिटी गेट: वे मानदंड जो बदलाव रोक सकते हैं

क्वालिटी गेट (quality gate) पास/फ़ेल नियम वाली एक जाँच है जो तय करती है कि बदलाव अगले स्टेज — merge, staging पर डिप्लॉय, प्रोडक्शन में promotion — तक जा सकता है या नहीं। यह exit criteria का ऑटोमेटेड रूप है। गेट तब उपयोगी है जब वह वस्तुनिष्ठ हो, जल्दी जाँचा जा सके, किसी असली जोखिम से जुड़ा हो और बिना अपवाद लागू हो; जिस गेट को नियमित रूप से override किया जाए, वह सबको उसे अनदेखा करना सिखाता है।

दिखावटी गेट (vanity gates) से सावधान रहें। "लाइन कवरेज कम से कम 80% हो" जैसा नियम मापना आसान है और ऐसे टेस्ट से पूरा करना भी आसान जो कोड चलाते हैं पर कुछ उपयोगी assert नहीं करते। कवरेज ट्रेंड के रूप में और अनटेस्टेड कोड खोजने के लिए उपयोगी है; बिना संदर्भ के कच्ची threshold के रूप में यह ग़लत व्यवहार को इनाम देती है। ज़्यादा उपयोगी रूप है बदली गई लाइनों की कवरेज, जिसकी समीक्षा टेस्ट के साथ हो। यही बात "टेस्ट की संख्या" या "retry के बाद 100% pass rate" पर लागू होती है: ये गतिविधि बताती हैं, जोखिम नहीं।

  • सभी ज़रूरी जाँचें हरी: build, lint, type check, यूनिट, API और E2E टेस्ट — quarantine सूची के बाहर कोई टेस्ट skip नहीं।
  • Dependencies या static analysis में कोई नई critical या high vulnerability नहीं, या दर्ज किया गया समय-सीमित अपवाद।
  • API कॉन्ट्रैक्ट अपरिवर्तित, या बदलाव backward compatible (कोई फ़ील्ड हटाया नहीं, कोई नया अनिवार्य इनपुट नहीं) जब तक नया version न हो।
  • Performance smoke thresholds के भीतर, जैसे smoke लोड पर p95 latency 400 ms से कम और error rate 1% से कम, पिछली main-branch बेसलाइन की तुलना में।
  • डेटाबेस migrations मौजूदा schema की कॉपी पर साफ़ लागू हुईं और, जहाँ प्रक्रिया माँगे, टेस्ट किया हुआ rollback या forward-fix प्लान।
  • प्रोडक्शन promotion के लिए: staging पर post-deployment smoke पास और रिलीज़ पर कोई खुला blocker दोष नहीं।

टेस्ट रिपोर्ट और artifacts

Pipeline का नतीजा उतना ही उपयोगी है जितना वह पीछे छोड़ती है। JUnit XML टेस्ट नतीजों का आम interchange फ़ॉर्मेट है: ज़्यादातर test runner इसे लिख सकते हैं और ज़्यादातर CI सिस्टम इसे पढ़ सकते हैं। यह औपचारिक मानक नहीं बल्कि de facto फ़ॉर्मेट है, इसलिए टूल्स के बीच attributes थोड़े बदलते हैं, पर मूल ढाँचा — test suites जिनमें test cases हों, हर एक में वैकल्पिक failure, error या skipped element और अवधि — व्यापक रूप से समर्थित है। उदाहरण के लिए GitLab इसे `artifacts:reports:junit` से पढ़ता है और merge request में नए और ठीक हुए फ़ेलियर दिखाता है; Jenkins इसे हर टेस्ट के इतिहास के साथ test results के रूप में प्रकाशित करता है।

पास/फ़ेल सारांश के अलावा वे artifacts रखें जिनसे कोई व्यक्ति दोबारा चलाए बिना फ़ेलियर का निदान कर सके: एप्लिकेशन और test runner के लॉग, UI फ़ेलियर के लिए स्क्रीनशॉट और वीडियो, traces (Playwright trace actions, नेटवर्क और DOM snapshots रिकॉर्ड करता है और run के बाद खोला जा सकता है), API फ़ेलियर के लिए HTTP request/response कैप्चर, और कवरेज रिपोर्ट। Retention अवधि तय करें ताकि पिछले runs से तुलना हो सके पर artifacts हमेशा जमा न होते रहें, और सुनिश्चित करें कि उनमें असली व्यक्तिगत डेटा या secrets न हों।

<?xml version="1.0" encoding="UTF-8"?>
<testsuites tests="3" failures="1" skipped="1" time="4.21">
  <testsuite name="orders-api" tests="3" failures="1" skipped="1" time="4.21">
    <testcase classname="orders.create" name="returns 201 for a valid order" time="0.84"/>
    <testcase classname="orders.create" name="rejects a negative quantity with 400" time="0.31">
      <failure message="expected status 400, received 500">AssertionError: expected 400, received 500
    at tests/orders.spec.ts:42</failure>
    </testcase>
    <testcase classname="orders.refund" name="refunds a captured payment" time="0">
      <skipped message="quarantined: FLAKY-112"/>
    </testcase>
  </testsuite>
</testsuites>

एनवायरनमेंट, टेस्ट डेटा और secrets

Pipeline टेस्ट को चलने की जगह चाहिए। Ephemeral एनवायरनमेंट — एक pipeline run या एक pull request के लिए बनाए और बाद में नष्ट किए जाने वाले — हर बदलाव को साफ़, अलग-थलग stack देते हैं: डेटाबेस और queues के लिए service containers, या हर branch के लिए अल्पकालिक preview deployment। ये झूठे फ़ेलियर के एक बड़े कारण को हटाते हैं: साझा डेटा के ज़रिए टेस्ट का आपस में टकराना। लंबे समय तक चलने वाले साझा एनवायरनमेंट (प्रोडक्शन जैसा staging) असली third parties के साथ integration और रिलीज़ रिहर्सल के लिए अब भी ज़रूरी हैं, पर वे drift करते हैं, इसलिए pipeline में उनके versions और कॉन्फ़िगरेशन जाँचें।

टेस्ट डेटा pipeline को ख़ुद बनाना चाहिए: migrations schema बनाती हैं, seed स्क्रिप्ट ज्ञात सिंथेटिक बेसलाइन लोड करती हैं, और हर टेस्ट अपने ज़रूरी रिकॉर्ड unique identifiers के साथ बनाता है ताकि पैरलल runs न टकराएँ। प्रोडक्शन का व्यक्तिगत डेटा कभी CI में कॉपी न करें। Secrets — API keys, deploy tokens, साझा एनवायरनमेंट के डेटाबेस पासवर्ड — CI प्लेटफ़ॉर्म के secret store या बाहरी vault में रहें, सिर्फ़ ज़रूरी एनवायरनमेंट तक सीमित, लॉग में masked और rotate किए जाते हुए। GitHub Actions में forks से आए pull requests से शुरू हुए workflows को डिफ़ॉल्ट रूप से repository secrets नहीं मिलते — यह रखने लायक सुरक्षा फ़ीचर है, इससे बचने का रास्ता ढूँढने लायक समस्या नहीं।

  • जहाँ संभव हो हर run के लिए एक एनवायरनमेंट; साझा एनवायरनमेंट सिर्फ़ वहाँ जहाँ वे ऐसी वास्तविकता जोड़ें जो और तरीक़े से न मिले।
  • Schema migrations से, बेसलाइन seed स्क्रिप्ट से, हर टेस्ट का डेटा unique ids के साथ।
  • शुरुआती स्टेज में third parties को उनकी सीमा पर mock या stub करें; असली integration बाद के छोटे स्टेज में टेस्ट करें।
  • Secrets कभी repository में नहीं, कभी प्रिंट नहीं, कभी artifacts में नहीं।

आज़माएँ: टेस्ट डेटा फ़ैक्टरी

पैरलल execution और sharding

जब सूट अपने समय-बजट से बड़ा हो जाए, उसे पैरलल चलाएँ। एक मशीन के भीतर runners कई workers इस्तेमाल करते हैं; मशीनों के पार सूट को shards में बाँटा जाता है, हर shard अपने runner पर एक उपसमूह चलाता है, जैसा ऊपर के उदाहरण में है। Shards संतुलित हों तो sharding wall-clock समय को लगभग shards की संख्या के अनुपात में घटाती है; रिकॉर्ड की गई टेस्ट अवधि के आधार पर बाँटना फ़ाइलों की गिनती के आधार पर बाँटने से बेहतर संतुलन देता है।

पैरलल चलाना टेस्ट के बीच छिपी निर्भरताएँ उजागर करता है: एक ही यूज़र को बदलने वाले दो टेस्ट, ऐसा टेस्ट जो किसी दूसरे के पहले चलने पर निर्भर हो, कोई fixed port या file path। ये टेस्ट डिज़ाइन के दोष हैं, और intermittent फ़ेलियर के रूप में दिखते हैं। हर worker का डेटा अलग रखें, क्रम-निर्भरता से बचें, और हर shard की रिपोर्ट को एक नतीजे में merge करें ताकि गेट पूरे सूट का मूल्यांकन करे।

Pipeline में flaky टेस्ट से निपटना

Flaky टेस्ट एक ही कोड पर कभी पास और कभी फ़ेल होता है। Pipeline में यह दोहरा नुक़सान करता है: अच्छे बदलावों को रोकता है, और लोगों को हरा होने तक "re-run" दबाना सिखाता है, जिसके बाद असली फ़ेलियर भी अनदेखे होने लगते हैं। Non-determinism पर Martin Fowler का लेख quarantine को जवाब के रूप में बताता है: flaky टेस्ट को gating सूट से हटाकर एक अलग, फिर भी चलने वाले सेट में रखें, ताकि टेस्ट ठीक होने तक pipeline भरोसेमंद रहे। कारण और समाधान flaky टेस्ट गाइड में हैं; pipeline को एक नीति चाहिए।

  • Retries: अधिकतम एक ऑटोमैटिक retry की अनुमति दें, जो टेस्ट सिर्फ़ retry पर पास हो उसे passed नहीं बल्कि flaky रिपोर्ट करें, और पूरे job को चुपचाप कभी retry न करें।
  • Quarantine: quarantined टेस्ट अब भी चलता और रिपोर्ट करता है, gate नहीं करता, उसका owner और ticket होता है, और ठीक करने या हटाने की डेडलाइन होती है।
  • Tracking: हर flaky घटना दर्ज करें (test id, commit, error, run का लिंक) ताकि टीम सबसे बुरे टेस्ट की रैंकिंग कर सके; हर टेस्ट का flake rate देखने लायक संख्या है।
  • सीमाएँ: quarantine सूची के आकार की सीमा रखें; बढ़ती quarantine संकेत है कि टेस्ट डिज़ाइन पर ध्यान चाहिए, समस्याएँ पार्क करने की जगह नहीं।

Pipeline फ़ेलियर विश्लेषण: एक ट्राइएज फ़्लो

लाल pipeline के चार आम कारण होते हैं: बदलाव से आया प्रोडक्ट दोष, ग़लत या पुराना टेस्ट, एनवायरनमेंट या इन्फ़्रास्ट्रक्चर की समस्या, या flaky टेस्ट। हर लाल build को प्रोडक्ट बग मानना डेवलपर का समय बर्बाद करता है; हर लाल build को flakiness मानना दोषों को निकल जाने देता है। एक छोटा, साझा ट्राइएज फ़्लो मिनटों में सही वर्गीकरण तक पहुँचाता है। पहला सवाल हमेशा वही है: ठीक-ठीक क्या फ़ेल हुआ, और artifacts ने क्या दर्ज किया?

नीचे का ट्राइएज फ़्लो पाँच सवाल क्रम से पूछता है। (1) क्या job किसी भी टेस्ट के चलने से पहले फ़ेल हुआ (dependency install, build, image pull, runner का खो जाना)? हाँ, तो यह pipeline या इन्फ़्रास्ट्रक्चर की समस्या है, जिसकी owner platform टीम है: इसे ठीक करें, फिर re-run करें। (2) क्या यह setup के दौरान फ़ेल हुआ (DB तैयार नहीं, migration error, unhealthy सर्विस, expired secret)? हाँ, तो यह एनवायरनमेंट की समस्या है: एनवायरनमेंट ठीक करें, टेस्ट को न छुएँ। (3) फ़ेल हुए टेस्ट उसी commit पर एक बार दोबारा चलाएँ: अब पास हों तो यह flaky होने का उम्मीदवार है — इसे दर्ज करें (test id, commit, error, run का लिंक), इसका ticket खोलें या अपडेट करें, और फिर से हो तो quarantine करें; हरा re-run यह साबित नहीं करता कि बदलाव सुरक्षित है। फिर भी फ़ेल हों तो फ़ेलियर deterministic है, अगले सवाल पर जाएँ। (4) क्या वही टेस्ट इस बदलाव के बिना main पर भी फ़ेल होता है? हाँ, तो यह पहले से मौजूद टूट या एनवायरनमेंट drift है: main के owner को बताएँ; नहीं, तो कारण यही बदलाव है, आख़िरी सवाल पर जाएँ। (5) क्या प्रोडक्ट का व्यवहार ग़लत है, या टेस्ट की अपेक्षा पुरानी हो गई है? प्रोडक्ट ग़लत है तो यह प्रोडक्ट दोष है: बग रिपोर्ट बने और merge रुका रहे; नया व्यवहार जानबूझकर है तो उसी बदलाव में टेस्ट अपडेट करें, जिसकी समीक्षा कोड की तरह हो।

पाँच सवाल क्रम से लाल pipeline को छाँटते हैं: पहले इन्फ़्रास्ट्रक्चर और एनवायरनमेंट, फिर flakiness और main पर पहले से मौजूद टूट, और उसके बाद ही प्रोडक्ट दोष या पुराना टेस्ट।
प्रश्न 1: क्या job किसी भी टेस्ट के चलने से पहले फ़ेल हुआ?Dependency install, build, image pull, runner का खो जाना
  • उत्तर: हाँ

    परिणाम: Pipeline या इन्फ़्रास्ट्रक्चर की समस्याOwner: platform टीम। इसे ठीक करें, फिर re-run करें।
  • उत्तर: नहीं

    प्रश्न 2: क्या यह setup के दौरान फ़ेल हुआ?DB तैयार नहीं, migration error, unhealthy सर्विस, expired secret
    • उत्तर: हाँ

      परिणाम: एनवायरनमेंट की समस्याएनवायरनमेंट ठीक करें, टेस्ट को न छुएँ।
    • उत्तर: नहीं

      प्रश्न 3: फ़ेल हुए टेस्ट उसी commit पर एक बार दोबारा चलाएँ: क्या अब पास हुए?
      • उत्तर: हाँ

        परिणाम: Flaky होने का उम्मीदवारइसे दर्ज करें, ticket खोलें या अपडेट करें, फिर से हो तो quarantine करें। हरा re-run यह साबित नहीं करता कि बदलाव सुरक्षित है।
      • उत्तर: नहीं: फ़ेलियर deterministic है

        प्रश्न 4: क्या वही टेस्ट इस बदलाव के बिना main पर भी फ़ेल होता है?
        • उत्तर: हाँ

          परिणाम: पहले से मौजूद टूट या एनवायरनमेंट driftmain के owner को बताएँ।
        • उत्तर: नहीं: कारण यही बदलाव है

          प्रश्न 5: क्या प्रोडक्ट का व्यवहार ग़लत है, या टेस्ट की अपेक्षा पुरानी हो गई है?
          • उत्तर: प्रोडक्ट ग़लत है

            परिणाम: प्रोडक्ट दोषबग रिपोर्ट बने और merge रुका रहे।
          • उत्तर: नया व्यवहार जानबूझकर है

            परिणाम: उसी बदलाव में टेस्ट अपडेटइसकी समीक्षा कोड की तरह हो।
  • पहली error पढ़ें, आख़िरी नहीं; बाद के फ़ेलियर अक्सर उसी के परिणाम होते हैं।
  • उसी job के आख़िरी हरे run से तुलना करें: बदली dependencies, runner image, डेटा या कॉन्फ़िगरेशन।
  • हर लाल build के वर्गीकरण के साथ failure log रखें; एक महीने में यह दिखा देता है कि pipeline मुख्यतः दोषों, flakiness या एनवायरनमेंट से पीड़ित है।
  • Pipeline द्वारा पकड़े गए प्रोडक्ट दोषों की सामान्य बग रिपोर्ट बनती है, जिसमें फ़ेल टेस्ट, commit और artifacts अटैच हों।
पाठ संस्करण
Pipeline failed
|
|-- 1. Did the job fail before any test ran? (dependency install, build, image pull, runner lost)
|      yes -> PIPELINE / INFRASTRUCTURE problem. Owner: platform. Fix, then re-run.
|
|-- 2. Did it fail during setup? (DB not ready, migration error, service unhealthy, expired secret)
|      yes -> ENVIRONMENT problem. Fix the environment; do not touch the tests.
|
|-- 3. Re-run the failed tests once on the SAME commit. Do they pass now?
|      yes -> FLAKY candidate. Log it (test id, commit, error, run link), open or update its ticket,
|             quarantine if it repeats. The change is not proven safe by the green re-run.
|      no  -> deterministic failure, continue.
|
|-- 4. Does the same test fail on main without this change?
|      yes -> PRE-EXISTING break or environment drift. Notify whoever owns main.
|      no  -> caused by this change, continue.
|
`-- 5. Is the product behaviour wrong, or is the test's expectation out of date?
       product wrong       -> PRODUCT DEFECT. Bug report, merge blocked.
       intended new change -> TEST UPDATE in the same change, reviewed like code.

आज़माएँ: AI एरर मैसेज एनालाइज़र

CI/CD में टेस्टर क्या करता है

Pipeline वाली टीमों में टेस्टर scripted जाँचें हाथ से चलाने में कम समय लगाते हैं, और यह तय करने में ज़्यादा कि pipeline क्या जाँचे, उसे भरोसेमंद बनाए रखने में, और उसे टेस्ट करने में जो pipeline नहीं जाँच सकती। नीचे का काम एक व्यावहारिक सारांश है; किस स्तर पर कौन-से टेस्ट ऑटोमेट हों, यह manual बनाम automated testing गाइड में है, और delivery की सेहत दिखाने वाली मेट्रिक्स — DORA मेट्रिक्स में change fail rate और failed deployment recovery time — हर रिलीज़ पर टीम के साथ समीक्षा के लायक हैं।

  • जोखिमों को स्टेज से जोड़ें: कौन-सी जाँच, किस स्टेज पर, किस फ़ेलियर से बचाती है।
  • Regression सूट डिज़ाइन और रिव्यू करें, जिसमें pull requests बनाम nightly runs के लिए चयन नियम शामिल हों।
  • टीम के साथ क्वालिटी गेट परिभाषित करें और दिखावटी गेट पर सवाल उठाएँ।
  • Flaky टेस्ट नीति और failure log के owner बनें; डेवलपर के साथ लाल builds का ट्राइएज करें।
  • Post-deployment smoke जाँचें लिखें और रिलीज़ से पहले rollback मानदंड तय करें।
  • नए फ़ीचर्स के लिए exploratory testing रखें — कोई pipeline उस व्यक्ति की जगह नहीं लेती जो वह खोजता है जिसे ऑटोमेट करने की किसी ने सोची ही नहीं।

आज़माएँ: रिग्रेशन सिनेरियो जनरेटर आज़माएँ: API हेल्थ चेकर

अक्सर पूछे जाने वाले सवाल

Continuous delivery और continuous deployment में क्या फ़र्क़ है?

Continuous delivery में pipeline पास करने वाला हर बदलाव डिप्लॉय के लिए तैयार होता है, पर रिलीज़ कब हो यह कोई व्यक्ति तय करता है। Continuous deployment में हर पास होने वाला बदलाव अपने-आप प्रोडक्शन में डिप्लॉय होता है। इसलिए continuous deployment को ज़्यादा मज़बूत ऑटोमेटेड जाँचें और post-deployment वेरिफ़िकेशन चाहिए, क्योंकि कोई मैनुअल चेकपॉइंट नहीं होता।

हर commit पर कौन-से टेस्ट चलने चाहिए?

तेज़, deterministic जाँचें: static analysis, यूनिट टेस्ट, component टेस्ट और आमतौर पर API टेस्ट का एक केंद्रित उपसमूह। ये मिलकर कुछ मिनटों में ख़त्म हों। लंबे सूट — पूरा end-to-end, लंबे लोड टेस्ट, पूरे security scans — बाद के स्टेज या scheduled runs में रखें।

क्या code coverage threshold अच्छा क्वालिटी गेट है?

अकेले, शायद ही कभी। कच्ची threshold कम assert करने वाले टेस्ट से आसानी से पूरी हो जाती है और जोखिम के बारे में कुछ नहीं बताती। कवरेज ट्रेंड के रूप में और अनटेस्टेड कोड खोजने में उपयोगी है; अगर उस पर गेट लगाएँ तो बदली गई लाइनों की कवरेज चुनें, टेस्ट की समीक्षा के साथ।

क्या pipeline को फ़ेल टेस्ट अपने-आप retry करने चाहिए?

अधिकतम एक बार, और जो टेस्ट सिर्फ़ retry पर पास हो उसे passed नहीं बल्कि flaky रिपोर्ट करना चाहिए। असीमित या चुपचाप retry flakiness और race condition जैसे असली intermittent दोषों दोनों को छिपा देते हैं।

JUnit XML क्या है और यह क्यों मायने रखता है?

यह टेस्ट नतीजों का XML फ़ॉर्मेट है — suites, test cases, failures, skips और अवधि — जिसे ज़्यादातर test runner लिख सकते हैं और ज़्यादातर CI सिस्टम पढ़ सकते हैं। इसके इस्तेमाल से pipeline merge requests में फ़ेलियर दिखा सकती है, हर टेस्ट का इतिहास ट्रैक कर सकती है और पैरलल shards के नतीजे merge कर सकती है।

कैसे जानें कि फ़ेलियर बग है या एनवायरनमेंट की समस्या?

देखें कि कहाँ फ़ेल हुआ और क्या दोहराता है। टेस्ट शुरू होने से पहले, setup में या असंबंधित टेस्ट में फ़ेलियर आमतौर पर एनवायरनमेंट की ओर इशारा करते हैं; जो फ़ेलियर उसी commit पर दोहराए और main पर न हो, साफ़ assertion के साथ, वह आमतौर पर बदलाव की ओर इशारा करता है। इस गाइड का ट्राइएज फ़्लो सवालों को क्रम से लेता है।

क्या CI/CD टीम में टेस्टर अब भी मैनुअल टेस्टिंग करते हैं?

हाँ, पर अलग तरीक़े से। Scripted regression pipeline में चला जाता है; टेस्टर अपना समय नए फ़ीचर्स की exploratory testing, जोखिम विश्लेषण, टेस्ट डिज़ाइन, गेट की परिभाषा और फ़ेलियर ट्राइएज में लगाते हैं।

संदर्भ

  • Continuous Integration (Martin Fowler)martinfowler.com · 2024continuous integration का व्यापक रूप से संदर्भित विवरण: बार-बार integrate करें, build को self-testing और तेज़ रखें, टूटा build तुरंत ठीक करें।
  • ISTQB Certified Tester Foundation Level (CTFL) v4.0ISTQB · 2023सॉफ़्टवेयर टेस्टिंग का फ़ाउंडेशन पाठ्यक्रम: टेस्ट स्तर और प्रकार, टेस्ट डिज़ाइन तकनीकें, टेस्ट प्रबंधन और टूल।
  • GitHub Actions documentationGitHubGitHub Actions में workflows, jobs, runners और artifacts कैसे परिभाषित होते हैं — जहाँ हर push या pull request पर ऑटोमेटेड टेस्ट चलते हैं।
  • GitLab CI/CDGitLabपाइपलाइन, जॉब और आर्टिफ़ैक्ट कैसे परिभाषित होते हैं — जहाँ हर बदलाव पर ऑटोमेटेड रिग्रेशन सूट चलता है।
  • Unit test reports — GitLab CI/CDGitLabJUnit XML नतीजों को pipeline artifact के रूप में प्रकाशित करना ताकि फ़ेल टेस्ट merge request में दिखें और रनों के बीच तुलना हो सके।
  • Pipeline — Jenkins User HandbookJenkins ProjectJenkinsfile में कोड के रूप में परिभाषित Jenkins pipeline: stages, steps, parallel execution और टेस्ट नतीजों का प्रकाशन।
  • Eradicating Non-Determinism in Tests (Martin Fowler)martinfowler.com · 2011flaky टेस्ट सूट का मूल्य क्यों नष्ट करते हैं, उनके आम कारण (isolation, asynchrony, remote services, समय, resource leak) और जवाब के रूप में quarantine।
  • DORA's software delivery performance metricsDORA (Google Cloud)DORA के डिलीवरी मेट्रिक्स — change lead time, deployment frequency, failed deployment recovery time, change fail rate आदि — throughput और instability में समूहित।

अभ्यास

Draft pipeline की समीक्षा करें और उसके लाल runs का ट्राइएज करें

आपका काम

आप छह डेवलपरों की टीम में अकेले टेस्टर हैं, जो एक सिनेमा टिकट बुकिंग प्लेटफ़ॉर्म (काल्पनिक) बना रही है: एक repository में web app और REST API, Node.js और PostgreSQL पर बने, और CI GitHub Actions पर। इस sprint में pipeline को हर pull request का merge gate बनना है। एक डेवलपर ने नीचे का draft लिखा है — यह अभी चलता है पर कोई merge नहीं रोकता — और ऐसा होने से पहले आपसे इसकी समीक्षा माँगी है। Material में पिछले हफ़्ते के पाँच लाल runs भी हैं, जिन्हें अभी तक किसी ने वर्गीकृत नहीं किया।

Draft की गाइड से तुलना करें: स्टेज का क्रम और उनके समय-बजट, flaky टेस्ट की नीति, टेस्ट डेटा और secrets, रिपोर्ट और timeouts, प्रस्तावित coverage gate और nightly schedule। जो merge gate आप प्रस्तावित करेंगे वह लिखें, फिर गाइड के पाँच सवालों वाले फ़्लो से पाँच लाल runs का ट्राइएज करें। काग़ज़ पर काम करें; draft की एक पंक्ति के लिए time zone converter काम आएगा। इसके लिए 30–45 मिनट रखें।

सामग्री
सिनेमा टिकट बुकिंग प्लेटफ़ॉर्म (काल्पनिक) - web app और REST API, एक repository
टीम: 6 डेवलपर, 1 टेस्टर (आप)। Build: Node.js, PostgreSQL। CI: GitHub Actions।
इस sprint का लक्ष्य: pipeline हर pull request का merge gate बने।

Draft pipeline (एक डेवलपर ने लिखी)। यह अभी चलती है, पर अभी कोई merge नहीं रोकती।
Jobs आज जिस क्रम में चलते हैं; J1 की retries वाली पंक्ति इस draft में नई है।
  J1  e2e            Playwright, 310 ब्राउज़र टेस्ट, लगभग 38 मिनट, हर push पर।
                     Draft में नया: retries: 3; job हरा है अगर हर टेस्ट किसी एक
                     attempt में पास हो।
  J2  unit           2,400 यूनिट टेस्ट, लगभग 3 मिनट।
  J3  lint-types     eslint और tsc, लगभग 1 मिनट।
  J4  api            140 API टेस्ट, लगभग 9 मिनट, साझा डेटाबेस "qa-shared" के विरुद्ध,
                     जो हर रात production dump से restore होता है।
  J5  coverage-gate  line coverage 80% से कम हो तो फ़ेल।
  J6  deploy-staging सिर्फ़ main पर। DEPLOY_TOKEN ci/deploy.env से पढ़ा जाता है,
                     जो repository में commit की गई फ़ाइल है। Deploy के बाद कोई जाँच नहीं।
  J7  nightly        पूरा regression और 20 मिनट का load test; cron "0 2 * * *",
                     इरादा 02:00 रियाद समय पर चलाने का। नतीजे एक chat channel में
                     जाते हैं जिसे पढ़ने की ज़िम्मेदारी किसी की नहीं।
  रिपोर्ट            Playwright HTML रिपोर्ट और traces सिर्फ़ job सफल होने पर upload
                     होते हैं। किसी job का timeout नहीं।

पिछले हफ़्ते के लाल runs (R1 से R5)
  R1  PR 741, job unit: "npm ci" 40 सेकंड बाद ENOTFOUND registry.npmjs.org के साथ
      फ़ेल। कोई टेस्ट नहीं चला।
  R2  PR 744, job api: 1 failure, seats.hold
      "returns 409 when the seat is already held": expected 409, received 200।
      उसी commit पर re-run: फिर फ़ेल। वही टेस्ट main पर: पास। PR seat-hold service
      बदलता है।
  R3  PR 745, job e2e: 1 failure, checkout "shows the order summary": summary panel
      के इंतज़ार में timeout। उसी commit पर re-run: पास। इस टेस्ट के लिए इस महीने
      चौथी बार, असंबंधित PRs पर।
  R4  main, job api: setup step "wait for database" 60 सेकंड बाद timeout हो जाता है:
      connect ETIMEDOUT qa-shared:5432। कोई API टेस्ट नहीं चला।
  R5  PR 749, job api: 1 failure, pricing "applies the 10% student discount":
      expected 45.00, received 42.50 (टिकट की क़ीमत 50.00 SAR)। Re-run: फिर फ़ेल।
      Main: पास। PR 749 approved बदलाव TK-311 "student discount becomes 15%"
      लागू करता है।
चरण
  1. Jobs को गाइड के सुझाए क्रम में रखें, हर स्टेज को समय-बजट दें, और बताएँ कि कौन-से jobs pull request को gate करते हैं और कौन-से nightly run में जाते हैं।
  2. Draft को पंक्ति-दर-पंक्ति देखें और गाइड से टकराने वाली हर प्रैक्टिस उसके सुधार के साथ लिखें (retries, टेस्ट डेटा, coverage gate, secret, schedule, रिपोर्ट, timeouts)।
  3. Pull request के merge gate को वस्तुनिष्ठ पास/फ़ेल नियमों की छोटी सूची के रूप में लिखें।
  4. R1 से R5 को पाँच सवालों वाले ट्राइएज फ़्लो से वर्गीकृत करें: कौन-सा सवाल फ़ैसला करता है, वर्गीकरण, owner और अगला कदम।
  5. हफ़्ते का failure log भरें (हर वर्ग के कितने) और एक ऐसी चीज़ बताएँ जो यह pipeline अब भी नहीं जाँच सकती और जिसे आप ख़ुद टेस्ट करेंगे।
मॉडल उत्तर दिखाएँ
मॉडल उत्तर

क्रम और बजट। Draft सबसे धीमा और सबसे ज़्यादा एनवायरनमेंट-निर्भर job पहले और सबसे सस्ती जाँचें आख़िर में चलाती है, इसलिए जो type error tsc एक मिनट में पकड़ लेता है, उसकी ख़बर 38 मिनट के ब्राउज़र टेस्ट के बाद ही मिलती है। इसे उलट दें। Commit stage, हर push और pull request पर, लगभग 5 मिनट का बजट: J3 lint-types (1 मिनट) फिर J2 unit (3 मिनट), साथ में dependency और secret scanning, जो draft में नहीं है। API स्टेज, commit stage पर needs, लगभग 10 मिनट का बजट: J4 एक service container के विरुद्ध (नीचे देखें)। E2E स्टेज, API स्टेज पर needs: हर push पर 310 टेस्ट नहीं। अहम यूज़र यात्राओं का छोटा सेट gating सूट के रूप में रखें — शो खोजना, seat hold करना, भुगतान, टिकट मिलना — रिकॉर्ड की गई अवधि से संतुलित shards में बँटा, fail-fast: false के साथ और shards की रिपोर्ट एक नतीजे में merge, ताकि यह लगभग 10 मिनट में ख़त्म हो; बाक़ी ब्राउज़र टेस्ट nightly run में जाते हैं। J6 deploy-staging सिर्फ़ main पर, E2E के बाद चलता है, और उसके बाद staging पर smoke स्क्रिप्ट और health checks, जो draft में नहीं हैं। अब pull request को पहला जवाब मिनटों में और पूरा जवाब लगभग 25 मिनट में मिलता है, जबकि अभी पहला यूनिट टेस्ट शुरू होने से पहले ही 38 मिनट बीत जाते हैं।

J1 का नया retries: 3, जिसमें किसी भी attempt में पास होने पर job हरा है, गाइड की नीति का उल्टा है: अधिकतम एक ऑटोमैटिक retry, सिर्फ़ retry पर पास हुआ टेस्ट passed नहीं बल्कि flaky रिपोर्ट हो, और पूरे job का चुपचाप retry कभी नहीं। इसके साथ R3 का checkout टेस्ट चारों बार शायद retry पर पास हो जाता और किसी की नज़र में न आता, और seat holds में कोई असली race condition भी — ठीक वही intermittent दोष जो टिकटिंग सिस्टम बर्दाश्त नहीं कर सकता। एक retry रखें, रिपोर्ट में retry पर पास को flaky दिखाएँ, और हर घटना test id, commit, error और run के लिंक के साथ दर्ज करें।

J4 एक साथ दो नियम तोड़ता है। साझा डेटाबेस "qa-shared" production dump से restore होता है: production का व्यक्तिगत डेटा (ग्राहकों के नाम, फ़ोन नंबर, payment references) CI में कभी नहीं आना चाहिए, और साझा डेटाबेस की वजह से पैरलल runs और pull requests साझा rows के ज़रिए आपस में टकराते हैं, जिसे गाइड झूठे फ़ेलियर का बड़ा कारण बताती है। इसकी जगह हर run के लिए PostgreSQL service container: schema migrations से, सिंथेटिक seed बेसलाइन, और हर टेस्ट के रिकॉर्ड unique ids के साथ। Dump की बात अपनी कंपनी में data protection के ज़िम्मेदार व्यक्ति को बताएँ, क्योंकि उसकी कॉपियाँ runners और artifacts में हो सकती हैं। J6 DEPLOY_TOKEN को repository के अंदर ci/deploy.env में रखता है: secrets कभी repository में नहीं रहते, कभी प्रिंट नहीं होते, कभी artifacts में नहीं जाते। इसे staging एनवायरनमेंट तक सीमित प्लेटफ़ॉर्म के secret store में ले जाएँ, और commit हुए token को exposed मानें: उसे revoke करके नया जारी करें, क्योंकि repository की history में पुरानी value अब भी है।

J5, यानी line coverage 80% से कम हो तो build फ़ेल, दिखावटी गेट (vanity gate) है: ऐसे टेस्ट से आसानी से पूरा जो कोड चलाएँ और कुछ assert न करें, और जोखिम के बारे में ख़ामोश। Coverage को ट्रेंड और अनटेस्टेड कोड खोजने के साधन के रूप में रखें; टीम को गेट चाहिए तो बदली गई लाइनों की coverage लें, टेस्ट की समीक्षा के साथ। सिर्फ़ सफलता पर रिपोर्ट upload करना गाइड को उलट देता है: उन्हें if: always() से upload करें, क्योंकि बिना सबूत वाला फ़ेलियर जाँचने में सबसे महँगा है — traces, स्क्रीनशॉट, runner लॉग और HTTP कैप्चर — retention अवधि के साथ और बिना किसी व्यक्तिगत डेटा के। हर job को timeout-minutes चाहिए, ताकि अटका टेस्ट घंटों इंतज़ार करते job की जगह दिखने वाला फ़ेलियर बने। J7 में दो समस्याएँ हैं: GitHub Actions में cron schedules UTC में चलते हैं, जब तक schedule में कोई time zone तय न हो, और draft में कोई तय नहीं है, इसलिए 0 2 * * * 02:00 UTC पर चलता है, जो रियाद में 05:00 है (UTC+3, कोई daylight saving नहीं); 02:00 रियाद समय के लिए 0 23 * * * लिखें, यानी पिछले दिन 23:00 UTC। और scheduled स्टेज को ऐसे owner को रिपोर्ट करना चाहिए जो फ़ेलियर पर कार्रवाई करे: एक नाम तय करें, ड्यूटी rotate करें, और हर nightly फ़ेलियर को किसी के न पढ़े जाने वाले संदेश की जगह ticket या ट्राइएज entry बनाएँ।

Pull request का merge gate, आख़िरी commit पर वस्तुनिष्ठ पास/फ़ेल नियम: (1) lint, type check, यूनिट, API और अहम E2E यात्राएँ हरी, अधिकतम एक ऑटोमैटिक retry के साथ (retry पर पास को flaky के रूप में रिपोर्ट और दर्ज किया जाए) और quarantine सूची के बाहर कोई टेस्ट skip नहीं; (2) dependencies या static analysis में कोई नई critical या high vulnerability नहीं, या दर्ज किया गया समय-सीमित अपवाद; (3) API कॉन्ट्रैक्ट अपरिवर्तित या backward compatible — कोई फ़ील्ड हटाया नहीं, कोई नया अनिवार्य इनपुट नहीं — जब तक नया version न हो; (4) pull request की डेटाबेस migrations API स्टेज के नए डेटाबेस पर साफ़ लागू हों। बदली गई लाइनों की coverage reviewer को दिखती है पर threshold नहीं है। Nightly सूट gate का हिस्सा नहीं: वह सुरक्षा-जाल है और release candidate के लिए हरा होना चाहिए। अपवाद कारण और समाप्ति तारीख़ के साथ दर्ज हों; जिस गेट को नियमित रूप से override किया जाए, वह सबको उसे अनदेखा करना सिखाता है।

R1 — सवाल 1 फ़ैसला करता है: job किसी टेस्ट के चलने से पहले, npm ci में फ़ेल हुआ; ENOTFOUND का मतलब है कि runner registry के host name को resolve (DNS) नहीं कर पाया। Pipeline या इन्फ़्रास्ट्रक्चर की समस्या। Owner: runners और pipeline को सँभालने वाला (platform की भूमिका; इस टीम में शायद वही डेवलपर जिसने draft लिखा)। Name resolution फिर से काम करने पर re-run करें; दोबारा हो तो वही owner runner का नेटवर्क और DNS जाँचे। टेस्ट या प्रोडक्ट में कुछ नहीं बदलना। R4 — सवाल 1 pipeline के अपने steps (install, build, image, runner) के बारे में है, और वे सफल रहे; सवाल 2 फ़ैसला करता है: job setup में, साझा डेटाबेस qa-shared का इंतज़ार करते हुए फ़ेल हुआ, और कोई टेस्ट नहीं चला। एनवायरनमेंट की समस्या: टेस्ट को न छुएँ। Owner: qa-shared चलाने वाला; पता करें कि वह बंद था, restart हो रहा था या अभी restore हो रहा था, उसी job के आख़िरी हरे run से तुलना करें, और जवाब देने लगे तो re-run करें। यह main पर है, इसलिए टीम को बताएँ कि हरे run तक main की स्थिति अज्ञात है। R4, J4 के लिए प्रस्तावित हर run के service container के पक्ष में एक और तर्क है।

R2 — सवाल 1 और 2: नहीं, टेस्ट चले। सवाल 3: उसी commit पर re-run फिर फ़ेल होता है, इसलिए फ़ेलियर deterministic है। सवाल 4: टेस्ट main पर पास है, इसलिए कारण यही बदलाव है। सवाल 5: प्रोडक्ट का व्यवहार ग़लत है। पहले से held seat को 409 से reject होना चाहिए; 200 का मतलब है दो ग्राहक एक ही seat hold कर सकते हैं, और PR ठीक seat-hold service ही बदलता है। प्रोडक्ट दोष; owner: PR 744 का author। बग रिपोर्ट लिखें जिसमें फ़ेल टेस्ट, commit, run का लिंक और 200 लौटाने वाला request और response हो, severity Critical प्रस्तावित क्योंकि इससे double booking होती है; fix और टेस्ट पास होने तक merge रुका रहे। टेस्ट पुराना नहीं है: कोई requirement नहीं बदली।

R3 — सवाल 3: उसी commit पर re-run पास होता है, इसलिए यह flaky उम्मीदवार है, और इतिहास फ़ैसला कर देता है: इस महीने असंबंधित pull requests पर चौथा फ़ेलियर। इसे दर्ज करें (test id, commit, error, run का लिंक), इसका ticket अपडेट करें और quarantine करें: यह चलता और रिपोर्ट करता रहता है, gate करना बंद करता है, और इसे owner (checkout टेस्ट का ज़िम्मेदार) और fix या delete की डेडलाइन मिलती है। हरा re-run यह साबित नहीं करता कि PR 745 सुरक्षित है, और फ़ेल run ने जाँचने के लिए कोई trace नहीं छोड़ा, क्योंकि रिपोर्ट और traces सिर्फ़ सफलता पर upload होते हैं — if: always() का एक और कारण। यह ठीक होने के बाद अगले फ़ेलियर का trace खोलकर देखें कि summary panel देर से आया या टेस्ट ग़लत element का इंतज़ार कर रहा था, और क्या checkout ख़ुद यूज़र के लिए धीमा हो सकता है।

R5 — सवाल 3: deterministic; सवाल 4: main पर पास, इसलिए कारण बदलाव है; सवाल 5: नया व्यवहार इरादतन, approved बदलाव TK-311 है, इसलिए टेस्ट की अपेक्षा पुरानी है, प्रोडक्ट नहीं। हिसाब जाँचें: 50.00 SAR पर 15% छूट 42.50 देती है, और प्रोडक्ट ने यही लौटाया। Owner: PR 749 का author। टेस्ट उसी pull request में अपडेट करें — शीर्षक "applies the 15% student discount", expected 42.50 — और उसकी समीक्षा कोड की तरह हो; वह commit आने तक PR merge के लायक नहीं। हफ़्ते का failure log: 1 इन्फ़्रास्ट्रक्चर (R1), 1 एनवायरनमेंट (R4), 1 flaky (R3), 1 प्रोडक्ट दोष (R2), 1 टेस्ट अपडेट (R5) — एक महीने में यह दिखा देता है कि pipeline मुख्यतः दोषों, flakiness या एनवायरनमेंट से पीड़ित है। जो pipeline अब भी नहीं जाँच सकती: यूज़र इंटरफ़ेस में नई छूट और seat map जैसा ग्राहक देखता है — नए फ़ीचर्स की exploratory testing आपके पास रहती है।

इस topic में आपकी प्रगति

QA रोडमैप का हिस्सा

इस गाइड में बताए गए टूल्स

एक साथ कई API health endpoint जाँचें और स्टेटस, latency तथा pass/fail सारांश पाएँ।

API टेस्टिंग

OpenAPI / Swagger स्पेसिफ़िकेशन से संरचित टेस्ट-केस मैट्रिक्स (positive, negative, auth, boundary) बनाएँ।

ऑटोमेशन

बदलाव के विवरण और प्रभावित तथा संबंधित मॉड्यूल की सूची से रिग्रेशन सिनेरियो जनरेट करें।

टेस्ट डिज़ाइन

YAML को एकसमान इंडेंटेशन और quoting के साथ फ़ॉर्मेट और वैलिडेट करें।

फ़ॉर्मेटिंग

Mutqan AI से stack trace और एरर मैसेज समझें, संभावित मूल कारण पहचानें और डिबगिंग के अगले क़दम जानें।

बग विश्लेषण AI

सिंथेटिक टेस्ट डेटा की एक ही जगह पर फ़ैक्टरी: users, customers, companies, पते, संख्याएँ, तारीख़ें और स्ट्रिंग — JSON, CSV, SQL या XML में।

टेस्ट डेटा

Mutqan Soft कैसे मदद कर सकता है

और गाइड

और गाइड
टेस्ट डिज़ाइन

स्मोक, सैनिटी और रिग्रेशन टेस्टिंग में अंतर

Smoke, sanity और regression टेस्टिंग की तुलना: दायरा, समय, गहराई और ऑटोमेशन, "sanity" शब्द अस्पष्ट क्यों है, और regression टेस्ट कैसे चुनें।

11 मिनट पढ़ने का समय
ऑटोमेशन

डिप्लॉयमेंट वेरिफ़िकेशन टेस्टिंग

डिप्लॉयमेंट कैसे वेरिफ़ाई करें: पहले से लिखा प्लान, post-deploy smoke टेस्ट, synthetic checks, canary रिलीज़, feature flags, सिग्नल और rollback।

13 मिनट पढ़ने का समय
टेस्ट डिज़ाइन

मैनुअल बनाम ऑटोमेटेड टेस्टिंग

मैनुअल और ऑटोमेटेड टेस्टिंग की लागत, गति, हर एक क्या पकड़ता और छोड़ता है, और रखरखाव पर तुलना — साथ में यह तय करने का व्यावहारिक नियम कि क्या ऑटोमेट करें।

7 मिनट पढ़ने का समय
ऑटोमेशन

Flaky टेस्ट

ऑटोमेटेड UI टेस्ट flaky क्यों होते हैं — timing, shared state, डेटा, environment, third parties — उनकी जाँच कैसे करें, और सही retry व quarantine नीति।

12 मिनट पढ़ने का समय
टेस्ट डिज़ाइन

एंड-टू-एंड प्रोडक्ट क्वालिटी एश्योरेंस

एंड-टू-एंड QA में क्या आता है — आवश्यकता समीक्षा, टेस्ट डिज़ाइन, फ़ंक्शनल, API, परफ़ॉर्मेंस और सुरक्षा टेस्टिंग, रिलीज़ गेट और मेट्रिक्स — और इसे कैसे चलाएँ।

11 मिनट पढ़ने का समय
टेस्ट डिज़ाइन

सॉफ़्टवेयर टेस्टिंग लाइफ़ साइकल (STLC)

STLC चरण-दर-चरण — analysis, planning, design, environment, execution और closure — ISTQB test process से मैप, हर चरण के entry और exit criteria के साथ।

15 मिनट पढ़ने का समय