स्टैटिक टेस्टिंग

स्टैटिक टेस्टिंग का मतलब है वर्क प्रोडक्ट — requirements, user stories, डिज़ाइन, API contracts, कोड, कॉन्फ़िगरेशन, test plans और test cases — का लोगों और टूल्स द्वारा मूल्यांकन, टेस्ट हो रहे सॉफ़्टवेयर को चलाए बिना। यह परिभाषा सही है, पर इस प्रैक्टिस को छोटा करके दिखाती है। स्टैटिक टेस्टिंग की असली क़ीमत "न चलाने" में नहीं, बल्कि उसमें है जो इससे संभव होता है: कोड लिखे जाने से पहले ही requirement की जाँच, लक्षण के बजाय सीधे डिफ़ेक्ट तक पहुँचना, और consistency व maintainability जैसी क्वालिटी को परखना जिन्हें कोई चलता हुआ टेस्ट नहीं मापता।

यह पेज इस प्रैक्टिस का नक्शा है: static बनाम dynamic टेस्टिंग, review और static analysis क्या-क्या पकड़ते हैं, review के मुख्य प्रकार, टूल्स की श्रेणियाँ और उनकी अंधी जगहें, और CI pipeline में static checks की जगह। Review के प्रकारों और requirements review के लिए इस विषय में अलग विस्तृत पेज हैं।

स्टैटिक टेस्टिंग क्या है — "कोड न चलाने" से आगे

ISTQB Foundation Level सिलेबस (CTFL v4.0) का तीसरा अध्याय पूरी तरह स्टैटिक टेस्टिंग पर है और इसे दो परिवारों में बाँटता है: review, जिसमें लोग किसी वर्क प्रोडक्ट की जाँच करते हैं, और static analysis, जिसमें टूल उसे औपचारिक नियमों के आधार पर परखते हैं। दोनों के लक्ष्य एक जैसे हैं: वर्क प्रोडक्ट में सीधे डिफ़ेक्ट ढूँढना, उसकी क्वालिटी का आकलन करना और उस पर भरोसा बनाना, और उसे लिखने वालों तथा उस पर आधारित बिल्ड, टेस्ट और ऑपरेशन करने वालों के बीच साझा समझ बनाना।

सबसे अहम फ़र्क़ defect और failure का है। Defect किसी वर्क प्रोडक्ट की खामी है — विरोधाभासी वाक्य, हैंडल न की गई null वैल्यू, contract में गायब error response। Failure वह है जो चलता हुआ सिस्टम किसी defect की वजह से गलत करता है। Dynamic टेस्टिंग failures देखती है, फिर कोई debugging करके पीछे defect तक पहुँचता है। स्टैटिक टेस्टिंग सीधे defect पर पहुँचती है, अक्सर उसकी सटीक जगह के साथ। इसीलिए static finding को ठीक करना आम तौर पर सस्ता होता है: न कुछ रिप्रोड्यूस करना, न डायग्नोज़ करना, और अक्सर अभी दोबारा लिखने को कोड भी नहीं।

जो कुछ इंसान पढ़ और समझ सकता है उसका review हो सकता है, वे डॉक्यूमेंट भी जो कभी चलेंगे नहीं; और जिसकी औपचारिक संरचना है — कोड, schema, मॉडल, कॉन्फ़िगरेशन फ़ाइल — उसका टूल से analysis भी हो सकता है।

  • यह प्रूफ़रीडिंग नहीं है। स्पेलिंग सुधार एक साइड-इफ़ेक्ट है; असली निशाना वे defects हैं जो आगे चलकर गलत व्यवहार, rework या जोखिम बनते।
  • यह dynamic टेस्टिंग का विकल्प नहीं है। यह नहीं दिखा सकती कि सिस्टम तेज़ है, services आपस में जुड़ती हैं, या यूज़र अपना काम पूरा कर पाता है।
  • यह सिर्फ़ डेवलपर की गतिविधि नहीं है। टेस्टर requirements और टेस्ट डॉक्यूमेंट review करते हैं, product owner और डिज़ाइनर एक-दूसरे का काम review करते हैं, और operations इंजीनियर deployment कॉन्फ़िगरेशन review करते हैं।

Static टेस्टिंग बनाम Dynamic टेस्टिंग

दोनों एक-दूसरे के पूरक हैं, विकल्प नहीं। नीचे के अंतर ISTQB सिलेबस की तुलना पर आधारित हैं; ज़्यादातर टीमों को हर test level पर दोनों की ज़रूरत होती है।

Static टेस्टिंग सीधे defect पर पहुँचती है; dynamic टेस्टिंग पहले failure देखती है और debugging से defect तक लौटती है। दोनों एक-दूसरे के पूरक हैं।

Static टेस्टिंग

  1. 1किसी वर्क प्रोडक्ट में defectRequirement, डिज़ाइन, API contract, कोड, कॉन्फ़िगरेशन, टेस्ट डॉक्यूमेंट
  2. 2लोग review करते हैं या टूल analysis करते हैंReview: जो कुछ पढ़ा और समझा जा सके। Static analysis: जिसकी औपचारिक संरचना हो
  3. 3Defect सीधे मिलता हैअक्सर सटीक जगह के साथ; न कुछ रिप्रोड्यूस करना, न डायग्नोज़ करना
कब शुरू हो सकती है:
जैसे ही कोई वर्क प्रोडक्ट बने, कोड से पहले भी
Finding की लागत:
आम तौर पर कम: जगह पता है, defect के ऊपर कम कुछ बना है

Dynamic टेस्टिंग

  1. 1टेस्ट सॉफ़्टवेयर चलाते हैं
  2. 2Failure दिखता हैचलता हुआ सिस्टम किसी defect की वजह से जो गलत करता है
  3. 3DebuggingReproduction, diagnosis, पीछे की ओर trace
  4. 4Defect तक पहुँच
कब शुरू हो सकती है:
जब कुछ चलने लायक मौजूद हो
Finding की लागत:
ज़्यादा: reproduction, diagnosis और defect पर बने काम का rework शामिल
  • क्या पकड़ती है — static: सीधे वर्क प्रोडक्ट में defects। Dynamic: failures, जिनसे debugging करके defect तक पहुँचा जाता है।
  • कब शुरू हो सकती है — static: जैसे ही कोई वर्क प्रोडक्ट बने, कोड से पहले भी। Dynamic: जब कुछ चलने लायक मौजूद हो।
  • किसकी जाँच कर सकती है — static: चलने लायक और न चलने लायक दोनों वर्क प्रोडक्ट (requirements, डिज़ाइन, test plans, contracts)। Dynamic: सिर्फ़ चलता हुआ सॉफ़्टवेयर।
  • क्वालिटी विशेषताएँ — static: वे जो execution पर निर्भर नहीं, जैसे maintainability, consistency और standards का पालन। Dynamic: वे जो निर्भर हैं, जैसे performance efficiency, लोड में reliability और असली integration व्यवहार।
  • आसानी से पकड़े जाने वाले defects — static: अस्पष्ट या विरोधाभासी requirements, unreachable या duplicate कोड, undeclared या uninitialised variables, interface parameters का बेमेल होना, coding standards से विचलन, कुछ security कमज़ोरियाँ, ऐसे acceptance criteria जिनका कोई टेस्ट नहीं। Dynamic: खास डेटा पर गलत आउटपुट, timing और concurrency failures, environment और कॉन्फ़िगरेशन की समस्याएँ, usability समस्याएँ।
  • Finding की लागत — static: आम तौर पर कम, क्योंकि जगह पता है और defect के ऊपर कम कुछ बना है। Dynamic: ज़्यादा, क्योंकि इसमें reproduction, diagnosis और defect पर बने काम का rework शामिल है।

किसकी स्टैटिक टेस्टिंग हो सकती है, और आम तौर पर क्या मिलता है

उदाहरण के लिए, एक user story कहती है "500 SAR से ऊपर के ऑर्डर पर डिस्काउंट लागू होगा"। Reviewer पूछता है कि ठीक 500.00 SAR का ऑर्डर योग्य है या नहीं — एक वाक्य में, कोड से पहले, एक static finding। अगर कोई नहीं पूछता, तो डेवलपर "से बड़ा" या "से बड़ा या बराबर" चुन लेता है, और हफ़्तों बाद कोई boundary value टेस्ट दिखा सकता है कि यह चुनाव finance की अपेक्षा से अलग है। वही defect, दो जगह मिला, बहुत अलग लागत पर। नीचे की सूची बताती है कि हर तरह का वर्क प्रोडक्ट आम तौर पर क्या छिपाता है।

  • Requirements और user stories — अस्पष्टता, विरोधाभास, छूटी बातें (error paths, permissions, limits), टेस्ट न हो सकने वाले कथन, दोहराए गए या टकराते business rules।
  • Architecture और डिज़ाइन — कमज़ोर modularisation, single point of failure, अक्षम data structures या database डिज़ाइन, components के बीच error handling का अभाव, डेटा की ownership अस्पष्ट।
  • API contracts और schemas — असंगत naming, गायब error responses, ऐसे types जो अपने examples से मेल नहीं खाते, versions के बीच breaking changes, बिना constraints के fields।
  • Source code — undefined या unused variables, unreachable या duplicate कोड, ज़रूरत से ज़्यादा complexity, असुरक्षित calls, यूज़र इनपुट से बनी query strings, coding standards का उल्लंघन।
  • कॉन्फ़िगरेशन और infrastructure-as-code — plain text में commit किए secrets, असुरक्षित defaults, किसी environment के लिए गलत वैल्यू, invalid YAML, कभी न चलने वाला cron schedule।
  • टेस्ट डॉक्यूमेंट — बिना exit criteria का test plan, धुँधले expected result वाले test cases, बिना किसी टेस्ट के acceptance criteria, duplicate या पुराने cases।

आज़माएँ: AI Requirement अस्पष्टता डिटेक्टर आज़माएँ: AI API कॉन्ट्रैक्ट रिस्क एनालाइज़र

डिफ़ेक्ट की जल्दी पहचान और डिफ़ेक्ट की रोकथाम

Defects आम तौर पर जल्दी डाले जाते हैं और देर से पकड़े जाते हैं। Requirement की गलतफ़हमी डिज़ाइन का फ़ैसला बनती है, फिर कोड, फिर उसी गलतफ़हमी पर लिखे टेस्ट — और जब आख़िरकार समस्या दिखती है तो उस पर बनी हर परत पर rework करना पड़ता है। स्टैटिक टेस्टिंग यह feedback loop छोटा करती है: requirement पर उसी दिन सवाल होता है जिस दिन वह लिखी जाती है, डिज़ाइन पर कोडिंग से पहले, बदलाव पर merge से पहले। ISTQB सिलेबस stakeholders से जल्दी और बार-बार मिलने वाले feedback को review प्रक्रिया के साथ बताता है और कहता है कि इससे requirements को लेकर गलतफ़हमियाँ रोकी जा सकती हैं।

जल्दी पहचान और रोकथाम (defect prevention) जुड़े हैं पर एक नहीं हैं। पहचान इस defect को जल्दी ढूँढती है; रोकथाम अगले defect को बनने से रोकती है। Review रोकथाम में दो तरह से योगदान देते हैं। लोग सीखते हैं: जिस डेवलपर के बदलावों पर बार-बार "input validate नहीं हुआ" टिप्पणी आती है, वह input validate करने लगता है। और findings प्रक्रिया में checklist items, templates, coding rules और lint rules बनकर लौटती हैं। जो defect type कई reviews में दिखे, वह automated check का उम्मीदवार है, ताकि किसी इंसान को उसे फिर न ढूँढना पड़े।

  • Review findings को type के हिसाब से वर्गीकृत करें — अस्पष्टता, missing error handling, naming, security, test gap। गिनती बताती है कि defects कहाँ से आते हैं।
  • सिर्फ़ डॉक्यूमेंट नहीं, template ठीक करें: "error cases" शीर्षक वाला user-story template छूटी बातों की एक पूरी श्रेणी हटा देता है।
  • Story refinement में टेस्टरों को शामिल करें। "मैं इसे कैसे टेस्ट करूँगा?" पूछना अपने आप में एक static test है।

Review: स्टैटिक टेस्टिंग का मानवीय पक्ष

Review किसी वर्क प्रोडक्ट की संरचित जाँच है, जो उसके लेखक के अलावा (या उसके साथ) दूसरे लोग करते हैं। Review एक सहकर्मी के pull request पढ़ने से लेकर प्रशिक्षित भूमिकाओं, entry criteria और एकत्र किए metrics वाले औपचारिक inspection तक होते हैं। CTFL v4.0 औपचारिकता के इस पैमाने पर चार review प्रकार बताता है: informal review, walkthrough, technical review और inspection। सॉफ़्टवेयर review और audit का IEEE मानक IEEE 1028-2008 (जिसे IEEE अब inactive-reserved के रूप में सूचीबद्ध करता है) इनके अलावा management review और audit भी परिभाषित करता है, जो वर्क प्रोडक्ट की तकनीकी सामग्री के बजाय प्रगति और अनुपालन का आकलन करते हैं। ISO/IEC 20246 वर्क प्रोडक्ट review का एक सामान्य फ़्रेमवर्क बताता है।

Reviews एक सामान्य प्रक्रिया पर आधारित होते हैं — planning, review initiation, individual review, communication and analysis, fixing and reporting — और review जितना औपचारिक होता है, इस प्रक्रिया का उतना ज़्यादा हिस्सा किया जाता है; informal review किसी परिभाषित प्रक्रिया का पालन नहीं करता। मुख्य भूमिकाएँ हैं: manager, author, moderator (facilitator), scribe (recorder), reviewer और review leader। Software review के प्रकारों वाला पेज चारों प्रकारों की तुलना उद्देश्य, औपचारिकता, leader, भूमिकाओं, डॉक्यूमेंटेशन और metrics पर करता है, और प्रक्रिया, भूमिकाएँ और सफलता के कारक विस्तार से समझाता है।

  • Informal review — बिना तय प्रक्रिया के एक तेज़ दूसरी नज़र।
  • Walkthrough — author प्रतिभागियों को वर्क प्रोडक्ट से गुज़ारता है ताकि समझा सके और साझा समझ बने।
  • Technical review — योग्य साथी, moderator के नेतृत्व में, किसी तकनीकी सवाल पर फ़ैसला करते हैं।
  • Inspection — सबसे औपचारिक प्रकार, जिसका लक्ष्य जितने हो सकें उतने defects ढूँढना है, metrics के साथ।

Requirements, डिज़ाइन, कोड और टेस्ट डॉक्यूमेंट review

Review का प्रकार बताता है कि वह कितना औपचारिक है; वर्क प्रोडक्ट तय करता है कि reviewers क्या खोजें। एक ही टीम डिज़ाइन का walkthrough, ज़्यादातर कोड बदलावों का informal review और payment rules का inspection कर सकती है।

  • Requirements review — अस्पष्टता, पूर्णता, consistency, सही होना, testability, feasibility, traceability और non-functional ज़रूरतें जाँचता है, बेहतर हो तो product, development और testing साथ बैठकर। यहीं स्टैटिक टेस्टिंग आम तौर पर सबसे ज़्यादा फ़ायदा देती है, और इसका checklist व पूरे उदाहरण वाला अलग पेज है।
  • Design review — जाँचता है कि डिज़ाइन requirements, non-functional समेत, पूरी करता है: services के बीच failure कैसे फैलता है, डेटा कहाँ रहता है और उसका मालिक कौन है, peak लोड पर क्या होता है, सिस्टम को कैसे टेस्ट और monitor किया जाएगा। डायग्राम के हर तीर से पूछें: "यह dependency धीमी या बंद हो तो क्या होगा?"
  • Code review — सही होना, टेस्ट, पठनीयता, security और codebase से consistency जाँचता है। Google की प्रकाशित code review गाइड एक व्यावहारिक मानक रखती है: बदलाव को तब मंज़ूर करें जब वह कोड की समग्र सेहत को साफ़ तौर पर बेहतर करे, भले परफ़ेक्ट न हो, और वैकल्पिक टिप्पणियों को चिह्नित करें (जैसे "Nit:" से) ताकि author जाने कि merge किस चीज़ से रुका है। Formatting और style टूल्स पर छोड़ें, ताकि इंसानी ध्यान logic, डिज़ाइन और टेस्ट पर जाए।
  • Test plan review — scope और स्पष्ट रूप से out-of-scope चीज़ें, plan किन risks को संबोधित करता है, हर test level का approach, entry और exit criteria, environments और डेटा, ज़िम्मेदारियाँ और schedule जाँचें। बिना exit criteria का plan किसी को नहीं बता सकता कि टेस्टिंग कब पूरी हुई।
  • Test case review — जाँचें कि हर case किसी requirement या acceptance criterion से जुड़ा है, preconditions और डेटा बताता है, उसका expected result देखा जा सकता है, और पूरा सेट negative व boundary cases बिना duplicates के कवर करता है। अच्छे test case की बनावट test cases लिखने वाली गाइड में है।

आज़माएँ: AI Acceptance Criteria रिव्यूअर आज़माएँ: AI टेस्ट केस ऑप्टिमाइज़र आज़माएँ: AI डुप्लिकेट टेस्ट केस डिटेक्टर आज़माएँ: AI टेस्ट कवरेज एनालाइज़र

Static analysis: टूल्स की श्रेणियाँ और वे क्या जाँचते हैं

Static analysis स्टैटिक टेस्टिंग का टूल-आधारित आधा हिस्सा है: एक प्रोग्राम कोड, मॉडल या संरचित डॉक्यूमेंट पढ़ता है और नियमों के उल्लंघन रिपोर्ट करता है। इसे औपचारिक संरचना चाहिए — प्रोग्रामिंग भाषा, schema, specification फ़ॉर्मैट — और यह उस पैमाने पर चलता है जिस पर इंसान नहीं चल सकते: linter हर बदलाव की हर लाइन, हर बार, सेकंडों में जाँचता है।

नीचे के नाम हर श्रेणी के जाने-माने उदाहरण हैं, कोई रैंकिंग नहीं। सही टूल वह है जो आपकी भाषाएँ सपोर्ट करे, आपकी pipeline में चले, और इतने कम false alarms दे कि टीम उसका आउटपुट पढ़ती रहे।

  • Linters और style checkers — संदिग्ध constructs और conventions का उल्लंघन पकड़ते हैं: unused variables, unreachable code, shadowed names, छूटा हुआ await, असंगत formatting। उदाहरण: ESLint (JavaScript, TypeScript), Pylint और Ruff (Python), Checkstyle (Java), RuboCop (Ruby), ShellCheck (shell scripts), SQLFluff (SQL)।
  • Type checkers और compilers — जाँचते हैं कि values अपने declared types के अनुसार इस्तेमाल हों, और execution से पहले null व type errors की पूरी श्रेणियाँ पकड़ते हैं। उदाहरण: TypeScript compiler, Python के लिए mypy, और Java, C#, Go, Rust जैसी statically typed भाषाओं के compilers।
  • Static application security testing (SAST) — untrusted sources से ख़तरनाक sinks तक डेटा का रास्ता ट्रेस करता है और जानी-पहचानी कमज़ोरियों के पैटर्न मिलाता है: SQL injection, cross-site scripting, path traversal, कोड में लिखे secrets, कमज़ोर cryptography। उदाहरण: Semgrep, CodeQL, SonarQube, security plugins के साथ SpotBugs। OWASP बताता है कि source-code analysis टूल क्या कर सकते हैं और क्या नहीं, और NIST का SAMATE कार्यक्रम उनके मूल्यांकन के लिए test suites रखता है।
  • Schema और specification validation — जाँचता है कि संरचित artefacts अपने specification के अनुसार valid हैं: JSON को JSON Schema के सामने, OpenAPI डॉक्यूमेंट को OpenAPI specification के सामने, XML की well-formedness, YAML और cron syntax। Spectral जैसे OpenAPI linters संरचनात्मक वैधता के ऊपर consistency और style नियम जोड़ते हैं।
  • Complexity और maintainability metrics — cyclomatic complexity, function की लंबाई, duplication और coupling, जो reviewers को उस कोड की ओर ले जाते हैं जिसे टेस्ट करना और बदलना कठिन है।
  • Dependency, secret और infrastructure scanners — declared dependencies को vulnerability databases से मिलाते हैं, commits में credentials खोजते हैं, और infrastructure-as-code व container फ़ाइलों में असुरक्षित settings देखते हैं। उदाहरण: npm audit और pip-audit, OWASP Dependency-Check, gitleaks, hadolint, Checkov।
# Illustrative findings from three kinds of static analysis
src/checkout/discount.ts:41:18  error  "rate" is possibly "undefined".              TS18048 (type checker)
src/checkout/discount.ts:57:3   error  Unreachable code.                              no-unreachable (linter)
src/orders/search.ts:22:9       error  SQL query built by concatenating request
                                       parameter "q"; use a parameterised query.   sql-injection (SAST)
openapi.yaml  paths./orders/{id}.get.responses
                                warn   Operation defines no 4xx response.           (contract linter)

आज़माएँ: OpenAPI वैलिडेटर आज़माएँ: JSON Schema वैलिडेटर आज़माएँ: SQL क्वेरी वैलिडेटर आज़माएँ: YAML फ़ॉर्मेटर

Static analysis क्या नहीं पकड़ सकता

Static analysis की साफ़ रिपोर्ट का मतलब है कि artefact उन नियमों पर खरा उतरा जो किसी ने लिखे थे। इससे यह पता नहीं चलता कि सॉफ़्टवेयर वह करता है जो उसके यूज़र्स को चाहिए।

हर टूल दो तरह की गलतियाँ भी करता है। False positives — ठीक कोड पर चेतावनियाँ — भरोसा घटाते हैं, यहाँ तक कि लोग रिपोर्ट पढ़ना बंद कर देते हैं; false negatives — टूल से छूटे defects — झूठा भरोसा पैदा करते हैं। Computability theory का एक क्लासिक नतीजा है कि कोई analyser हर मनमाने प्रोग्राम की हर non-trivial व्यवहारिक property तय नहीं कर सकता, इसलिए हर टूल इन दोनों गलतियों के बीच संतुलन बनाता है। Static analysis को review और dynamic टेस्ट से पहले का तेज़ फ़िल्टर मानें, अंतिम फ़ैसला नहीं।

  • व्यवहार सही है या नहीं। टूल पुष्टि कर सकता है कि function एक संख्या लौटाता है; वह नहीं जानता कि संख्या में VAT शामिल होना चाहिए।
  • छूटी या गलत समझी गई requirements। अगर story में refund का ज़िक्र ही नहीं था, तो कोई टूल नहीं बताएगा कि refund गायब है।
  • Runtime और environment का व्यवहार: response time, असली लोड में memory, timeouts, असली services से integration, staging और production के बीच कॉन्फ़िगरेशन का अंतर।
  • ज़्यादातर concurrency और timing defects, और वे defects जो सिर्फ़ runtime पर पहुँचने वाली खास डेटा वैल्यू पर निर्भर हैं।
  • Usability, और keyboard या screen reader इस्तेमाल करने वाले के अनुभव वाली accessibility। Linters कुछ markup समस्याएँ पकड़ते हैं, जैसे बिना alt text वाली इमेज, पर यह नहीं कि पेज सच में इस्तेमाल हो सकता है या नहीं।

CI/CD pipeline में स्टैटिक टेस्टिंग

Static checks pipeline का सबसे सस्ता चरण हैं, इसलिए वे सबसे पहले और हर बदलाव पर चलते हैं।

  • Editor में और pre-commit hooks में — formatters, linters और type checks commit बनने से पहले ही feedback देते हैं।
  • हर pull request पर — lint, type check, SAST, schema और contract validation और secret scanning, नतीजे सीधे diff पर दिखें ताकि इंसानी reviewer उन्हें देखे।
  • Quality gate के रूप में — तय severity से ऊपर के नए उल्लंघन merge रोकते हैं; legacy कोड के मौजूदा उल्लंघन baseline के रूप में दर्ज होकर धीरे-धीरे चुकाए जाते हैं, पहले ही दिन सबको रोकने के बजाय।
  • Specification checks — OpenAPI, JSON Schema और कॉन्फ़िगरेशन फ़ाइलों को उसी pipeline में validate करें जिसमें उन पर निर्भर कोड बनता है, ताकि टूटा contract उसी build को fail करे जिसने उसे डाला।
# Illustrative stage order (commands are examples, not requirements)
stages:
  static-checks:
    - format-check        # formatter in check mode
    - lint                # e.g. eslint . --max-warnings=0
    - typecheck           # e.g. tsc --noEmit
    - validate-contracts  # OpenAPI and JSON Schema files
    - sast                # security rules on changed code
    - secret-scan
  unit-tests:          { needs: static-checks }
  integration-tests:   { needs: unit-tests }

शुरुआत की व्यावहारिक योजना

  • एक formatter और एक linter छोटे, सहमत rule set के साथ जोड़ें; build सिर्फ़ नए उल्लंघनों पर fail करें।
  • हर contract, schema और कॉन्फ़िगरेशन फ़ाइल को pipeline में validate करें।
  • टेस्टरों को story refinement का हिस्सा बनाएँ और हर story को sprint में जाने से पहले requirements checklist से review करें।
  • एक हल्की code review नीति तय करें: कौन review करेगा, merge किससे रुकेगा, बदलाव review के लिए कितनी देर रुक सकता है।
  • औपचारिक inspection उन गिने-चुने वर्क प्रोडक्ट के लिए रखें जहाँ छूटा defect महँगा पड़ता है: payment और pricing rules, security-critical कोड, नियामक requirements, data migrations।

आज़माएँ: AI Requirement गैप एनालाइज़र आज़माएँ: AI Acceptance Criteria रिव्यूअर

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

क्या स्टैटिक टेस्टिंग बस कोड चलाए बिना टेस्टिंग है?

यह तरीका बताता है, उद्देश्य नहीं। स्टैटिक टेस्टिंग वर्क प्रोडक्ट — requirements, डिज़ाइन, contracts, कोड, टेस्ट डॉक्यूमेंट — की जाँच करती है ताकि सीधे defects मिलें, क्वालिटी का आकलन हो और साझा समझ बने। चूँकि कुछ चलाना नहीं पड़ता, यह कोड से पहले शुरू हो सकती है और उन डॉक्यूमेंट की जाँच कर सकती है जो कभी चलेंगे ही नहीं।

Static analysis और code review में क्या फ़र्क़ है?

Static analysis टूल औपचारिक नियमों के आधार पर करते हैं; code review लोग अपनी समझ और अनुभव से करते हैं। टूल अपने जाने-पहचाने पैटर्न पर तेज़, consistent और अथक हैं; लोग डिज़ाइन की समस्याएँ, गलत business logic, छूटे टेस्ट और अस्पष्ट इरादा पकड़ते हैं। पहले टूल चलाएँ ताकि reviewers का ध्यान formatting और छोटी गलतियों पर न जाए।

क्या स्टैटिक टेस्टिंग dynamic टेस्टिंग की जगह ले सकती है?

नहीं। स्टैटिक टेस्टिंग वर्क प्रोडक्ट में defects ढूँढती है और maintainability जैसी क्वालिटी जाँचती है; dynamic टेस्टिंग चलते सॉफ़्टवेयर का व्यवहार देखती है, जिसमें performance, integration और असली डेटा शामिल हैं। दोनों अलग defects पकड़ती हैं, और परिपक्व प्रक्रिया हर test level पर दोनों का इस्तेमाल करती है।

क्या inspection और review एक ही हैं?

Inspection review का एक प्रकार है — सबसे औपचारिक। CTFL v4.0 चार प्रकार बताता है: informal review, walkthrough, technical review और inspection। Inspection पूरी review प्रक्रिया का पालन करता है, तय भूमिकाएँ इस्तेमाल करता है, जितने हो सकें उतने defects ढूँढने का लक्ष्य रखता है और प्रक्रिया सुधारने के लिए metrics इकट्ठा करता है।

क्या application security के लिए SAST काफ़ी है?

नहीं। SAST कोड-स्तर की कमज़ोरियों के पैटर्न पकड़ता है, पर runtime कॉन्फ़िगरेशन, business rules पर निर्भर authentication व authorisation की खामियाँ या असुरक्षित deployments नहीं देखता। इसे design review, dependency scanning, dynamic security testing और अहम सिस्टम के लिए penetration testing के साथ मिलाएँ।

संदर्भ

  • ISTQB Certified Tester Foundation Level (CTFL) v4.0ISTQB · 2023सॉफ़्टवेयर टेस्टिंग का फ़ाउंडेशन पाठ्यक्रम: टेस्ट स्तर और प्रकार, टेस्ट डिज़ाइन तकनीकें, टेस्ट प्रबंधन और टूल।
  • ISO/IEC 20246:2017 — Software and systems engineering — Work product reviewsISO/IEC · 2017वर्क प्रोडक्ट की समीक्षा का सामान्य फ़्रेमवर्क — review प्रक्रिया, भूमिकाएँ और review तकनीकें।
  • IEEE 1028-2008 — IEEE Standard for Software Reviews and AuditsIEEE Standards Association · 2008management review, technical review, inspection, walkthrough और audit की क्लासिक परिभाषाएँ (IEEE इसे inactive-reserved के रूप में सूचीबद्ध करता है)।
  • ISTQB GlossaryISTQBटेस्टिंग शब्दों की मानक परिभाषाएँ — टेस्ट केस, रिग्रेशन टेस्टिंग, सेवेरिटी, प्रायोरिटी, बाउंड्री वैल्यू एनालिसिस आदि।
  • Source Code Analysis ToolsOWASP Foundationstatic application security testing (SAST) टूल क्या करते हैं, उनकी ताक़त और कमज़ोरियाँ, और कैसे चुनें।
  • Software Assurance Metrics And Tool Evaluation (SAMATE)NISTसॉफ़्टवेयर assurance टूल — static analyzers सहित — के मूल्यांकन का NIST कार्यक्रम और उन्हें मापने वाले टेस्ट सूट।
  • Code Review Developer GuideGoogle (eng-practices)Google की प्रकाशित code review प्रथाएँ: reviewer क्या देखते हैं, बदलाव मंज़ूर करने का मानक और review टिप्पणियाँ कैसे लिखें।

अभ्यास

Merge से पहले money-transfer बदलाव की स्टैटिक टेस्टिंग करें

आपका काम

आप एक retail bank की mobile-banking टीम में टेस्टर हैं। Story TRF-118 ग्राहकों को saved beneficiaries को पैसे भेजने देती है, और पहला pull request तैयार है: API contract का excerpt और server कोड नीचे material में है। कुछ भी merge होने या चलने से पहले टीम चार वर्क प्रोडक्ट का साथ बैठकर review करती है: story, contract, कोड और पहला test case। आपका हिस्सा individual review है: जो भी defect मिले उसे दर्ज करें, और हर एक के लिए तय करें कि उसे ज़्यादा संभावना से कोई static analysis टूल रिपोर्ट करेगा (श्रेणी बताएँ: linter, type checker, SAST, या contract और schema validation) या उसे सिर्फ़ इंसानी reviewer ढूँढेगा।

User story TRF-118: "एक retail customer के रूप में, मैं किसी saved beneficiary को पैसे transfer करना चाहता हूँ, ताकि मुझे भुगतान के लिए branch न जाना पड़े।" Acceptance criteria — AC1: Daily limit तक का transfer तुरंत पूरा होता है। AC2: Daily limit हर customer के लिए 10,000 SAR है। AC3: Transfer स्क्रीन user-friendly है। AC4: Limit से ज़्यादा का transfer reject होता है। AC5: हर account की अपनी daily limit 10,000 SAR है।

Test case TC-TRF-07, जो अब तक लिखा गया इकलौता case है — title: "Limit के भीतर transfer"; steps: 1. Log in करें। 2. किसी beneficiary को पैसे transfer करें; expected result: "Transfer सही तरह काम करता है।" लगभग 45 मिनट रखें। काग़ज़ और पेन काफ़ी हैं; OpenAPI Validator और JSON Schema Validator आपकी कुछ टूल वाली findings की पुष्टि कर सकते हैं।

सामग्री
# openapi.yaml (excerpt)
openapi: 3.0.3
info: { title: Transfers API, version: 1.4.0 }
paths:
  /accounts/{accountId}/transfers:
    post:
      operationId: createTransfer
      summary: Create a transfer to a saved beneficiary
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                beneficiaryId: { type: string }
                amount: { type: number, example: "250.00" }
      responses:
        '201': { description: Transfer created }

// transfers.ts (excerpt, line numbers on the left)
12  export async function createTransfer(req: TransferRequest): Promise<Transfer> {
13    const limit = await getDailyLimit(req.user.id); // number | undefined
14    const sentToday: number = await db.scalar("SELECT SUM(amount) FROM transfers " +
15      "WHERE customer_id = '" + req.query.customer + "'");
16    if (sentToday + req.body.amount < limit) {
17      return saveTransfer(req.body);
18    }
19    throw new LimitExceeded();
20    audit.log('transfer rejected', req.user.id);
21  }
चरण
  1. Story review करें: हर अस्पष्टता, विरोधाभास, छूटी बात और टेस्ट न हो सकने वाला कथन चिह्नित करें, और हर एक को product owner के लिए सवाल के रूप में लिखें।
  2. Contract को story के सामने review करें: path parameters, required fields, constraints, examples और error responses। चाहें तो YAML वाला हिस्सा OpenAPI Validator में paste करें और उसकी रिपोर्ट अपनी सूची से मिलाएँ।
  3. कोड को story और contract के सामने लाइन-दर-लाइन review करें। हर finding के लिए लाइन लिखें, और यह कि उसे linter, type checker, SAST टूल या सिर्फ़ इंसानी reviewer पकड़ेगा।
  4. Test case review करें: acceptance criterion से उसका जुड़ाव, उसकी preconditions और test data, उसका expected result देखा जा सकता है या नहीं, और वे negative व boundary cases जो सेट में नहीं हैं। चाहें तो Boundary Value Analysis टूल से उस customer के लिए boundary राशियाँ निकालें जो आज 6,000 SAR भेज चुका है।
  5. कोड की तीन findings चुनें और बताएँ कि production तक पहुँचने पर हर एक customer या बैंक के लिए कौन-सा failure पैदा करेगी।
  6. आख़िर में तीन छोटे जवाब दें: दो ऐसे risks जिन्हें इस पैकेज का कोई static check खारिज नहीं कर सकता, हर एक के साथ वह dynamic टेस्ट जो कर सकता है; रोकथाम का एक उपाय और pipeline का वह चरण जहाँ automate हो सकने वाले checks चलने चाहिए; और इस बदलाव के लिए आप कौन-सा review प्रकार चुनेंगे, कारण के साथ।
मॉडल उत्तर दिखाएँ
मॉडल उत्तर

नीचे का हर item एक defect है: किसी वर्क प्रोडक्ट की खामी, जो कुछ भी चलाए बिना मिली। इनमें से कोई अभी failure नहीं है — failure वह है जो customer अनुभव करेगा अगर defect किसी चलते सिस्टम तक पहुँच जाए (step 5)। Model answer में 17 findings हैं; आपके शब्द अलग हो सकते हैं, और आख़िर में कुछ और सही findings दी गई हैं।

Story 1 — अस्पष्टता (इंसानी review)। Limit का नियम साफ़ नहीं: "daily" का मतलब calendar day है, और किस time zone में, या पिछले 24 घंटे? Limit हर transfer पर है या दिन के कुल transfers पर? क्या reject या cancel हुए transfers गिने जाते हैं?

Story 2 — विरोधाभास (इंसानी review)। AC2 limit को हर customer पर रखता है और AC5 हर account पर, तो दो accounts वाला customer दिन में 10,000 या 20,000 SAR भेज सकता है, इस पर निर्भर कि डेवलपर कौन-सा criterion मानता है। टकराव फैल भी चुका है: contract account के हिसाब से बना है (/accounts/{accountId}/transfers), जबकि कोड customer के हिसाब से transfers जोड़ता है।

Story 3 — टेस्ट न हो सकने वाला कथन (इंसानी review)। AC3 के "user-friendly" का कोई देखा जा सकने वाला मापदंड नहीं। पूछें कि इसका मतलब क्या है — जैसे, स्क्रीन आज की बची हुई राशि दिखाती है और हर error उसी field के पास दिखता है जिसकी वजह से वह आया — या इसे ऐसी usability requirement में ले जाएँ जिसका आकलन हो सके।

Story 4 — छूटी बातें (इंसानी review)। कोई error case नहीं: limit पार होने पर customer को क्या दिखता है, और balance कम होने, शून्य या उससे कम राशि, दो से ज़्यादा decimal places, या delete हो चुके beneficiary पर क्या होता है?

Contract 1 — structural error (टूल: contract और schema validation)। Path में {accountId} है, पर accountId नाम का कोई path parameter परिभाषित नहीं; OpenAPI specification path के हर template expression के लिए path parameter माँगता है। OpenAPI Validator इसे error के रूप में रिपोर्ट करता है (इस excerpt पर उसके बाकी संदेश सिर्फ़ hints हैं, info.description और servers के बारे में)।

Contract 2 — गायब error responses (टूल सिर्फ़ टीम के नियम से, वरना इंसानी review)। सिर्फ़ 201 documented है: limit से ज़्यादा राशि, invalid राशि या अनजान beneficiary के लिए कोई 4xx response नहीं, तो app नहीं जान सकता कि error कैसा दिखेगा। Structural validation एक success response वाले operation को स्वीकार करता है; 4xx response माँगने वाला contract linter नियम, जैसा गाइड के illustrative आउटपुट में है, इसे रिपोर्ट करेगा।

Contract 3 — गायब constraints (इंसानी review, या custom lint नियम)। Request body पर required: true नहीं है, कोई भी field required में नहीं है, और amount का कोई minimum नहीं, तो contract के हिसाब से खाली body या 0 या -50 की राशि valid है। इसे देखने के लिए request schema को JSON में लिखें और JSON Schema Validator में { "amount": -50 } को उसके सामने validate करें: टूल document को valid बताता है।

Contract 4 — type जो अपने example से मेल नहीं खाता (टूल: examples को उनके schema से जाँचने वाला contract linter)। amount एक number है, पर उसका example "250.00" string है, तो example से बने documentation और mocks गलत type दिखाते हैं। OpenAPI Validator structure जाँचता है, examples नहीं; पुष्टि के लिए JSON Schema Validator में "250.00" को { "type": "number" } के सामने validate करें।

Code 1 — लाइन 13 और 16 (टूल: type checker)। getDailyLimit undefined लौटा सकता है, और लाइन 16 बिना जाँच उससे तुलना करती है। Strict type checking में TypeScript compiler लाइन 16 पर TS18048: 'limit' is possibly 'undefined' रिपोर्ट करता है।

Code 2 — लाइन 14 और 15 (टूल: SAST)। SQL query request parameter को जोड़कर बनाई गई है, जिससे SQL injection संभव है। Fix: parameterised query।

Code 3 — लाइन 15 (इंसानी review)। Customer req.query.customer से लिया गया है — ऐसी value जिसे request भेजने वाला बदल सकता है और जिसे contract परिभाषित भी नहीं करता — authenticated req.user.id के बजाय। SAST इस लाइन पर injection रिपोर्ट करता है, पर कोई टूल नहीं जानता कि सही customer कौन है।

Code 4 — लाइन 14 और 15 (इंसानी review)। Query में तारीख़ की कोई शर्त नहीं, तो यह customer के अब तक के सारे transfers जोड़ती है, सिर्फ़ आज के नहीं। इसे वही देख सकता है जो जानता है कि requirement "daily" कहती है।

Code 5 — लाइन 16 (इंसानी review)। < उस transfer को reject करता है जो दिन का कुल ठीक limit के बराबर कर दे, जबकि AC1 "daily limit तक" के transfer की अनुमति देता है और AC4 सिर्फ़ limit से ज़्यादा को reject करता है। शब्दशः पढ़ें तो <= सही है; Story 1 के सवालों के साथ product owner से पुष्टि करें और जवाब story में दर्ज करें। बाद में boundary value टेस्ट इसे failure के रूप में दिखाएगा, ज़्यादा लागत पर।

Code 6 — लाइन 20 (टूल: linter, जैसे ESLint का no-unreachable नियम; allowUnreachableCode के false होने पर TypeScript compiler भी इसे रिपोर्ट करता है)। Audit call throw के बाद है, इसलिए कभी नहीं चलती, और reject हुए transfers audit log में कभी दर्ज नहीं होते।

Test case 1 — धुँधला expected result (इंसानी review)। "सही तरह काम करता है" देखा नहीं जा सकता। वह लिखें जो जाँचा जा सके: transfer डाली गई राशि के साथ बनता है, balance उतना घटता है, और आज की बची limit अपडेट होती है।

Test case 2 — न preconditions, न test data, न traceability (इंसानी review)। कौन-सा customer और account, कौन-सी limit सेट है, आज कितना भेजा जा चुका है, और कौन-सी राशि? Case यह नहीं बताता कि वह AC1 को कवर करता है, और दो टेस्टर इसे अलग-अलग तरह चलाएँगे।

Test case 3 — सेट में कमियाँ (इंसानी review)। सिर्फ़ happy path है। छूटे हुए: ठीक 10,000.00 SAR तक पहुँचने वाला कुल, उससे एक step ऊपर (10,000.01 SAR), limit पार होने का message, बिना सेट limit वाला customer, शून्य या negative राशि, और सवालों के जवाब मिलने के बाद दूसरा account और आधी रात के आसपास के transfers। टूल से: आज 6,000.00 SAR भेज चुके customer के लिए amount: number, min=0.01, max=4000 डालें और 2-value BVA चुनें; 0 और 4000.01 reject होने चाहिए, 0.01 और 4000 accept (टूल एक mid-range value भी जोड़ता है)। ये expected results उन जवाबों पर टिके हैं जो product owner ने अभी नहीं दिए — कि limit की value खुद allowed है और सबसे छोटी राशि 0.01 SAR है — इसलिए इन्हें test case में assumptions के रूप में दर्ज करें।

हिसाब: पाँच findings आम तौर पर टूल पकड़ते हैं (Contract 1 और 4, Code 1, 2 और 6), दो के लिए टीम को नियम जोड़ना होगा (Contract 2 और 3), और दस के लिए requirement जानने वाला इंसान चाहिए। इसीलिए static analysis review से पहले का तेज़ फ़िल्टर है, अंतिम फ़ैसला नहीं।

Failures (step 5), इनमें से कोई तीन: जिस customer की limit सेट नहीं, उसका हर transfer reject होता है, क्योंकि JavaScript में undefined से < तुलना का नतीजा हमेशा false होता है (Code 1); जब customer के सारे पिछले transfers का कुल 10,000 SAR तक पहुँच जाए, उसके बाद हर transfer reject होता है (Code 4); आज 6,000 SAR भेज चुका customer 4,000 SAR और नहीं भेज पाता, जबकि AC1 इसकी अनुमति देता है (Code 5); customer parameter बदलकर customer अपनी limit किसी और के transfers पर जँचवाता है और अपनी limit से बच निकलता है (Code 3); injection के ज़रिए कोई database का डेटा पढ़ या बदल सकता है (Code 2); reject हुए transfers का audit log में कोई निशान नहीं रहता (Code 6)।

Dynamic टेस्टिंग (step 6), इनमें से कोई दो: एक ही पल में भेजे गए दो transfers, किसी के save होने से पहले, दोनों check पास कर सकते हैं — reviewer सवाल उठा सकता है, पर सिर्फ़ parallel requests वाला टेस्ट दिखाता है कि database इसे रोकता है या नहीं; क्या saveTransfer सच में account से राशि काटता है और पैसा beneficiary तक पहुँचता है, जिसके लिए integration और system टेस्ट चाहिए; "तुरंत पूरा होता है" के लिए लोड में response time, जिसके लिए performance टेस्ट चाहिए; "daily" तय होने के बाद production की time zone setting के साथ आधी रात के आसपास का व्यवहार, जिसके लिए आधी रात से ठीक पहले और ठीक बाद के transfers वाला system टेस्ट चाहिए; और क्या customers को स्क्रीन सच में आसान लगती है, जिसके लिए usability टेस्टिंग चाहिए।

रोकथाम और pipeline (step 6)। सिर्फ़ यह story नहीं, template ठीक करें: user-story template में "Limits और error cases" शीर्षक जोड़ें (value, limit के ठीक बराबर का कुल allowed है या नहीं, अवधि और time zone, हर customer पर या हर account पर, हर error का message)। टूल वाली findings को ऐसे checks में बदलें जो हर pull request पर unit tests से पहले चलें: no-unreachable के साथ lint, strict type checking, SAST, और path parameters, 4xx responses और examples के नियमों के साथ contract validation। तय severity से ऊपर के नए उल्लंघन quality gate के रूप में merge रोकें।

Review प्रकार (step 6)। Transfer limit एक payment rule है जहाँ छूटा defect महँगा पड़ता है, इसलिए pull request पर informal नज़र के बजाय औपचारिक inspection — या कम से कम technical review — बेहतर है। इस individual review से बनी आपकी सूची review प्रक्रिया की अगली गतिविधि, communication and analysis, का इनपुट है।

दूसरी सही findings: AC1 का "तुरंत पूरा होता है" तब अस्पष्ट है जब beneficiary का account किसी दूसरे बैंक में हो; customer का अभी कोई transfer न होने पर SUM NULL लौटाता है, तो sentToday हमेशा वह number नहीं होता जो उसका type घोषित करता है, और अगर db.scalar बिना type की value लौटाता है तो type checker इसे नहीं देखेगा; कोड excerpt में कुछ भी यह नहीं जाँचता कि beneficiaryId customer के saved beneficiaries में से है (पूछें कि क्या saveTransfer यह करता है); और contract excerpt पैसे भेजने वाले operation के लिए कोई security requirement घोषित नहीं करता (पूछें कि पूरी फ़ाइल में है या नहीं)।

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

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

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

requirements में अस्पष्ट, धुँधले या परस्पर विरोधी कथन पकड़ें और Mutqan AI से स्पष्टीकरण के सवाल पाएँ।

आवश्यकता विश्लेषण AI

Mutqan AI से छूटी हुई requirements खोजें — error handling, permissions, edge conditions, non-functional ज़रूरतें।

आवश्यकता विश्लेषण AI

acceptance criteria की testability, पूर्णता और अस्पष्टता की समीक्षा करें और Mutqan AI से बेहतर लिखे गए सुझाव पाएँ।

आवश्यकता विश्लेषण AI

OpenAPI 3.x और Swagger 2.0 दस्तावेज़ों में संरचना की ग़लतियाँ तथा best-practice समस्याएँ जाँचें।

वेब

JSON डॉक्यूमेंट को JSON Schema (draft-07 / 2019-09 / 2020-12 के मुख्य कीवर्ड) के विरुद्ध वैलिडेट करें।

JSON और डेटा

SQL स्टेटमेंट में सिंटैक्स की समस्याएँ, असंतुलित कोष्ठक, बिना बंद की स्ट्रिंग और जोखिम भरे पैटर्न जाँचें।

डेटाबेस

Mutqan AI से मौजूदा टेस्ट केस बेहतर बनाएँ: साफ़ स्टेप, सटीक अपेक्षित परिणाम, छूटी हुई पूर्व-शर्तें और बेहतर संरचना।

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

Mutqan AI से किसी सूट में डुप्लिकेट और आपस में ओवरलैप करते टेस्ट केस खोजें और मर्ज करने की सिफ़ारिशें पाएँ।

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

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

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

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

और गाइड

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

Software Review के प्रकार

Informal review, walkthrough, technical review और inspection की तुलना, साथ में सामान्य review प्रक्रिया, छह भूमिकाएँ और सफलता के कारक।

12 मिनट पढ़ने का समय
आवश्यकता विश्लेषण

Requirements Review कैसे करें

Requirements और user stories का review कैसे करें: 8-बिंदु checklist, चेतावनी वाले शब्द, review comments वाला उदाहरण, और AI टूल कहाँ मदद करते हैं।

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

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

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

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

SDLC और STLC की पूरी समझ

सॉफ़्टवेयर डेवलपमेंट और टेस्टिंग लाइफ़ साइकल कैसे जुड़ते हैं: हर चरण में QA, SDLC से STLC की मैपिंग, shift-left और हर मॉडल में टेस्टिंग।

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

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

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

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

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

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

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