टेस्ट कवरेज

Test coverage बताता है कि आपके tests ने चीज़ों के एक तय set को किस हद तक exercise किया। ISTQB glossary इन चीज़ों को coverage items कहती है और coverage को percentage में व्यक्त करती है। उदाहरण: एक user story में 8 acceptance criteria हैं और उनमें से 6 को current build पर चले किसी test ने check किया है, तो acceptance-criteria coverage 8 में से 6, यानी 75% है।

पहला सवाल हमेशा यह होता है: "coverage किसका?" Requirements, risks और code अलग-अलग तरीके से cover और नापे जाते हैं, आम तौर पर अलग-अलग लोगों द्वारा, और हर view के अपने blind spots हैं। Coverage दिखाता है कि list का कितना हिस्सा exercise हुआ; यह कभी साबित नहीं करता कि software में defects नहीं हैं।

यह क्यों ज़रूरी है

Coverage के बिना "हमने feature टेस्ट कर लिया" जाँचा नहीं जा सकता। कोई नहीं बता सकता कि किन acceptance criteria का कोई test नहीं है, कौन-से high risks कभी आज़माए ही नहीं गए, या कौन-सा code किसी test ने चलाया ही नहीं। यही gaps हैं जहाँ से defects production तक पहुँचते हैं।

Tester के लिए coverage मेहनत को ऐसे statement में बदलता है जिसे दूसरे जाँच सकें और जिस पर काम कर सकें: "सभी 14 acceptance criteria के tests pass हैं; 2 medium risks टेस्ट नहीं हुए क्योंकि payment sandbox बंद था"। यही exit criteria को नापने लायक बनाता है और team को एक बड़े number पर झूठे भरोसे से बचाता है।

Coverage किसका? Requirements, risks और code

Coverage number का तब तक कोई मतलब नहीं जब तक आप यह न बताएँ कि गिना क्या गया। तीन तरह की coverage तीन अलग सवालों का जवाब देती हैं, और ज़्यादातर teams को तीनों चाहिए।

  • Requirements coverage: किन requirements या acceptance criteria के tests हैं, और किनके passing tests हैं। यहाँ coverage items test basis के criteria हैं, जिन्हें traceability से गिना जाता है: हर test उस criterion से linked हो जिसे वह check करता है।
  • Risk coverage: पहचाने गए किन product risks के tests चले, और किनके tests pass हुए, risk level के हिसाब से report किया हुआ। "दोनों high risks टेस्ट हुए और pass हैं, 5 में से 2 medium risks अभी टेस्ट नहीं हुए" release decision में किसी अकेले percentage से बेहतर मदद करता है।
  • Code coverage: tests के दौरान code के कौन-से हिस्से चले, जिसे एक tool नापता है। Statement coverage executable statements गिनता है; branch coverage branches गिनता है, यानी code में control के transfers, जिन्हें coverage tools decisions के outcomes के रूप में दिखाते हैं, जैसे किसी if के दोनों रास्ते। Branch coverage ज़्यादा मज़बूत है: 100% branch coverage में 100% statement coverage शामिल है, उल्टा नहीं।

Coverage items और उन्हें कैसे नापें

ISTQB Foundation syllabus v4.0 coverage को coverage items के ज़रिए नापता है: गिनी जा सकने वाली चीज़ें, जो किसी test technique को लागू करके test conditions से निकाली जाती हैं, जैसा test design activity वाले पाठ में देखा। Test design उन्हें पहचानता है; execution उन्हें exercise करता है। Formula कभी नहीं बदलता: coverage = items exercised ÷ items identified × 100%।

Percentage के साथ counts भी बताएँ ("12 में से 9 criteria") और वह build जिस पर यह लागू है। ISTQB की definition में कोई item covered माना जाता है जैसे ही कोई test उसे exercise कर ले, result चाहे जो हो, इसलिए requirements और risks के लिए दो numbers दें: वे items जिनका test उस build पर चला, और वे items जिनके tests pass हुए। सिर्फ़ दूसरा number बताता है कि item काम करता है: fail हुआ test अपने item को खुला छोड़ता है, और blocked या न चला test अभी कुछ exercise नहीं करता। Requirements और risk coverage test management tool या traceability matrix के links से आती है; code coverage एक tool से आती है जो tests चलते समय code को instrument करता है (उसमें counters जोड़ता है जो दर्ज करते हैं कि क्या चला), आम तौर पर CI pipeline में। एक view या technique से दूसरे तक जो बदलता है, वह item है:

  • Requirements: acceptance criteria या अलग-अलग requirements।
  • Risks: पहचाने गए risks, risk level के हिसाब से grouped।
  • Equivalence partitioning: partitions। Boundary value analysis: boundary values।
  • Decision tables: वे columns जिनमें conditions के संभव combinations हैं।
  • State transitions: states, valid transitions या सभी transitions।
  • Code: executable statements, या branches (coverage tools में हर decision का हर outcome)।

आज़माएँ: Requirements → टेस्ट केस आज़माएँ: स्टेट ट्रांज़िशन जनरेटर

Worked example: एक feature के चार coverage numbers

Checkout का एक feature discount code लागू करता है। Acceptance criteria: AC1, valid code total को अपने percentage से घटाता है; AC2, expired code एक साफ़ message के साथ reject होता है; AC3, codes सिर्फ़ 100.00 SAR या उससे ज़्यादा के totals पर लागू होते हैं; AC4, हर order में एक code। Product risks: R1 (high) एक order पर code दो बार लग जाना; R2 (high) expired code स्वीकार हो जाना; R3 (medium) 100.00 की threshold गलत तरफ़ लागू होना।

Developer ने discount function के लिए एक unit test लिखा; tester ने build 57 पर तीन system tests चलाए, जिनमें TC-03 ने 99.99 और 100.00 के totals check किए। Code और reports नीचे हैं। हर number क्या कहता है:

एक discount feature, चार coverage numbers: unit tests 100% statement लेकिन 50% branch coverage तक पहुँचते हैं, जबकि 4 में से सिर्फ़ 2 acceptance criteria और 3 में से 1 risk का passing test है।
  • passing test से covered
  • अकेला test fail
  • covered नहीं, कोई test नहीं
  • Statement coverage (unit tests)4 में से 4 statements, 100%
    • 4 passing test से covered
    • 0 अकेला test fail
    • 0 covered नहीं, कोई test नहीं
  • Branch coverage (unit tests)2 में से 1 branch, 50%
    • 1 passing test से covered
    • 0 अकेला test fail
    • 1 covered नहीं, कोई test नहीं
  • Acceptance criteria (system tests)4 में से 2 का passing test, 50%
    • 2 passing test से covered
    • 1 अकेला test fail
    • 1 covered नहीं, कोई test नहीं
  • Product risks (system tests)3 में से 1 का passing test, 2 high में से 0
    • 1 passing test से covered
    • 1 अकेला test fail
    • 1 covered नहीं, कोई test नहीं

Code के लिए item तब covered गिना जाता है जब वह passing unit test के दौरान कम से कम एक बार चला; criteria और risks के लिए तब, जब उनसे linked system test build 57 पर pass हुआ। Fail हुए test ने अपना item exercise तो किया, पर उसे खुला छोड़ता है।

  • Statement coverage 100% (4 में से 4): unit test में applyDiscount का हर statement चला, फिर भी किसी unit test ने 100.00 से कम का total नहीं आज़माया।
  • Branch coverage 50% (2 में से 1): total >= 100 का false outcome कभी नहीं चला। 99.99 total वाला एक unit test इसे cover कर देगा।
  • Acceptance criteria: 4 में से 3 का test है (75%), लेकिन 4 में से सिर्फ़ 2 का passing test है (50%)। TC-02 fail हुआ और AC4 का कोई test नहीं है।
  • Risks: 3 में से 2 का test है, लेकिन 3 में से सिर्फ़ 1 का passing test है, और किसी भी high risk का नहीं: R1 का कोई test नहीं और R2 का test fail हुआ। Release decision को यही number चाहिए।
  • applyDiscount में "हर order में एक code" को handle करने वाला कुछ नहीं है। अगर AC4 कभी implement ही नहीं हुआ, तो कोई code coverage report इसे नहीं दिखा सकती: tool सिर्फ़ मौजूद code नापता है।
// discount.ts
export function applyDiscount(total: number, percent: number): number {
  let result = total;
  if (total >= 100) {
    result = total - (total * percent) / 100;
  }
  return result;
}

// discount.test.ts (Jest): the only unit test
import { applyDiscount } from './discount';

test('10% off an order of 150', () => {
  expect(applyDiscount(150, 10)).toBe(135);
});

Code coverage (unit tests)   Statements   Branches
discount.ts                  4/4  100%    1/2  50%

Traceability, system tests on build 57
Criterion   Test     Result     Risk
AC1         TC-01    passed     -
AC2         TC-02    failed     R2 (high)
AC3         TC-03    passed     R3 (medium)
AC4         -        no test    R1 (high)

आज़माएँ: Requirements → टेस्ट केस आज़माएँ: रिस्क-बेस्ड टेस्ट जनरेटर

100% coverage का मतलब bug-free क्यों नहीं

Coverage बताता है कि list का कितना हिस्सा exercise हुआ, यह नहीं कि list पूरी थी, tests ने सही चीज़ें check कीं, या software सही है। Testing के सात principles में से दो यहाँ लागू होते हैं: testing defects की मौजूदगी दिखाती है, उनकी गैरमौजूदगी नहीं, और exhaustive testing असंभव है।

  • Denominator में सिर्फ़ वही है जो आपने पहचाना। छूटी हुई requirement या list से बाहर का risk कभी percentage में नहीं दिखता, इसलिए अधूरी list की 100% coverage भी अधूरी ही है।
  • Execute करना check करना नहीं है। बिना assertion (result की कोई जाँच नहीं) वाला test जो applyDiscount(150, 10) call करता है, वही 100% statement coverage देता है जो result 135 check करने वाला test देता है।
  • Data मायने रखता है। applyDiscount(150, 110) negative total लौटाता है, और पूरी branch coverage भी इसे नहीं पकड़ती। Syllabus का अपना उदाहरण ऐसा division है जो सिर्फ़ तब fail होता है जब divisor zero हो।
  • Code coverage omissions नहीं देख सकता: जो code लिखा ही नहीं गया, उसमें छूटने लायक कोई statement नहीं होता।
  • Target एक खेल बन सकता है: लोग ऐसे tests जोड़ते हैं जो code चलाते हैं पर कुछ check नहीं करते। Assertions का review, या mutation testing (code में छोटे जान-बूझकर किए गए बदलाव जिन्हें अच्छा test suite पकड़ना ही चाहिए), यह जानने में मदद करते हैं कि covered code सच में check हो रहा है या नहीं।

आज़माएँ: AI टेस्ट कवरेज एनालाइज़र

आम गलतियाँ

  • "Coverage 85% है" report करना, बिना यह बताए कि किसका, किस build पर और कितने items में से।
  • किसी criterion या risk को सिर्फ़ इसलिए done report करना कि उसका test मौजूद है, जबकि वह test fail हुआ, blocked रहा या current build पर चला ही नहीं।
  • 100% code coverage को सही code का सबूत मानना, या कुछ check न करने वाले tests से percentage के पीछे भागना।
  • भूल जाना कि छूटी हुई requirements और list से बाहर के risks denominator में नहीं हैं, इसलिए कोई percentage उन्हें नहीं दिखा सकता।
  • किसी high-risk item के एक सतही test को पूरी coverage मान लेना: coverage items गिनता है, यह नहीं कि हर item कितनी गहराई से टेस्ट हुआ।

QA का नज़रिया

Coverage plan किया जाता है, आख़िर में खोजा नहीं जाता। Test planning में test lead और product owner के साथ तय करें कि exit criteria में कौन-से coverage criteria होंगे, जैसे: हर acceptance criterion का passing test हो, हर high risk के passing tests हों, और changed code के लिए developers का तय किया branch coverage floor पूरा हो। कई teams पहली शर्त Definition of Done में भी रखती हैं। Test design में हर test case को उसके criterion और risk से link करें, ताकि coverage अंदाज़े से नहीं, traceability से निकले।

Reports में counts, build और gaps के नाम दें, risk level के हिसाब से grouped। Developers से एक total की जगह changed code की uncovered branches माँगें, और product owner से पूछें कि list में कुछ छूटा तो नहीं, क्योंकि यह gap कोई percentage नहीं दिखाता। Test completion पर लिखें कि क्या जान-बूझकर cover नहीं किया गया और क्यों, ताकि release decision residual risk को सामने रखकर लिया जाए।

अभ्यास

Password reset story की coverage निकालें और report करें

आपका काम

नीचे एक user story, तीन risks, build 112 पर system tests के results और एक unit test coverage report है। Requirements और risk coverage निकालें, तय करें कि code coverage के numbers क्या बताते हैं और क्या नहीं, फिर test progress report का coverage वाला हिस्सा product owner के लिए तीन वाक्यों में लिखें।

सामग्री
Story: e-mail link से password reset

AC1  "Forgot password" registered e-mail address पर reset link भेजता है।
AC2  Unregistered address को वही neutral message मिलता है जो registered को।
AC3  Link भेजे जाने के 30 मिनट बाद expire हो जाता है।
AC4  Link सिर्फ़ एक बार इस्तेमाल हो सकता है।
AC5  नया password 12 से 64 characters लंबा होना चाहिए।

Risks
R1  AC3, AC4  high: reset link दोबारा इस्तेमाल हो सकता है या कभी expire नहीं होता
R2  AC2       high: message बता देता है कि किन addresses के accounts हैं
R3  AC5       medium: password rule लागू नहीं होता

System tests, build 112
TC-01  AC1  passed
TC-02  AC1  passed
TC-03  AC2  passed
TC-04  AC3  failed
TC-05  AC5  passed

Unit tests, reset-service.ts
statement coverage 96%
branch coverage    71%
चरण
  1. हर criterion को उसके tests और उनके results से map करें।
  2. Criteria coverage दो बार निकालें: चले हुए किसी भी test के साथ, और passing test के साथ।
  3. Risk coverage निकालें, high और medium risks के लिए अलग-अलग।
  4. Unit test के numbers समझाएँ, फिर statement और अपने अगले कदम लिखें।
मॉडल उत्तर दिखाएँ
मॉडल उत्तर

Criteria: AC1 (TC-01 और TC-02 pass), AC2 (TC-03 pass), AC3 (TC-04 fail), AC4 (कोई test नहीं), AC5 (TC-05 pass)। Test वाले: 5 में से 4 (80%)। Passing test वाले: 5 में से 3 (60%), और release के लिए यही number मायने रखता है।

Risks: R2 (high) और R3 (medium) के passing tests हैं। R1 (high) के नहीं: उसका expiry test fail हुआ और single use का कोई test नहीं। यानी 3 में से 2 risks, 1 में से 1 medium risk, लेकिन 2 में से सिर्फ़ 1 high risk।

Code coverage: unit tests के दौरान ज़्यादातर code चला, लेकिन इससे expiry logic सही नहीं हो जाता (TC-04 फिर भी fail हुआ), और यह भी नहीं दिखता कि single-use logic मौजूद है या नहीं। पूछें कि कौन-सी branches uncovered हैं और क्या वे expiry या single use की हैं।

Statement: "Password reset, build 112: 5 में से 3 acceptance criteria का passing test है (60%)। High risk R1 खुला है: expiry test TC-04 fail हुआ और single use (AC4) अभी टेस्ट नहीं हुआ; R2 और R3 के passing tests हैं। Unit tests 96% statement और 71% branch coverage तक पहुँचते हैं; uncovered branches का अभी review नहीं हुआ है।"

अगले कदम: AC4 टेस्ट करें; TC-04 की failure को defect के रूप में report करें और fix के बाद दोबारा टेस्ट करें (confirmation testing); AC5 के लिए हर limit के दोनों तरफ़ tests जोड़ें (11, 12, 64 और 65 characters), क्योंकि एक passing test criterion को गिनती में cover करता है, गहराई में नहीं।

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

क्या test coverage और code coverage एक ही हैं?

नहीं। Test coverage general idea है: पहचाने गए coverage items का वह हिस्सा जिसे tests ने exercise किया। Code coverage उसका एक प्रकार है, जिसमें items statements या branches होते हैं। Requirements coverage, risk coverage और किसी test technique की coverage (partitions, boundary values, transitions) इसके दूसरे प्रकार हैं।

Code coverage का अच्छा percentage कितना है?

कोई भी number quality साबित नहीं करता, और ISTQB syllabus कोई number तय नहीं करता। Teams safety net के रूप में एक target तय करती हैं, जो अक्सर critical या changed code के लिए ज़्यादा सख़्त होता है, और फिर सिर्फ़ total देखने की बजाय यह पढ़ती हैं कि क्या uncovered है। कमज़ोर assertions वाला ऊँचा number मज़बूत checks वाले कम number से कम क़ीमती है।

Code coverage कौन नापता है, developers या testers?

आम तौर पर CI pipeline में एक coverage tool इसे automated tests चलते समय नापता है, ज़्यादातर developers के लिखे unit tests के दौरान। Testers report पढ़ते हैं, risky areas के uncovered हिस्सों के बारे में पूछते हैं, और इसे requirements और risk coverage के साथ जोड़ते हैं, जो आम तौर पर testers के पास होती है।

अगर हम coverage target का 100% पा लें, तो क्या testing रोक दें?

इसका मतलब है कि एक exit criterion पूरा हुआ, यह नहीं कि software में defects नहीं हैं। बाकी exit criteria, residual risk और जान-बूझकर छोड़ी गई हर चीज़ देखें। Requirements की पूरी coverage भी यह साबित नहीं करती कि product अपने users की ज़रूरतें पूरी करता है: इसे absence-of-defects fallacy कहते हैं।

संदर्भ

  • ISTQB Certified Tester Foundation Level (CTFL) v4.0ISTQB · 2023सॉफ़्टवेयर टेस्टिंग का फ़ाउंडेशन पाठ्यक्रम: टेस्ट स्तर और प्रकार, टेस्ट डिज़ाइन तकनीकें, टेस्ट प्रबंधन और टूल।
  • ISTQB GlossaryISTQBटेस्टिंग शब्दों की मानक परिभाषाएँ — टेस्ट केस, रिग्रेशन टेस्टिंग, सेवेरिटी, प्रायोरिटी, बाउंड्री वैल्यू एनालिसिस आदि।
  • ISO/IEC/IEEE 29119-1:2022 — Software and systems engineering — Software testing — Part 1: General conceptsISO/IEC/IEEE · 2022सॉफ़्टवेयर टेस्टिंग का अंतरराष्ट्रीय मानक: अवधारणाएँ, प्रक्रियाएँ, दस्तावेज़ीकरण और तकनीकें।

Mutqan tools से अभ्यास करें

क्रमांकित आवश्यकताओं की सूची को requirement-to-test मैट्रिक्स के साथ ट्रेस करने योग्य टेस्ट केस में बदलें।

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

फ़ीचर को संभावना और प्रभाव के आधार पर स्कोर दें, फिर प्राथमिकता वाला risk-based टेस्ट प्लान जनरेट करें।

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

states और events परिभाषित करें, फिर transition तालिका, वैध/अमान्य transition टेस्ट और 0-switch/1-switch coverage जनरेट करें।

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

Mutqan AI से requirements या किसी user story की तुलना मौजूदा टेस्ट केस से करके अनटेस्टेड हिस्से खोजें।

टेस्ट ऑप्टिमाइज़ेशन AI

और गहराई से

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

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