۲۵۰ بررسی خودکار در هشت دقیقه اجرا شده‌اند و همه سبزند؛ آیا محصول سالم است؟ نه. این عدد فقط می‌گوید Runner برای ۲۵۰ رکورد، نتیجه‌ای با برچسب سبز تولید کرده است. هنوز نمی‌دانیم هر Check چه پرسشی داشته، روی کدام Build اجرا شده، Oracle از کجا آمده، Retry چه چیزی را پنهان کرده، Evidence متعلق به همین Subject است یا اصلاً این مجموعه ریسک مهمی را می‌سنجد.

اتوماسیون تست وقتی قابل اعتماد می‌شود که هر Automated Check یک ادعای محدود، اجرای قابل بازتولید، Evidence قابل ردیابی و چرخه‌عمر روشن داشته باشد. این راهنما افسانه‌های رایج را به یک Automation Claim & Lifecycle Contract تبدیل می‌کند: Question/Claim → Subject/Trigger → State/Data → Oracle → Control → Runner/Environment → Result/Evidence → Cost/Value → Keep/Adapt/Quarantine/Retire → Correction.

این صفحه جای راهنمای عمومی اتوماسیون تست چیست، مقایسهٔ تست دستی و خودکار یا طراحی Portfolio نیست. واحد تحلیل اینجا یک Check و ادعای آن در طول عمر است: دقیقاً چه چیزی را، تحت چه شرایطی، با چه محدودیتی می‌تواند بگوید؟

پاسخ کوتاه: واقعیت اتوماسیون تست چیست؟

Automation جایگزین «تست انسانی» یا ماشین تولید کیفیت نیست؛ یک سازوکار اجرای تکرارپذیر برای Checkهای مشخص است. ممکن است زمان بازخورد را در یک دامنه کم کند، خطای تکرار را کاهش دهد و Evidence منظم بسازد؛ اما ارزش آن به سؤال، Test Basis، Oracle، داده، محیط، قابلیت مشاهده، هزینهٔ نگهداشت و تصمیمی وابسته است که نتیجه قرار است پشتیبانی کند.

  • سبز یعنی مشاهده با Oracle تعریف‌شده سازگار بوده؛ نه اینکه باگی وجود ندارد.
  • خودکار یعنی بخشی از اجرا/مقایسه/جمع‌آوری Evidence ماشینی شده؛ نه اینکه قضاوت، طراحی و مسئولیت حذف شده‌اند.
  • سریع فقط یک ویژگی عملیاتی است؛ Check سریعِ بی‌ربط، اطلاعات تصمیم‌پذیر نمی‌سازد.
  • پایدار باید با تکرار کنترل‌شده و ثبت همهٔ Attemptها سنجیده شود؛ Retry مخفی، پایداری نیست.
  • ارزشمند یک فرضیهٔ قابل سنجش در متن همان Product و Risk است؛ نه نتیجهٔ قطعی تعداد اسکریپت‌ها.

مرز این راهنما با Strategy، Framework و CI

پرسشمالک محتوایی مناسبمرز این صفحه
چه چیزی را در کل سازمان خودکار کنیم؟استراتژی اتوماسیون تستPortfolio، Pilot و Scale
کدام Check در کدام Lane اجرا شود؟Continuous Testing در CI/CDFeedback Lane و Quality Gate
Run و Attempt چگونه کنترل شوند؟چرخه اجرای تستRun/Attempt/Outcome/Closure
این Automated Check چه ادعایی دارد و چه زمانی باید بازنشسته شود؟همین راهنماClaim و Lifecycle یک Check

واژگان دقیق: Test، Check، Script، Runner و Evidence

واژهتعریف عملیاتی در این راهنماچه چیزی نیست؟
Test activityفعالیت یادگیری و ارزیابی دربارهٔ Product/Risk که می‌تواند انسانی، ماشینی یا ترکیبی باشدفقط اجرای اسکریپت
Automated Checkپرسش محدود با ورودی، Oracle و مقایسهٔ ماشینی تکرارپذیراثبات کلی کیفیت
Script/Control implementationکد، Flow یا Modelی که Setup، Stimulus، Observe و Compare را اجرا می‌کندخود Claim یا Test Basis
Runnerاجراکننده با نسخه، Config، زمان‌بندی و سیاست AttemptOracle
Oracleقاعده و Source تشخیص Expected/Acceptable از Observedصرفاً «پیام موفقیت دیدم»
OutcomePASS/FAIL/ERROR/SKIPPED/INCONCLUSIVE یک Attempt طبق Vocabulary نسخه‌دارتصمیم Release
EvidenceArtifact دارای Subject/Build/Attempt/time/provenance/integrity که Outcome را قابل بررسی می‌کندScreenshot بی‌هویت

Automation Claim & Lifecycle Contract چیست؟

این Contract یک رکورد نسخه‌دار است که اجرای Check را به پرسش، ریسک، Subject، Oracle، Evidence و تصمیم نگهداشت وصل می‌کند. هدف آن سنگین‌کردن هر تست کوچک نیست؛ هدف حذف ابهام‌هایی است که باعث سبزی کاذب، Fail بی‌معنا، Flaky پنهان و Suite متروک می‌شوند. عمق رکورد باید متناسب با ریسک و هزینه باشد.

AutomationCheckContract
  checkId / version / supersedes
  product / goal / risk / testBasis snapshot
  question / boundedClaim / claimLimit
  immutableSubject / trigger
  preconditions / initialState / dataContract / cleanup
  oracle.source / oracle.rule / comparisonMethod
  implementationRef / repository / commit
  runner / environment / dependency versions
  isolation / order / parallel / retry policy
  resultVocabulary / unknownPolicy
  evidenceManifest / freshness / retention / integrity
  ownerCapability / triageSLA / reviewDue
  costBaseline / valueHypothesis / measure / guardrail
  disposition: KEEP | ADAPT | QUARANTINE | RETIRE
  correctionPolicy / retirementRecord

از تصور غلط به سؤال قابل ممیزی

جملهٔ مبهمسؤال جایگزینEvidence لازم
اتوماسیون کیفیت را بالا می‌بردکدام Decision، برای کدام Risk، نسبت به کدام Baseline اطلاعات سریع‌تر/معتبرتر می‌گیرد؟Baseline، Measure و Countermetric
این Suite صددرصد سبز استچه تعداد Check یکتای واجد شرایط، برای همین Build، با Evidence تازه و بدون Retry پنهان PASS شده‌اند؟Manifest و همهٔ Attemptها
این تست Flaky استدر مجموعهٔ اجرای کنترل‌شده با Input/Build/Environment ثابت، چه Variation مشاهده شده؟Run series و تغییرهای کنترل‌شده
این Check ارزش نگهداشت نداردهزینه، مصرف تصمیمی، Signal و ریسک حذف آن در بازهٔ مشخص چه بوده؟Cost/usage/finding history و Review

تصور غلط ۱: اتوماسیون جای تست انسانی را می‌گیرد

Automated Check می‌تواند یک مقایسهٔ ازپیش‌تعریف‌شده را با سرعت و تکرار بالا اجرا کند. انسان پرسش را انتخاب می‌کند، Risk را تفسیر می‌کند، Oracle را نقد می‌کند، رفتار تازه را می‌کاود و دربارهٔ Unknown تصمیم می‌گیرد. مرز «دستی/خودکار» ثابت نیست: Setup می‌تواند ماشینی و Observation انسانی باشد؛ یا انسان Model را بسازد و Runner مسیرها را تولید کند.

بنابراین نه «انسان فقط خلاق است» گزارهٔ دقیقی است و نه «ماشین همهٔ تست را انجام می‌دهد». روش را بر اساس پرسش، قابلیت مشاهده، هزینه، تکرار، خطر و نیاز به قضاوت انتخاب کنید. برای انتخاب ترکیبی، راهنمای Manual vs Automated Testing مرجع مستقل است.

تصور غلط ۲: سبز یعنی بدون باگ و باکیفیت

PASS یک گزارهٔ محدود است: «Observed در این Attempt با Oracle این Check سازگار بود.» ممکن است Requirement ناقص، Oracle اشتباه، Data غیرنماینده، Subject قدیمی یا Observe ناکافی باشد. Check نیز فقط آنچه را کد کرده‌ایم نمی‌سنجد؛ ممکن است به سبب Dependency، Selector یا Timing چیز دیگری را بسنجد.

تعداد Check، Code coverage، Requirement mapping و PASS rate هرکدام View متفاوت‌اند. هیچ‌کدام به‌تنهایی کفایت طراحی تست، نبود باگ، رضایت کاربر یا آمادگی انتشار را اثبات نمی‌کنند. تصمیم انتشار به Risk، Evidenceهای دیگر، Unknown و اختیار تصمیم نیاز دارد؛ چارچوب آن در کیفیت به‌اندازه کافی خوب آمده است.

تصور غلط ۳: هرچه تعداد Check بیشتر باشد Coverage بهتر است

۱۰۰ Check تکراری می‌توانند همان یک Condition را بسنجند. برای ادعای Coverage ابتدا Registry واجد شرایط و واحد پوشش را نام‌گذاری کنید: Risk، Requirement، State transition، API operation، Browser/locale pair یا Data partition. سپس Checkهای یکتا را به آن Registry نگاشت کنید و Missing، Duplicate، N/A، Stale و Evidence-backed را جدا نگه دارید.

هر درصد باید Population snapshot، Numerator، Denominator، Exclusion، cutoff و limitation داشته باشد. Coverage یک مدل است، نه حقیقت محصول؛ Check count را به‌عنوان جایگزین آن منتشر نکنید.

تصور غلط ۴: همهٔ Checkها باید با هر Commit اجرا شوند

اجرای مکرر می‌تواند بازخورد را زودتر کند، اما «همه‌چیز در هر Commit» ممکن است صف طولانی، هزینهٔ زیرساخت، Rate limit، دادهٔ برخوردی و Noise بسازد. Trigger باید از Risk، Change impact، زمان اجرا، Isolation، هزینه، دسترسی Environment و Consequence تأخیر مشتق شود.

Lane نمونهTriggerClaim محدودمحدودیت
PR-fastتغییر در ماژول مربوطFeedback سریع روی چند Risk نزدیکپوشش کامل نیست
merge/integrationادغام در شاخهٔ اصلیسازگاری قراردادهای منتخبEnvironment هنوز Production نیست
nightly/broadزمان‌بندینمونهٔ گسترده‌تر در Build ثابتبازخورد دیرتر است
pre-release/riskCandidate مشخصEvidence برای Riskهای Release policyتصمیم را خودکار نمی‌کند

تصور غلط ۵: اسکریپت پس از ساخت تقریباً رایگان است

Check یک محصول نگهداشتنی است. Basis، Product behavior، Data schema، API، Locator، Browser، Runner، Dependency، Pipeline و سیاست Evidence تغییر می‌کنند. بعضی تغییرها Check را واقعاً نامعتبر و بعضی فقط Implementation را شکسته می‌کنند؛ اگر این دو را جدا نکنیم، تیم یا Fail محصول را «خرابی تست» می‌نامد یا Drift تست را به‌عنوان Defect محصول گزارش می‌کند.

هزینه فقط زمان تعمیر نیست: زمان Review، CI compute، داده و محیط، triage، نگهداری Secret، ذخیرهٔ Artifact، On-call و هزینهٔ Opportunity را نیز ثبت کنید. Freshness و Drift اسناد مرتبط باید طبق قرارداد مستندات تست زنده مدیریت شوند.

تصور غلط ۶: Recorder یا Codeless همیشه بن‌بست است

Record/Playback، Low-code و Codeless نام‌هایی برای قابلیت‌های متفاوت‌اند. یک Flow بدون کد ممکن است Export، Version control، Review، API، Data parameterization و CI خوبی داشته باشد؛ یک Framework کدنویسی‌شده نیز ممکن است شکننده و غیرقابل بررسی باشد. معیار، زبان ساخت نیست؛ توانایی کنترل State/Data، تعریف Oracle، مشاهدهٔ Failure، Diff، امنیت، همکاری، نگهداشت و Exit است.

برای ارزیابی Recorder با تغییر عمدی و PoC نماینده، به راهنمای اتوماسیون بدون کد مراجعه کنید. نتیجهٔ PoC را به همهٔ محصولات و تیم‌ها تعمیم ندهید.

تصور غلط ۷: برنامه‌نویسی، OOP یا Page Object برای همه اجباری است

قابلیت فنی لازم تابع Interface و مسئله است. بعضی Checkها با Query، قرارداد داده، Model، CLI یا ابزار تخصصی ساخته می‌شوند؛ برخی به کدنویسی عمیق نیاز دارند. Page Object یک الگوی ممکن برای کاهش تکرار و پنهان‌کردن جزئیات UI است، نه قانون جهان‌شمول و نه Oracle. Abstraction زودهنگام می‌تواند Intent را پنهان کند و تغییر کوچک را در کل Suite منتشر سازد.

به‌جای عنوان شغلی یا گواهی، Capabilityهای observable را بسنجید: توانایی صورت‌بندی Question، ساخت دادهٔ ایمن، کنترل State، نوشتن Comparison درست، تشخیص Failure mode، خواندن Trace، Review تغییر و اصلاح Evidence.

تصور غلط ۸: یک ابزار یا Framework برای همه بهترین است

Web UI، Mobile، API، Contract، Component، Data pipeline، Performance و Accessibility Interfaceهای متفاوت دارند. «بهترین» بدون Constraint معنا ندارد. Candidateها را روی Browser/device support، Protocol، Debuggability، Isolation، Parallelism، Evidence، CI fit، Skills، License، Region، Security، Exit و Cost of change بسنجید.

نام ابزار تضمین معماری نیست. مستندات Selenium نیز توصیه‌های خود را آگاهانه «guidelines and recommendations» می‌نامد، چون یک رویکرد برای همهٔ موقعیت‌ها مناسب نیست. ادعای قابلیت را با نسخه و مستند روز و سپس PoC خودتان اعتبارسنجی کنید.

تصور غلط ۹: ROI بالاخره حتماً مثبت می‌شود

ROI نتیجهٔ تضمینی زمان نیست. Check ممکن است پیش از رسیدن به Break-even به علت حذف Feature، تغییر Architecture یا Oracle نامعتبر بازنشسته شود. همچنین «زمان اجرای دستی × دفعات» فقط یک Counterfactual ساده است؛ همهٔ اجرای دستی حذف نمی‌شود و Automation هزینهٔ Build، نگهداشت، triage و زیرساخت دارد.

Value hypothesis: کاهش median زمان Feedback برای R-IDEMP-4
Baseline: 42 دقیقه در نمونهٔ قابل مقایسه
Measure: median feedback minutes per eligible run
Costs: build + review + CI + data/env + triage + maintenance
Guardrails: false-result rate, maintenance minutes, queue time
Review window: 30 روز
Claim limit: نه ROI قطعی، نه کیفیت یا Release

از ضریب‌های ثابت مانند «هزینهٔ باگ دیرهنگام همیشه ۱۰۰ برابر است» به‌عنوان واقعیت پروژه استفاده نکنید. Baseline، Assumption، بازهٔ عدم قطعیت و Countermetric محلی لازم‌اند.

تصور غلط ۱۰: Automation متعلق به تیم QA است

مالکیت یک Silos جدید نسازید. Product/Risk owner، Developer، Tester، Platform، Security، Data و Operations می‌توانند در Question، Testability، Environment، Oracle، Review و Response سهم داشته باشند. اما «همه مسئول‌اند» کافی نیست: هر Check به قابلیت نگهداشت، Triage SLA و Decision authority روشن نیاز دارد.

تصمیمپاسخ‌گو بر اساس قابلیتورودی‌های لازم
Claim/Oracle را قبول یا رد کندDomain + test-design capabilityBasis، Risk و نمونه‌های مرزی
Implementation را Merge کندCode/flow owner با ReviewerDiff، اجرای کنترل‌شده، امنیت
Failure را Triage کندResponse ownerهمهٔ Attemptها، Trace و تغییرها
Quarantine یا Re-entry دهدReliability owner طبق PolicyFailure series، Cause evidence، expiry
Risk یا Release را بپذیردBusiness/Product authorityچند Evidence، Unknown و Trade-off

مرحله ۱: Question و Claim محدود را بنویسید

Question باید یک ابهام تصمیمی را هدف بگیرد. «آیا Checkout کار می‌کند؟» بسیار بزرگ است. نمونهٔ محدودتر: «برای Attempt مشخص روی Build R20، آیا دریافت دوبارهٔ Callback با Event ID یکسان بیش از یک Ledger effect می‌سازد؟» Claim پاسخ ماشینی مورد انتظار است؛ Claim limit هم آنچه را نمی‌توان نتیجه گرفت ثبت می‌کند.

question: duplicate callback چه اثری دارد؟
claim: برای Tenant+Attempt+Event ثابت، دقیقاً یک Ledger entry ساخته می‌شود
claimLimit:
  - سایر Failure modeهای پرداخت پوشش داده نشده‌اند
  - نبود باگ یا صحت مالی Production نتیجه نمی‌شود
  - PASS مجوز Release نیست

مرحله ۲: Subject و Trigger تغییرناپذیر را پین کنید

برچسب‌هایی مانند latest، main، nightly یا staging کافی نیستند؛ در زمان Review به شیء دیگری اشاره می‌کنند. Product، Repository، Commit، Build artifact، Environment snapshot، Test Basis و Risk registry را با ID/version ثبت کنید. Trigger نیز باید بگوید Check چرا اکنون اجرا شده: Change impact، PR، زمان‌بندی، Pre-release یا رخداد عملیاتی.

Identityضعیفقابل ممیزی
کد محصولmainrepository=checkout-api، commit=C20
Artifactlatest imagebuild=BUILD-R20، digest مشخص
EnvironmentstagingENV-SYN-R20 + config/dependency versions
Basisطبق نیازمندیBASIS-v7:R-IDEMP-4

مرحله ۳: Preconditions، State، Data و Cleanup را قرارداد کنید

Check باید از State معلوم شروع شود. «یک سفارش موجود» ممکن است متعلق به Tenant دیگر، مصرف‌شده یا هم‌زمان در حال تغییر باشد. Data contract باید Seed، Partition، Ownership، عمر، Format، Currency unit، locale و Cleanup را روشن کند. Randomness بدون Seed قابل بازتولید نیست؛ دادهٔ ثابت مشترک نیز برخورد می‌سازد.

جزءنمونهٔ قراردادFailure mode مهارشده
PreconditionPSP-STUB-v4 و LEDGER-STUB-v3 آمادهوابستگی مبهم
Initial stateORDER_CREATED / ATTEMPT_PENDINGوابستگی به ترتیب اجرا
PartitionTEN-SYN-20 + Run IDبرخورد Parallel
Seedseed=R20-CHK-1تولید غیرقابل بازتولید
Cleanupحذف Namespace مصنوعی پس از ثبت Evidenceآلودگی اجرای بعد

مرحله ۴: Oracle را از Approval و Screenshot جدا کنید

Oracle باید Source، Rule، Tolerance، Timing window و روش مقایسه داشته باشد. «صفحه موفقیت را دیدم» ممکن است فقط لایهٔ UI را بسنجد و Side effect ناموفق را نبیند. «مدیر تأیید کرد» نیز Evidence اجرای رفتار نیست. Expected value را از همان System under test کپی نکنید؛ این کار یک خطا را در هر دو طرف بازتولید می‌کند.

  • برای State، مقدار قبل/بعد و کلید هویت را مقایسه کنید.
  • برای پول، واحد canonical و سیاست rounding را صریح کنید.
  • برای زمان، Clock و Window را کنترل کنید؛ Sleep ثابت Oracle نیست.
  • برای Event، uniqueness، ordering و eventual-consistency window را تعریف کنید.
  • برای Visual، Baseline، viewport، font، OS/browser و tolerance نسخه‌دار لازم است.

مرحله ۵: Control implementation را از Claim جدا نگه دارید

یک Claim ممکن است با API، UI، Component یا Model سنجیده شود. تغییر Implementation لزوماً Claim را عوض نمی‌کند؛ تغییر Basis ممکن است Claim را منسوخ کند حتی اگر Script هنوز سبز باشد. Contract باید implementationRef، Repository، Commit، Dependencies و Reviewer را نگه دارد تا Drift قابل تشخیص باشد.

کد Test باید مانند کد تصمیم‌ساز Review شود: نام هدف‌دار، Failure message تشخیصی، Assertion مشخص، Cleanup امن، Secret-free output و حداقل Abstraction لازم. اما «Production code دقیقاً همان Test code» قانون نیست؛ Risk و Failure consequence متفاوت‌اند.

مرحله ۶: Runner، Environment و Dependency را قابل بازتولید کنید

Runtime، Test runner، plugin، browser/device، OS/container، locale، timezone، feature flag، Config و Stub version بر Outcome اثر دارند. فقط Version نوشتن نیز کافی نیست؛ Config و Artifact digest گاهی تعیین‌کننده‌اند. Dependency خارجی کنترل‌نشده می‌تواند Failure آن سرویس را به Product شما نسبت دهد یا تغییر محتوای آن را Flakiness جا بزند.

راهنمای رسمی Playwright Best Practices بر رفتار قابل مشاهده، Isolation، دادهٔ کنترل‌شده و پرهیز از تست مستقیم سرویس ثالث تأکید می‌کند؛ این توصیه‌ها مربوط به Playwright و تست‌های آن‌اند، نه اثبات جهان‌شمول کیفیت. برای هر Stack، مستند نسخهٔ خودش و آزمایش محلی لازم است.

مرحله ۷: Isolation، Order و Parallelism را آزمایش کنید

Check مستقل باید بتواند تنها، پس از Check دیگر، با ترتیب تصادفی و در ظرفیت Parallel تعریف‌شده همان ادعای محدود را ارزیابی کند. استقلال مطلق همیشه ممکن یا اقتصادی نیست؛ اگر State مشترک لازم است، Dependency و Serialization را آشکار کنید و Claim را محدود سازید.

مستند رسمی Selenium دربارهٔ پرهیز از State مشترک پیشنهاد می‌کند داده و Driver بین تست‌ها مشترک نباشد و دادهٔ کهنه پاک شود. این یک توصیهٔ زمینه‌ای برای WebDriver است؛ Contract شما باید هزینه و محدودیت واقعی سامانه را نیز ثبت کند.

مرحله ۸: Result Vocabulary را از رنگ جدا کنید

Outcomeمعناچه چیزی را نباید نتیجه گرفت؟
PASSObserved با Oracle همین Attempt سازگار استبدون باگ/Release-ready
FAILمقایسهٔ معتبر ناسازگاری نشان دادCause حتماً Defect محصول است
ERRORCheck نتوانست مقایسهٔ معتبر را کامل کندرفتار Product رد شده است
SKIPPEDطبق Rule اجرا نشدPASS ضمنی
INCONCLUSIVEObservation برای Verdict کافی نبودFAIL یا PASS

Color فقط View است. Vocabulary، Transition و Aggregation policy را نسخه‌دار کنید؛ ERROR و SKIPPED را در PASS rate پنهان نکنید و «آخرین Attempt سبز» را جای Outcome مجموعهٔ Retryها ننشانید.

مرحله ۹: Evidence Manifest قابل ردیابی بسازید

Evidence باید Answer reviewable بسازد، نه انبار Artifact. Manifest حداقل Check/version، Subject/Build/Commit، Run/Attempt، Runner/Environment، Started/Finished، Outcome، raw refs، digest، freshness، retention، redaction و Unknown را نگه دارد. Screenshot، log یا trace بدون این هویت‌ها قابل نسبت‌دادن نیست.

{
  "check": "CHK-IDEMPOTENCY-01@3",
  "subject": "checkout-idempotency",
  "build": "BUILD-R20",
  "commit": "C20",
  "run": "RUN-SYN-20",
  "attempt": 1,
  "outcome": "PASS",
  "startedAt": "2026-08-13T06:00:00Z",
  "finishedAt": "2026-08-13T06:00:03Z",
  "raw": ["evidence/R20/CHK-1.ndjson"],
  "digest": "sha256:fictional-r20-check-1",
  "unknowns": [],
  "claimLimit": "not coverage, quality, ROI, or release proof"
}

برای ارائهٔ Artifact به مخاطب تصمیم‌گیر، قواعد Evidence تا تصمیم قابل‌پیگیری را جداگانه اعمال کنید.

مرحله ۱۰: Retry را Evidence کنید، نه آرایش نتیجه

Retry می‌تواند برای جمع‌آوری Signal یا تحمل Failure mode شناخته‌شده مفید باشد؛ اما اگر فقط آخرین Attempt نمایش داده شود، اولین Failure پاک می‌شود. برای هر Attempt، Input، Seed، Build، Environment، زمان، Outcome و Artifact را حفظ کنید. Summary باید PASS_FIRST_TRY، PASS_AFTER_RETRY، CONSISTENT_FAIL و MIXED را از هم جدا کند.

الگوبرداشت مجازاقدام
PASS در Attempt اولیک Observation سازگارطبق Sampling ادامه
FAIL سپس PASSVariation مشاهده شدTriage؛ سبز نهایی Failure اول را حذف نمی‌کند
ERROR سپس PASSExecution failure رخ دادRunner/Environment را بررسی کنید
FAIL مداومناسازگاری قابل تکرار در شرایط ثبت‌شدهFinding و Cause investigation

مرحله ۱۱: Flaky، False Fail و False Pass را قاطی نکنید

Flaky یعنی Outcome در شرایطی که طبق قرارداد باید معادل باشند تغییر می‌کند؛ پیش از این برچسب باید Equivalence شرایط را نشان دهید. False Fail یعنی Check ناسازگاری گزارش کرده ولی Claim مورد نظر نقض نشده؛ False Pass یعنی Check PASS داده در حالی که Claim نقض شده است. مورد آخر معمولاً کم‌صداتر و خطرناک‌تر است.

Flake rate بدون Population و Attempt policy گمراه‌کننده است. تغییر Product، Environment، Data یا Dependency شاید Failure واقعی بیرون از Scope Check باشد، نه Flakiness. Observation، Hypothesis و confirmed Cause را جدا ثبت کنید.

مرحله ۱۲: Quarantine را با SLA و Re-entry ببندید

Quarantine حذف بی‌سروصدای Check از Gate نیست. رکورد باید Reason evidence، Owner، Start، Expiry، Risk impact، جایگزین موقت، Triage SLA و Re-entry rule داشته باشد. Dashboard باید Check قرنطینه‌شده را در Denominator مناسب نگه دارد؛ وگرنه Pass rate با حذف Failureها مصنوعی بهتر می‌شود.

quarantineId: Q-CHK-17
check: CHK-IDEMPOTENCY-01@3
reason: MIXED outcome across controlled series RS-20
riskImpact: automated signal for R-IDEMP-4 unavailable
temporaryControl: focused manual observation on release candidate
owner: capability:automation-reliability
expiresAt: 2026-08-20T12:00:00Z
reentry: 20 clean runs across 3 builds + confirmed-cause evidence
closureEvidence: required

مرحله ۱۳: KEEP، ADAPT، QUARANTINE یا RETIRE

Dispositionزمان مناسبرکورد لازم
KEEPClaim هنوز معتبر، Signal مصرف‌شده و هزینه قابل قبول استreviewDue و Evidence مصرف
ADAPTClaim باقی است ولی Basis/Interface/Data/Implementation تغییر کردهimpact، version و supersedes
QUARANTINESignal موقتاً غیرقابل اعتماد و Risk هنوز فعال استexpiry، owner، control جایگزین، re-entry
RETIRERisk/Feature حذف، Claim نامعتبر، Check تکراری یا هزینه از ارزش محدود بیشتر استreason، آخرین Evidence، جایگزین و archive

Suite سالم فقط Check اضافه نمی‌کند؛ با Evidence، مورد نامعتبر را اصلاح یا بازنشسته می‌کند. حذف فایل بدون Retirement record، تاریخچهٔ Coverage و علت تصمیم را مبهم می‌کند.

مرحله ۱۴: Correction و Supersession را نگه دارید

اگر بعداً معلوم شد Oracle اشتباه یا Evidence به Build دیگری متعلق بوده، نتیجه را بی‌صدا بازنویسی نکنید. Correction باید Record قبلی، Reason، Discoverer، corrected interpretation، affected decisions، notification و timestamp را پیوند دهد. Contract جدید با version/supersedes منتشر شود و Raw evidence طبق Retention باقی بماند.

correctionId: CORR-R20-04
corrects: OUTCOME-R20-CHK-1-A1
reason: manifest referenced BUILD-R19 evidence
oldInterpretation: PASS for BUILD-R20
newInterpretation: INVALID / no valid evidence for BUILD-R20
affectedDecision: DR-20
notifiedAt: 2026-08-13T09:15:00Z
supersedingCheck: CHK-IDEMPOTENCY-01@4

مبنای استاندارد و محدودیت منابع

سرفصل رسمی ISTQB CTFL v4.۰.۱ در بخش مزایا و ریسک‌های Test Automation تصریح می‌کند که صرف تهیهٔ ابزار موفقیت را تضمین نمی‌کند و معرفی، نگهداشت و آموزش effort می‌خواهند؛ همچنین مزایای بالقوه‌ای مانند کاهش کار تکراری، سازگاری، دسترسی بهتر به اطلاعات و بازخورد سریع‌تر را برمی‌شمارد. واژهٔ «بالقوه» مهم است: این منبع نتیجهٔ پروژهٔ شما، ROI، ابزار مناسب، Coverage کافی یا کیفیت Product را اثبات نمی‌کند.

راهنماهای Playwright و Selenium نیز توصیه‌های Stack-specific دربارهٔ Isolation، State و Debugging هستند. آن‌ها را به Contract محلی ترجمه کنید؛ از نام مرجع برای ساختن قانون اجباری، رتبه‌بندی ابزار یا ادعای تضمینی استفاده نکنید.

آزمایش بازتولیدپذیر: ۲۵۰ Check سبز در برابر ۷۱ Finding

برای اینکه بحث فقط توصیه نماند، یک Fixture مستقل و کاملاً مصنوعی با شناسهٔ SYN-AUTOMATION-CLAIM-LIFECYCLE-01 و Node.js v24.۱۸.۰ ساخته شد. هیچ شبکه، Browser، Database یا Product واقعی در آن وجود ندارد. معیار سطحی فقط سه فیلد را دید: ۲۵۰ Check، ۲۵۰ Green و هشت دقیقه؛ پس PASS داد.

{
  "superficial": {
    "status": "PASS",
    "message": "250/250 automated checks green in 8 minutes"
  },
  "contractAudit": {
    "status": "HOLD",
    "findingCount": 71
  }
}

Validator دقیق ۷۱ Failure ساختاری یافت: ده Identity کهنه/متحرک؛ Check ID تکراری؛ Question/Claim/Subject/Trigger/State/Data/Oracle/Implementation/Runner/Environment/Dependency/Owner/SLA ناقص؛ State مشترک، نبود Cleanup و برخورد Order/Parallel؛ Retry-until-green و Quarantine بی‌مالک؛ Vocabulary دوحالته؛ Evidence خارجی و کهنه بدون Manifest/raw/time/digest/freshness/Unknown؛ Cost/Value/Guardrail نامشخص؛ نبود Review/Correction/Retention/Redaction/Disposition/Retirement؛ و سیزده ادعای مطلق دربارهٔ جایگزینی انسان، نبود باگ، Coverage، Quality، Release، ROI، ضریب ۱۰۰، Programming، Codeless، Framework، بهترین ابزار، every-commit و مالکیت QA.

نسخهٔ اصلاح‌شدهٔ آزمایش چه چیزی را ثابت کرد؟

نسخهٔ اصلاح‌شده AUTO-۱۹/SYN-CHECKOUT/PG-۱۳/BASIS-v7/checkout-tests/C20/BUILD-R20/RISK-v9/TEST-STRAT-v5/PIPE-v6 را پین کرد؛ یک Check یکتا برای idempotency ساخت؛ Question، Claim limit، Subject، Trigger، State/Data، Oracle، implementationRef، Runner/Environment/Stub، Isolation، Result vocabulary، همهٔ Attemptها، Manifest، freshness، Owner/SLA، Cost/Value/Guardrail و Lifecycle را کامل کرد. Validator صفر Finding یافت و READY_FOR_AUTOMATION_REVIEW داد.

این وضعیت عمداً PASS محصول نیست. Validator فقط کامل‌بودن روابط ساختاری همان Rule set را سنجید؛ حقیقت یا کفایت Oracle/Evidence، کفایت Coverage، نبود باگ، کیفیت محصول، ROI و تصمیم Release را ارزیابی نکرد.

دامنهٔ آزمایشگاه Checkout فارسی و ایرانی

سناریوی آموزشی یک Checkout کاملاً جدا از شبکه با Order، PaymentAttempt، PSP Stub جعلی، Callback، Ledger Stub و Reconciliation مصنوعی است. Failure modeها شامل timeout قبل/بعد از fake commit، Callback تکراری، دیررس و جابه‌جا، retry و جداسازی Tenant هستند. همهٔ IDها، مبالغ و رویدادها ساختگی‌اند.

موضوعقرارداد آزمایشگاهیClaim limit
پولمقدار canonical ساختگی بر حسب IRR؛ نمایش تومان فقط با برچسب و conversion ruleهیچ ادعای مالی/بانکی/مالیاتی ایران
رقم و متنارقام فارسی/عربی/لاتین، Unicode normalization و RTL/LTR با ID لاتین پایدارنه پوشش کامل locale
زمانISO instant در UTC؛ View در Asia/Tehran؛ جلالی فقط presentationنه قانون حقوقی یا تسویه
هویتTenant/Order/Attempt/Event/Ledger/Run/Build/Evidence جداهیچ مشتری یا تراکنش واقعی

هیچ نام، موبایل، ایمیل، IP، حساب، PAN، CVV2، OTP، Cookie، Token، Credential، Screenshot یا Log واقعی استفاده نمی‌شود. این آزمایش توصیهٔ بانکی، مالی، حقوقی، مالیاتی، امنیتی، حریم خصوصی یا انطباق ایران نیست.

امنیت، حریم خصوصی و Retention در Automation

  • Production data را پیش‌فرض Test data ندانید؛ دادهٔ مصنوعی/حداقل و مجوزدار بسازید.
  • Secret را در Repository، Screenshot، Video، Trace، command line یا گزارش منتشر نکنید.
  • Artifact access را با نقش، Purpose و Audit trail محدود کنید.
  • Retention را بر اساس نیاز Review و حساسیت تعیین کنید؛ «برای همیشه» Policy نیست.
  • Dependency و package را pin، scan و با provenance نگهداری کنید؛ خودکاربودن زنجیرهٔ تأمین را امن نمی‌کند.
  • Cleanup فقط Namespace همان Run را هدف بگیرد و destructive command گسترده نداشته باشد.

Automation و AI: تولید کد با پذیرش Claim یکی نیست

AI می‌تواند Draft Test data، Scenario، Assertion، Selector، Refactor یا Failure summary پیشنهاد کند. ولی Source، Prompt/model/version، ورودی، Diff، Reviewer و نتیجهٔ Validator باید ثبت شوند. کد تولیدشده ممکن است API خیالی، Assertion ضعیف، Secret leak، Test tautology یا License risk داشته باشد.

AI نباید مستقل Oracle را حقیقت اعلام کند، Evidence را جعل/تکمیل کند، Failure را بدون Provenance به Defect نسبت دهد، Quarantine را نامحدود کند یا Release را تصویب نماید. Gateهای deterministic و Review انسانی متناسب با Risk باقی می‌مانند.

متریک‌های مفید با Countermetric

Measureتعریف لازمCountermetric/خطر بازی
Feedback timeاز Trigger تا Evidence قابل مصرف برای Population ثابتFalse-result و queue cost
First-attempt reliabilityPASS/FAIL معتبر در Attempt اول بر eligible runsSKIPPED/ERROR/Quarantine
False-result rateFalse Pass/Fail تأییدشده با denominatorزمان و روش تأیید
Evidence freshnessEvidence معتبر در SLA برای Subject درستهزینهٔ اجرا و Storage
Maintenance loadBuild/review/triage/fix minutes per Check یا RiskSignal مصرف‌شده و ریسک حذف
Quarantine ageسن Checkهای خارج Gate با PolicyRisk بدون Control جایگزین
Decision consumptionچند Claim واقعاً در تصمیم نام‌دار استفاده شدنپاداش‌دادن به حذف آزمایش ضروری
Retire benefitهزینه حذف‌شده در برابر Signal/ریسک از دست‌رفتهRegression escape و Unknown

برای رتبه‌بندی فرد یا تیم از Test count، pass rate، coverage یا bug count استفاده نکنید؛ این کار رفتار اندازه‌گیری را منحرف می‌کند. Metric باید به بهبود System کمک کند، نه مسابقهٔ تولید Check.

Pilot سی‌روزه برای قرارداد یک Check

بازهکارخروجی/گیت
روز ۱–۵یک Decision و Risk، Check مصرف‌شده و Baseline را انتخاب کنیدQuestion/Claim/Claim limit پذیرفته‌شده
روز ۶–۱۰Subject/State/Data/Oracle/Runner/Evidence contract را کامل کنیدDry-run و Review تناقض‌ها
روز ۱۱–۱۵تنها، random-order، parallel و fault-injection اجرا کنیدIsolation/Failure-mode report
روز ۱۶–۲۰Retry، Result vocabulary، Manifest و Correction را آزمایش کنیدهمهٔ Attemptها قابل ردیابی
روز ۲۱–۲۵Cost/Value/Guardrail و مصرف تصمیم را اندازه بگیریدBaseline delta با limitation
روز ۲۶–۳۰KEEP/ADAPT/QUARANTINE/RETIRE و گسترش/توقف را Review کنیدDecision record، owner و reviewDue

Pilot موفق یعنی تیم می‌تواند Claim محدود را با Evidence معتبر و هزینهٔ معلوم Review کند؛ نه اینکه Demo سبز، تعداد Script یا Vendor feature زیاد شده باشد.

۲۸ ضدالگو در اتوماسیون تست

  • Automate everything؛ هدف تعداد Check یا Coverage خام؛ سبز=بدون باگ؛ Automation=Quality.
  • جایگزینی کامل انسان؛ تقسیم ثابت Manual/Automated؛ QA-only ownership؛ یک ابزار برای همه.
  • latest/main/nightly به‌جای Commit/Build؛ Environment بدون Config؛ Test Basis بی‌نسخه.
  • Question کلی؛ Claim بدون limit؛ Oracle از خود SUT؛ Approval یا Screenshot به‌جای Oracle.
  • Data مشترک؛ وابستگی به ترتیب؛ Sleep ثابت؛ Cleanup نامحدود؛ Parallel بدون Partition.
  • Retry-until-green؛ نمایش فقط آخرین Attempt؛ ERROR/SKIPPED در PASS؛ Color-only dashboard.
  • Flaky بدون series کنترل‌شده؛ Quarantine بی‌Expiry؛ حذف از Denominator؛ Re-entry بی‌Evidence.
  • Log/Trace بدون Subject/Build/Attempt؛ Artifact بدون retention؛ Secret و PII در گزارش.
  • Page Object/OOP/Programming اجباری؛ Codeless=بن‌بست؛ Recorder demo=production readiness.
  • هر Check روی هر Commit؛ ROI تضمینی؛ ضریب هزینهٔ ثابت؛ صرفه‌جویی بدون Counterfactual.
  • عدم Review ارزش؛ Suite فقط افزایشی؛ حذف بی‌Retirement؛ اصلاح Outcome بی‌Correction.
  • AI-generated=صحیح؛ Summary بدون Provenance؛ پذیرش خودکار Risk یا Release.

چک‌لیست ممیزی Automated Check

  • Product/Goal/Risk/Basis/Repository/Commit/Build/Pipeline پین شده‌اند.
  • Check ID و version یکتا و supersedes قابل پیگیری است.
  • Question، bounded Claim و Claim limit نوشته شده‌اند.
  • Subject و Trigger تغییرناپذیرند.
  • Precondition، State، Data، Seed، Partition و Cleanup معلوم‌اند.
  • Oracle دارای Source، Rule، tolerance/window و method مستقل است.
  • Implementation، Runner، Environment و Dependency نسخه‌دارند.
  • تنها/ترتیب تصادفی/Parallel و Failure injection متناسب آزموده شده‌اند.
  • PASS/FAIL/ERROR/SKIPPED/INCONCLUSIVE و Unknown policy روشن‌اند.
  • همهٔ Retry Attemptها حفظ و First failure پنهان نشده است.
  • Flaky/False Pass/False Fail تعریف و Population دارند.
  • Quarantine دارای Reason، Risk impact، owner، expiry، replacement و re-entry است.
  • Manifest، raw refs، time، digest، freshness، retention و redaction کامل‌اند.
  • Owner capability، Triage SLA، Decision authority و reviewDue مشخص‌اند.
  • Cost baseline، Value hypothesis، Measure و Guardrail وجود دارند.
  • KEEP/ADAPT/QUARANTINE/RETIRE با Evidence تصمیم‌گیری می‌شود.
  • Correction/Supersession و Retirement record تعریف شده‌اند.
  • هیچ ادعای نبود باگ، Coverage کافی، Quality، ROI یا Release از PASS نتیجه نشده است.

جمع‌بندی: از اسکریپت سبز تا ادعای محدود

واقع‌گرایی دربارهٔ اتوماسیون یعنی کم‌ارزش دانستن آن نیست؛ یعنی دقیق‌کردن ارزش آن است. Automated Check خوب سؤال محدود دارد، Subject و Build را پین می‌کند، State/Data را کنترل می‌کند، Oracle قابل نقد دارد، همهٔ Attemptها و Evidence را حفظ می‌کند و هزینه/Signal آن بازبینی می‌شود. سبزشدن فقط یک Observation است؛ Claim معتبر از Contract و Review می‌آید.

با یک Check مصرف‌شده در یک Decision واقعی شروع کنید. اگر نمی‌توانید بگویید «چه چیزی را می‌پرسد، چه چیزی را نمی‌گوید و چه زمانی باید بازنشسته شود»، افزودن Check بعدی فقط ابهام را سریع‌تر اجرا می‌کند.

سوالات متداول اتوماسیون تست

آیا اتوماسیون تست می‌تواند جای تست دستی را بگیرد؟

نه به‌صورت کلی. یک Check محدود می‌تواند اجرای تکراری و مقایسهٔ تعریف‌شده را ماشینی کند، اما انتخاب Risk، نقد Oracle، اکتشاف، تفسیر Unknown و تصمیم همچنان به قابلیت انسانی و سازمانی نیاز دارد. ترکیب دقیق بر اساس سؤال و Context تعیین می‌شود.

اگر همه تست‌های خودکار سبز باشند، آیا محصول آماده انتشار است؟

خیر. PASS فقط سازگاری Observation با Oracle همان Check/Attempt را بیان می‌کند. Release به Coverage model، Risk، Evidenceهای دیگر، Defect/Unknown، Policy و اختیار تصمیم نیاز دارد؛ Check سبز نه نبود باگ را ثابت می‌کند و نه مجوز انتشار است.

Flaky Test را فوراً حذف کنیم یا Retry بدهیم؟

هیچ‌کدام به‌صورت خودکار. ابتدا با series کنترل‌شده Variation را نشان دهید و همهٔ Attemptها را نگه دارید. سپس Cause/Risk را Triage کنید؛ اگر Signal موقتاً نامعتبر است، Quarantine زمان‌دار با Owner، Control جایگزین و Re-entry rule بسازید. Retry نباید Failure اول را پنهان کند.

آیا برای اتوماسیون تست حتماً باید برنامه‌نویس حرفه‌ای بود؟

نیاز فنی به Interface، Tool و Complexity بستگی دارد. مهم‌تر از عنوان «برنامه‌نویس» توانایی تعریف Claim/Oracle، کنترل State/Data، ساخت Comparison، بررسی Failure و نگهداشت امن است. بعضی مسائل کدنویسی عمیق می‌خواهند و برخی با Model، Low-code یا ابزار تخصصی حل می‌شوند.

موفقیت اتوماسیون تست را با چه KPI بسنجیم؟

یک KPI جهانی وجود ندارد. برای Decision/Risk مشخص می‌توان Feedback time، First-attempt reliability، False-result rate، Evidence freshness، Maintenance load، Quarantine age و Decision consumption را با Population و Countermetric سنجید. Test count، Pass rate و Coverage خام را برای رتبه‌بندی تیم استفاده نکنید.

دیدگاهتان را بنویسید