در یک تست یکپارچه‌سازی، هر شش پیام سفارش بدون خطای HTTP تحویل می‌شوند، صف خالی است و داشبورد سبز می‌ماند؛ اما سامانه دو بیمار هم‌نام را یک نفر فرض می‌کند و یک نسخه قدیمی، سفارشی را که قبلاً متوقف شده دوباره Active نشان می‌دهد. این سناریوی ساختگی نشان می‌دهد تست نرم‌افزار سلامت با «API پاسخ داد» یا «صف پیام خالی شد» تمام نمی‌شود. شواهد باید نشان دهند اطلاعات درست، برای بیمار و Encounter درست، در مرحله درست Workflow و با نسخه و معنای درست نمایش و پردازش شده است.

این راهنما برای QA، توسعه، تحلیل کسب‌وکار، تیم محصول، عملیات و متخصصان دامنه نوشته شده است. از تعیین Intended Use و مرز سامانه شروع می‌کنیم؛ سپس Hazard، Clinical Workflow، هویت بیمار، سفارش و نتیجه، FHIR/HL7، DICOM، Terminology، کاربردپذیری، Downtime، بازیابی، Release Gate و Evidence Pack را به یک برنامه قابل اجرا وصل می‌کنیم.

مرز ایمنی و مقررات: این مقاله آموزش تست نرم‌افزار است، نه توصیه پزشکی، حقوقی یا مقرراتی. QA با تست، برای Scope و Build مشخص شواهد تولید می‌کند؛ ایمنی بیمار، اثربخشی بالینی یا انطباق سازمان را تضمین و گواهی نمی‌کند. طبقه‌بندی محصول، حوزه قضایی، Intended Use، الزامات قانونی، استاندارد لازم، پذیرش ریسک و تصمیم بالینی باید توسط صاحبان صلاحیت همان سازمان تعیین و نسخه‌دار شوند.

خلاصه عملی تست نرم‌افزار سلامت

پرسششاهد ضعیفشاهد مفیدتر
آیا Interface کار می‌کند؟همه پیام‌ها HTTP ۲۰۰ گرفتندپیام، هویت، نسخه، Terminology و Transition صحیح را در مقصد ایجاد کرد و Reconciliation اختلافی ندارد
آیا Workflow امن‌تر است؟Happy Path سبز استHazardهای مصوب به Requirement، Control، Test و Residual Risk قابل‌ردگیری‌اند
آیا سامانه FHIR است؟JSON parse می‌شودنسخه، Profile/IG، Cardinality، Binding، Reference، Authorization و رفتار End-to-End آزموده شده‌اند
آیا DICOM سازگار است؟یک تصویر باز شدConformance Statement دو طرف، SOP/Role/Transfer Syntax و Workflow واقعی با داده آزمون تطبیق یافته‌اند
آیا Release آماده است؟Pass rate بالا استCritical Hazardها پوشش دارند، Unknown و Defect باز روشن‌اند، Downtime/Rollback آزموده و تصمیم امضاشده است

اول Scope را تعیین کنید: هر نرم‌افزار سلامت یک چیز نیست

عبارت Health IT می‌تواند پرونده الکترونیکی، HIS، پذیرش، نوبت‌دهی، نسخه و سفارش، آزمایشگاه، تصویربرداری، Telemedicine، صورتحساب، داشبورد مدیریتی، پژوهش، ابزار بیمار یا یک کارکرد نرم‌افزاری در وسیله پزشکی را پوشش دهد. پیامد Failure، Oracle، نقش متخصص بالینی و مسیر مقرراتی این محصولات یکسان نیست.

نوع کارکردپرسش Scopeتمرکز نمونه تستمالک تصمیم
اداری/مالیآیا خروجی مستقیماً در تصمیم یا مراقبت بالینی استفاده می‌شود؟هویت، مبلغ، پوشش، صف، دسترسی و Auditمحصول، عملیات، مالی و حقوقی
EHR/HIS و Workflow بالینیکدام نقش در چه زمان به کدام داده تکیه می‌کند؟Patient context، سفارش، نتیجه، هشدار، handoff و downtimeClinical safety، مالک فرایند و محصول
Device Software Functionآیا کارکرد طبق قانون حوزه هدف، Device محسوب می‌شود؟Intended Use، Hazard، V&V، Traceability و مستندات مقررRegulatory، Quality و مهندسی دامنه
پژوهش/آموزشآیا خروجی با برچسب مناسب از مسیر مراقبت جدا است؟جداسازی محیط، provenance، دسترسی و منع استفاده ناخواستهپژوهش، اخلاق، حقوقی و داده
Wellness/ConsumerClaim واقعی محصول چیست و کاربر چگونه آن را تفسیر می‌کند؟Claim، داده ورودی، محدودیت، UI و escalationمحصول، پزشکی، حقوقی و Regulatory

راهنمای ۲۰۲۳ FDA درباره محتوای Premarket برای Device Software Functions صریحاً به کارکردهایی مربوط است که تعریف Device را برآورده می‌کنند و برای مستندات از رویکرد مبتنی بر ریسک استفاده می‌کند. آن را نباید خودکار به هر اپ سلامت، هر کشور یا هر نرم‌افزار اداری تعمیم داد. تیم باید Applicability Matrix داشته باشد، نه فهرستی از نام استانداردها.

تست چه چیزی را اثبات می‌کند و چه چیزی را نه؟

یک Test Run معتبر می‌تواند بگوید: «در Build، Config، داده، نقش، دستگاه، زمان و محیط ثبت‌شده، رفتار مشاهده‌شده با Oracle نسخه X مطابق بود.» همین گزاره نیز محدودیت دارد: مسیرهای اجرا‌نشده، خطای مدل، داده واقعی متفاوت، تغییر Configuration، رفتار کاربر و Failureهای مرکب ممکن است باقی بمانند.

  • Pass شدن تست، ایمنی بیمار یا اثربخشی بالینی را تضمین نمی‌کند.
  • نبود Defect گزارش‌شده، نبود Hazard یا Risk نیست.
  • Conformance فنی، به‌تنهایی Interoperability معنایی و Workflow صحیح را ثابت نمی‌کند.
  • اسکن امنیتی، انطباق Privacy یا صلاحیت استفاده بالینی را گواهی نمی‌کند.
  • تأیید متخصص دامنه جای Verification نرم‌افزار را نمی‌گیرد و برعکس.
  • Release Gate یک تصمیم سازمانی مبتنی بر Evidence و Residual Risk است، نه خروجی خودکار درصد Pass.

برای تبدیل مقرره یا استاندارد نسخه‌دار به Testable Requirement، از راهنمای تست انطباق استفاده کنید. این مقاله بر Workflow سلامت و Safety Evidence تمرکز دارد، نه تفسیر حقوقی چارچوب‌ها.

مدل Assurance: از Claim تا شواهد و ریسک باقی‌مانده

به‌جای شروع از Test Case، زنجیره Assurance را بسازید. Claim باید محدود، قابل رد و متعلق به یک Scope باشد. برای مثال «کاربر مجاز در Workflow W می‌تواند نتیجه تأییدشده بیمار P را با منبع و زمان درست ببیند» بسیار آزمون‌پذیرتر از «سامانه نتایج را امن نشان می‌دهد» است.

Intended Use / Context
        ↓
Hazard → Safety Requirement → Control
        ↓                    ↓
Verification + Validation + Human/Clinical Review
        ↓
Evidence + Limitation + Open Defect + Unknown
        ↓
Residual Risk → Authorized Release Decision → Production Monitoring
جزءپرسش کنترلنمونه Artifact
Claimدقیقاً چه رفتار یا ویژگی ادعا می‌شود؟Claim ID، Scope، Actor، Outcome، Exclusion
Hazardچه منبع بالقوه آسیبی وجود دارد؟Hazard log و Scenario
Controlریسک چگونه حذف، کاهش یا آشکار می‌شود؟Design control، alert، reconciliation، training
Evidenceکدام شاهد نشان می‌دهد Control در Scope کار کرده؟Review، unit، integration، simulation، usability run
Limitationشاهد چه چیزی را پوشش نمی‌دهد؟Excluded cohort، device، workflow، uncertainty
Decisionچه کسی با کدام ریسک باقی‌مانده تصمیم می‌گیرد؟Release memo و approval

Intended Use و System Context را نسخه‌دار کنید

یک تغییر کوچک متن، Feature Flag یا Mapping می‌تواند Intended Use عملی را تغییر دهد. بنابراین هر Run باید نه فقط Commit، بلکه نسخه Claim، Config، Terminology، Rule library و Interface contract را ثبت کند.

Health IT Context Contract
Product/Function:       [نام و نسخه]
Intended user:          [نقش، آموزش و مجوز]
Intended use:           [کار و تصمیم مورد پشتیبانی]
Patient/population:     [دامنه مصوب]
Care setting:           [کلینیک/بیمارستان/خانه/...]
Workflow boundary:      [شروع، پایان، handoff]
Inputs/sources:         [مالک و provenance]
Outputs/consumers:      [انسان/سیستم و اقدام ممکن]
Excluded use:           [موارد منع یا خارج Scope]
Failure consequences:  [برای چه کسی و چگونه]
Jurisdiction/class:     [تصمیم Regulatory نسخه‌دار]
Build/config/data:      [شناسه‌های immutable]
Decision owners:        [Clinical/Product/Quality/Regulatory]

Clinical Workflow را پیش از UI مدل کنید

صفحه Login→Form→Submit برای Health IT مدل کافی نیست. مسیر واقعی می‌تواند از پذیرش و شناسایی بیمار به Encounter، سفارش، جمع‌آوری نمونه، انجام، تأیید، مشاهده، اطلاع‌رسانی، اقدام و Follow-up برسد. هر مرحله Actor، پیش‌شرط، deadline، handoff، منبع حقیقت و حالت استثنا دارد.

مرحلهActorشناسه‌های حیاتیFailure نمونهEvidence نمونه
ثبت/پذیرشپذیرش یا بیمارPatient، encounterDuplicate یا Merge اشتباهMatching/Unmerge و audit
سفارشکاربر مجازPatient، encounter، orderسفارش در Context بیمار دیگرContext banner، authorization و state test
انجام/نمونهبخش اجراOrder، specimen، deviceبرچسب یا association اشتباهBarcode/synthetic identity chain
نتیجه/تأییدنقش تأییدکنندهResult، version، provenanceDraft به‌عنوان FinalState/role/version assertions
مشاهده/پیگیریتیم مراقبت یا بیمارResult، recipient، messageنتیجه دیده نشود یا برای فرد غلط ارسال شودDelivery≠review؛ acknowledgment/escalation
Downtime/بازگشتهمه نقش‌های در ScopeOffline record، reconciliation IDدوباره‌کاری یا از دست‌رفتن اقدامRestore و reconciliation rehearsal

راهنماهای SAFER سال ۲۰۲۵ دفتر ONC نیز ایمنی EHR را فقط مسئله نرم‌افزار نمی‌بینند: مدیریت سیستم، برنامه‌ریزی قطعی، شناسایی بیمار، سفارش و پشتیبانی تصمیم، گزارش نتیجه و ارتباط تیم درمان هر کدام فرایند و مسئولیت سازمانی دارند. این راهنماها برای Self-assessment هستند و جای مقررات یا روش مصوب محصول شما را نمی‌گیرند.

از Hazard به Scenario قابل تست برسید

Hazard را با Defect یکی نگیرید. Defect علت یا شرایطی در پیاده‌سازی است؛ Hazard منبع بالقوه آسیب است؛ Hazardous Situation شرایط مواجهه با آن و Harm پیامد واقعی یا بالقوه برای فرد است. روش دقیق باید با استاندارد و فرایند مصوب دامنه هماهنگ شود، اما QA برای طراحی تست به زنجیره علت و Control نیاز دارد.

Hazard Scenario
ID: H-___
Context/actor: [کجا و چه کسی]
Sequence:      [رخدادها و وابستگی‌ها]
Hazard:        [منبع بالقوه آسیب]
Situation:     [شرایط مواجهه]
Possible harm: [بدون ادعای احتمال پزشکی]
Control(s):    [طراحی/آشکارسازی/فرایند]
Test oracle:   [رفتار قابل مشاهده]
Evidence:      [روش، داده، محیط]
Residual risk: [مالک، تصمیم و بازبینی]

تست مبتنی بر ریسک برای اولویت‌بندی مفید است، به‌شرط آنکه ماتریس رنگی جای تحلیل تخصصی را نگیرد. راهنمای RBT تفاوت Product Risk، Project Risk و Residual Risk و نحوه نگاشت آن‌ها به Evidence را توضیح می‌دهد.

Clinical Claim و Test Oracle را جدا کنید

QA نباید محتوای پزشکی را از اینترنت یا تجربه شخصی به Expected Result تبدیل کند. «این هشدار باید نمایش داده شود» تنها وقتی Oracle معتبر است که Rule، نسخه، شرایط، منبع، Owner و Approval آن مشخص باشد. نرم‌افزار می‌تواند Rule تأییدشده را درست اجرا کند، در حالی که اعتبار بالینی خود Rule پرسشی جدا برای متخصص و فرایند مربوط است.

لایه Oracleنمونه پرسشمالک معمول
محاسبات نرم‌افزاربرای Fixture مصوب، خروجی دقیق و واحد چیست؟مهندسی + QA
Rule/Contentکدام Rule set و نسخه باید اعمال شود؟Clinical content owner
Workflowچه کسی، در چه مرحله و با چه acknowledgment اقدام می‌کند؟مالک فرایند بالینی
Human factorsکاربر هدف پیام را می‌بیند، می‌فهمد و اقدام مورد انتظار را انجام می‌دهد؟Human factors/UX + نقش هدف
Regulatory claimآیا Claim و Evidence در Scope مجاز و کافی‌اند؟Regulatory/Quality

Traceability را دوطرفه و تغییرپذیر بسازید

Traceability فقط جدول Requirement→Test نیست. باید بتوان از Hazard به Control و Evidence رفت و از هر تست نیز فهمید کدام Claim یا Risk را پوشش می‌دهد. مسیر معکوس Test→Requirement مانع Testهای یتیم و مسیر Hazard→Evidence مانع Riskهای بدون شاهد می‌شود.

Hazard IDRequirement/ControlEvidence methodBuild/Dataنتیجهمحدودیت/ریسک باقی‌مانده
H-ID-01نمایش Patient context ثابت هنگام سفارشScenario + observationB42/SYN-07Passتبلت قدیمی اجرا نشده
H-ORD-02نسخه قدیمی state را عقب نبردDuplicate/reorder injectionB42/ORD-v1PassVendor Z خارج Scope
H-DOWN-03رکوردهای Offline reconcile شوندDowntime rehearsalB42/DR-03Blockedریسک نامعلوم؛ Gate باز نمی‌شود

وقتی Requirement، Rule library یا Interface Profile تغییر می‌کند، Impact analysis باید Testها، Migration، Documentation، Training، Monitoring و Rollback مرتبط را پیدا کند. «کد این Component تغییر نکرده» دلیل کافی برای حذف Regression نیست.

هویت بیمار، Encounter و Context را یک رشته نام نبینید

نام نمایشی، شماره تلفن یا شماره تخت کلید هویت نیست. Patient، Encounter، Order، Specimen، Result، Practitioner، Location و Device شناسه و چرخه عمر مستقل دارند. Test data باید Collision، Merge/Unmerge، Alias، تغییر مشخصات، ثبت تکراری، نوزاد یا فرد بدون شناسه معمول، انتقال بخش و چند Encounter هم‌زمان را متناسب با Scope پوشش دهد.

  • Patient banner در همه صفحات و Modalهای تصمیم‌ساز ثابت و قابل تمایز است.
  • بازکردن Tab دوم یا Back/Forward، Context پنهانی را عوض نمی‌کند.
  • Session timeout و Re-authentication، Draft را به بیمار دیگری وصل نمی‌کند.
  • Search fuzzy، دو فرد با نام یا تاریخ مشابه را خودکار Merge نمی‌کند.
  • Merge و Unmerge، History، Audit، order/result link و downstreamها را سازگار نگه می‌دارند.
  • Print، Export، Notification و Cache نیز همان Patient/Encounter را حفظ می‌کنند.
  • ورود فارسی، عربی و لاتین، «ی/ی»، «ک/ک»، فاصله و نیم‌فاصله باعث Collision خاموش نمی‌شود.

آزمون باید هم False Match و هم Missed Match را ببیند. بهینه‌سازی یک معیار می‌تواند دیگری را بدتر کند؛ Threshold یا الگوریتم matching را QA به‌تنهایی تعیین نمی‌کند و نتیجه روی داده مصنوعی، عملکرد در جمعیت واقعی را ثابت نمی‌کند.

سفارش، وضعیت و Clinical Decision Support را State Machine کنید

سفارش یک ردیف CRUD نیست. Draft، Signed، Active، On-hold، Modified، Discontinued، Completed، Corrected و Entered-in-error ممکن است معنا و transitionهای مجاز متفاوت داشته باشند. نام و تعداد Stateها باید از Contract محصول بیاید؛ مثال زیر نسخه عمومی یا پزشکی نیست.

Order State Contract
Entity key:       patientId + encounterId + orderId
Version rule:     only greater version changes current state
Duplicate rule:   same entity + version = no-op + audit
Late rule:        lower version = historical, never current
Actor/role:       permitted transitions per approved matrix
Reason:           required for selected transitions
Downstream:       event, acknowledgment and reconciliation
Display:          current state + source + time + author
Failure handling: retry without duplicate effect; quarantine on ambiguity

برای Alert یا CDS، فقط ظاهرشدن Popup را تست نکنید. eligibility، داده ناقص، زمان Rule، duplicate suppression، severity مصوب، override reason، attribution، audit، silent failure، unavailable dependency و update/rollback کتابخانه Rule را بسنجید. نرخ Override به‌تنهایی اثبات «هشدار بد» یا «کاربر بی‌دقت» نیست؛ Context و مطالعه انسانی لازم است.

نتیجه، نسخه، Provenance و Follow-up را End-to-End بسنجید

وجود Result در Database کافی نیست. Draft نباید Final دیده شود؛ Correction باید نسخه قبلی را قابل‌ردگیری کند؛ منبع، زمان، واحد، محدوده یا flag مصوب باید با نسخه داده همراه باشند؛ گیرنده درست باید به نسخه درست دسترسی داشته باشد؛ و اگر Workflow نیازمند acknowledgment یا escalation است، صرف ارسال Notification پایان کار نیست.

ScenarioتزریقInvariant
نتیجه دیررسResult بعد از بسته‌شدن Encounter می‌رسدبه Patient/Order صحیح متصل و وارد مسیر Follow-up می‌شود
Correctionنسخه Final اصلاح می‌شودنسخه جدید Current، قبلی Historical و دریافت‌کنندگان لازم مطلع‌اند
Duplicateپیام مشابه دوباره می‌رسداثر کسب‌وکاری تکرار نمی‌شود؛ دریافت Audit می‌شود
Partial outageNotification unavailable استResult گم یا Completed کاذب نمی‌شود؛ retry/escalation مشاهده‌پذیر است
Unauthorized viewنقش خارج Scope URL مستقیم را باز می‌کندAccess در server رد و رویداد مناسب ثبت می‌شود

Integration Testing در سلامت: انتقال، معنا و Workflow سه لایه‌اند

Interface ممکن است از نظر Transport سالم، از نظر Schema معتبر و از نظر بالینی یا Workflow اشتباه باشد. برنامه تست باید این لایه‌ها را جدا گزارش کند تا «HL7 passed» یا «DICOM supported» به Claim مبهم تبدیل نشود.

لایهپرسشFailure نمونه
Transportپیام رسید، retry و acknowledgment درست بود؟Timeout-after-commit باعث ارسال تکراری می‌شود
Syntax/Schemaساختار با نسخه و Profile سازگار است؟Cardinality یا نوع مقدار غلط است
TerminologySystem/code/version/display و ValueSet درست‌اند؟کد محلی به معنای دیگری Map می‌شود
Identity/ReferencePatient، encounter، order و result به موجودیت درست اشاره می‌کنند؟Reference معتبر ولی مربوط به فرد دیگر است
WorkflowTransition، Actor و deadline درست‌اند؟پیام قدیمی State را عقب می‌برد
Human useاطلاعات لازم در زمان و Context مناسب قابل فهم است؟کاربر نسخه اصلاح‌شده را از قبلی تشخیص نمی‌دهد

برای الگوهای Contract، Component و End-to-End، راهنمای تست یکپارچه‌سازی را ببینید؛ در Health IT باید آن الگوها را با Hazard و Workflow دامنه ترکیب کرد.

تست FHIR: Valid Resource پایان آزمون نیست

FHIR پایه‌ای برای تبادل است، اما Implementation Guide، Profile، CapabilityStatement، Terminology و قرارداد شرکای تبادل تعیین می‌کنند چه چیزی در Context شما لازم است. نسخه FHIR و Packageهای IG را pin کنید؛ Validation با Latest شناور، نتیجه امروز را فردا غیرقابل تکرار می‌کند.

  • JSON/XML parse و نوع Resource؛
  • Cardinality، invariant، slicing و fixed/pattern value؛
  • Profile و package version دقیق؛
  • Terminology binding با code system/value set/version؛
  • Reference resolution، contained resource و identifier semantics؛
  • Capability و interactionهای واقعی client/server؛
  • Search parameter، pagination، history، conditional operation و concurrency در Scope؛
  • Authorization، compartment، consent/policy و audit جدا از structural validation؛
  • Business rule، duplicate، patient matching و workflow end-to-end؛
  • Negative test برای malformed، unsupported، ambiguous و partial data.

صفحه رسمی FHIR Validation هشدار می‌دهد روش‌های اعتبارسنجی فقط جنبه‌های محاسبه‌پذیر Conformance را می‌سنجند؛ Business Ruleها و قواعد روایی یا انسانی می‌توانند بیرون آن بمانند و Static validation برای اثبات Conformance کامل کافی نیست. پس یک Resource سبز در Validator، هویت درست، مجوز درست یا Workflow درست را تضمین نمی‌کند.

FHIR Test Manifest
FHIR version:        [مثلاً R4، دقیق و pin شده]
IG/package/version:  [canonical + package hash]
Profile(s):          [canonical URLs]
Terminology server:  [version/config/snapshot]
Capability claim:    [client/server statement]
Fixture provenance:  [synthetic generator + seed]
Operations:          [create/read/search/update/...]
Business invariants: [identity/state/authorization]
Negative cases:      [unsupported/ambiguous/stale]
Validator output:    [artifact + warnings policy]
End-to-end evidence: 

HL7 v2 و پیام‌های رویدادی: ACK را با Outcome یکی نگیرید

در Interfaceهای پیام‌محور، ACK ممکن است تنها دریافت یا پذیرش اولیه را نشان دهد. برای هر Interface تعریف کنید ACK در کدام لایه صادر می‌شود، خطای parsing یا business validation چگونه بازمی‌گردد، retry چه کلیدی دارد، ترتیب چگونه مدیریت می‌شود و Reconciliation مستقل چگونه اختلاف مبدأ و مقصد را پیدا می‌کند.

حالتتزریقرفتار مورد انتظار قراردادی
Duplicateهمان message/event دوبارهNo-op یا نتیجه idempotent، با audit
Out of orderنسخه ۲ پیش از ۱Current state عقب نرود
Timeout after commitمقصد ثبت کرده، پاسخ گم شدهRetry اثر دوم نسازد
Poison messageداده ساختاری معتبر اما معنایی نامعتبرQuarantine، alert، no silent drop
Partial mappingکد جدید در مقصد ناشناختهFail/hold صریح؛ default معنایی پنهان ممنوع
Clock skewساعت دو سیستم متفاوتترتیب به timestamp نامطمئن وابسته نباشد

تست DICOM: Conformance Statement نقطه شروع است

DICOM فقط «فایل تصویر» نیست. بسته به Workflow، SOP Class و نقش SCU/SCP، Transfer Syntax، Association، UID، metadata، worklist، storage commitment، query/retrieve، viewer behavior، display و ارتباط با Patient/Study/Series باید بررسی شوند. Scope را از Real-World Activity و Conformance Statement محصولات واقعی بگیرید.

بخش جاری DICOM PS3.۲ درباره Conformance می‌گوید Standard روش آزمون/اعتبارسنجی Implementation یا تطابق آن با Conformance Statement را تعیین نمی‌کند. قالب رسمی نیز یادآوری می‌کند DICOM به‌تنهایی Interoperability را تضمین نمی‌کند و مقایسه Statementها باید با اعتبارسنجی تجهیزات مشخص تکمیل شود.

ناحیهنمونه بررسیشاهد لازم
NegotiationAE، Role، SOP، Transfer Syntax و failure statusNetwork trace + طرفین نسخه‌دار
IdentityPatient/Study/Series/SOP Instance UID و mergeFixture chain + destination query
MetadataRequired/conditional attributes، charset، timezoneDataset validation + viewer display
Pixel/displayorientation، windowing، grayscale/color و annotation در Scopeمرجع مصوب و review تخصصی؛ نه screenshot حدسی
Workflowworklist، acquisition، store، commitment، report linkEnd-to-end rehearsal
Failureقطع، retry، storage full، duplicate، partial seriesrecovery/reconciliation evidence

Terminology، واحد و زمان را داده نمایشی فرض نکنید

Code بدون System و Version می‌تواند مبهم باشد؛ Display متن مرجع معنا نیست؛ تبدیل واحد بدون dimensional rule و precision مصوب خطرناک است؛ و Local time بدون offset و timezone برای ترتیب رخداد کافی نیست. Test fixture باید Code system/version، ValueSet expansion، unit code، magnitude، precision، effective time، authored time، received time و timezone را صریح ثبت کند.

  • کد معتبر اما خارج ValueSet مورد توافق؛
  • کد Deprecated، replacement و نسخه قدیمی Terminology؛
  • System درست با Display ترجمه‌شده یا اشتباه؛
  • عدد بدون واحد، واحد ناشناخته و تفاوت مقیاس؛
  • Decimal separator، رقم فارسی/عربی/لاتین و rounding؛
  • UTC، Asia/Tehran، offset، DST تاریخی و تقویم نمایشی؛
  • Future timestamp، clock skew و رویدادهای هم‌زمان؛
  • عدم دسترسی Terminology service و رفتار fallback.

اگر محصول تاریخ شمسی نشان می‌دهد، مقدار canonical، timezone و قواعد تبدیل باید جدا باشند. نمایش ۱۴۰۵/۰۵/۲۱ نباید provenance زمان UTC یا offset را حذف کند. برای ارقام و متن فارسی نیز Normalize نمایشی را از Identity یا امضای داده جدا کنید.

Data Migration و Reconciliation را به Count محدود نکنید

برابری تعداد ردیف‌ها می‌تواند با Patient association غلط، version loss، code mapping ناقص یا حذف تاریخچه همراه باشد. Migration باید Snapshot و Delta، mapping version، reject/exception، referential integrity، semantic invariant، audit/provenance، rollback و reconciliation پس از Cutover را پوشش دهد.

کنترلمعیار ضعیفمعیار بهتر
CompletenessCount کل برابرCount به تفکیک entity/state/time/slice + exception manifest
Identityنام‌ها وجود دارندStable identifiers و reference graph درست‌اند
Semanticsfieldها پرندCode/unit/version/state طبق mapping مصوب‌اند
HistoryCurrent value درست استنسخه، author، time و correction chain حفظ شده‌اند
CutoverImport successDelta capture، freeze boundary و no double-write gap
RollbackBackup داریمRestore تمرین‌شده و reconciliation پس از برگشت

داده تست: Synthetic اولویت دارد، De-identification ادعا نیست

کپی Production و «حذف نام» راهبرد امن داده تست نیست. داده سلامت می‌تواند از ترکیب سن، زمان، مکان، رخداد نادر، تصویر، free text یا identifierهای جانبی دوباره نسبت داده شود. تعیین اینکه داده واقعاً anonymous، de-identified یا همچنان personal/sensitive است به روش، قانون و Context وابسته است و باید توسط Privacy/Legal تأیید شود.

گزینهمزیتریسک/محدودیتControl
Synthetic deterministicتکرارپذیر و بدون بیمار واقعیتنوع واقعی را کامل مدل نمی‌کندGenerator/seed/version + edge catalog
Hand-authored fixtureOracle روشن برای Hazard خاصکوچک و مستعد confirmation biasPeer review + negative cases
De-identified extractساختار و توزیع واقعی‌ترریسک بازشناسایی و scope creepروش مصوب، حداقل‌سازی، access/expiry/audit
Production dataبیشترین شباهتریسک بسیار بالا و اغلب ناموجهفقط با تصمیم رسمی، ضرورت، safeguards و محیط مجاز
  • هیچ نام، شناسه، تصویر، متن آزاد یا timestamp واقعی را در Ticket و Screenshot نریزید.
  • Fixtureها را به‌وضوح SYNTHETIC و غیرقابل استفاده بالینی علامت بزنید.
  • دامنه، owner، retention، access، export و destruction محیط تست را ثبت کنید.
  • Telemetry و log تست نیز ممکن است داده حساس یا token بسازند.
  • Generator را version و seed را ذخیره کنید تا Failure بازتولید شود.
  • برای rare edgeها از متخصص دامنه سناریو بگیرید، نه داده واقعی.

Privacy و Security شرط لازم‌اند، اما مالکیت جدا دارند

داده درست برای بیمار درست اگر به نقش غیرمجاز نمایش داده شود همچنان Failure است. در مقابل، رمزنگاری کامل نمی‌تواند Patient matching یا State transition غلط را اصلاح کند. برنامه Health IT باید Threat، Privacy harm و Clinical hazard را در یک Context ببیند، اما آن‌ها را به یک checklist مبهم ادغام نکند.

  • Authentication، session، MFA و recovery برای نقش‌های واقعی؛
  • Authorization در server، نه پنهان‌کردن Button؛
  • Break-glass با justification، alert، محدودیت و review؛
  • Least privilege و separation of duties؛
  • Audit با actor، subject، action، time، source و tamper controls؛
  • Encryption/key/secret lifecycle و backup/export؛
  • Tenant/organization isolation و indirect object reference؛
  • Notification، print، clipboard، screenshot، cache و support tools؛
  • Third-party، analytics و crash report data flow؛
  • Incident response با پیوند به continuity و patient-impact assessment.

برای Threat model و آزمون کنترل‌ها، راهنمای تست امنیت نرم‌افزار و برای شمول، data flow، retention و حقوق اشخاص، راهنمای تست حریم خصوصی را به Plan این مقاله پیوند دهید. هیچ‌کدام به‌تنهایی Safety case نیستند.

Usability و Human Factors: درست‌بودن Backend کافی نیست

کاربر ممکن است اطلاعات درست را نبیند، Context را اشتباه تفسیر کند، به‌دلیل تراکم Alert از پیام عبور کند یا در فشار زمان دکمه نزدیک را انتخاب کند. تست باید کاربر هدف، کار واقعی، محیط، interruption، device، workload و consequence را بازنمایی کند. QA یا طراح نمی‌تواند صرفاً نقش پزشک، پرستار، تکنسین یا بیمار را بازی کند و Evidence نماینده تولید کند.

روشپرسشمحدودیت
Expert reviewآیا heuristic یا risk آشکار وجود دارد؟رفتار کاربر هدف را ثابت نمی‌کند
Workflow walkthroughActorها و handoffها کجا می‌شکنند؟محیط واقعی و فشار را کامل بازسازی نمی‌کند
Usability sessionکاربر هدف Task تعریف‌شده را چگونه انجام می‌دهد؟نمونه و سناریو محدود است
Simulationتیم در interruption/failure چگونه هماهنگ می‌شود؟نیازمند facilitation و safety protocol
Telemetryدر Production چه مسیر و خطایی دیده می‌شود؟قصد، فهم و causality را به‌تنهایی نشان نمی‌دهد

راهنمای Usability Testing طراحی Study را پوشش می‌دهد و راهنمای معیارهای کاربردپذیری محدودیت Task Success، زمان و SUS را توضیح می‌دهد. در محصول سلامت، Study باید زیر نظر نقش‌های مناسب و با حفاظت شرکت‌کننده انجام شود؛ امتیاز رضایت به‌تنهایی شاهد ایمنی نیست.

ابهام «Sensitivity Testing» را رفع کنید

Sensitivity Testing در این حوزه می‌تواند دست‌کم چهار معنا داشته باشد: طبقه‌بندی حساسیت داده، حساسیت یک پارامتر در مدل، توان آشکارسازی یک سیستم اندازه‌گیری، یا معیار آماری/تشخیصی مانند sensitivity. این‌ها یک Test Type عمومی نیستند. در Test Plan دقیقاً Characteristic، تعریف، داده مرجع، روش، threshold، confidence و Owner را بنویسید.

  • Data sensitivity: به Privacy classification و کنترل دسترسی مربوط است.
  • Parameter sensitivity: تغییر کنترل‌شده ورودی و اثر بر خروجی مدل/محاسبه است.
  • Analytical sensitivity: به روش، ابزار و مرجع تخصصی همان دامنه نیاز دارد.
  • Clinical sensitivity/specificity: معیار آماری روی Reference و Population تعریف‌شده است و QA عمومی Threshold آن را تعیین نمی‌کند.

عبارت «سامانه بسیار حساس است» Oracle نیست. باید به گزاره‌ای مانند «با Fixture نسخه X و Reference مصوب، metric M با روش A محاسبه و interval/limitation گزارش می‌شود» تبدیل شود. این نتیجه نیز قابلیت تعمیم خارج Population و Protocol را ثابت نمی‌کند.

Performance را با Workload بالینی و Deadline معنا کنید

میانگین Response Time در بار یکنواخت کافی نیست. Workload باید شیفت، batch، burst، بازگشت پس از قطعی، concurrent editing، large study، گزارش‌گیری، backup، interface retry و slow dependency را مدل کند. SLO یا deadline را Owner فرایند و معماری بر اساس Context تعیین می‌کنند؛ QA عدد عمومی اختراع نمی‌کند.

DimensionFixture/WorkloadEvidenceخطر Aggregate
LatencyCritical action به تفکیک role/journeyp50/p95/p99 + tail traceمیانگین tail را پنهان می‌کند
Throughputburst و steady stateaccepted/completed/backlogaccepted مساوی processed نیست
Freshnesssource→destination→screenend-to-end ageAPI سریع با داده stale
Capacitystorage/queue/thread/poolsaturation و headroomCPU پایین با pool exhausted
Degradationdependency slow/downbounded queue، fallback، recoveryretry storm پنهان
Recoverybacklog پس از outagecatch-up time + reconciliationnormal-load test کافی نیست

Downtime را به‌عنوان Workflow جایگزین تست کنید

Downtime فقط صفحه «سرویس در دسترس نیست» نیست. باید معلوم باشد کدام کارها ادامه می‌یابند، چه داده‌ای در دسترس است، رکورد Offline چگونه هویت می‌گیرد، چه کسی اطلاع می‌دهد، تغییر به حالت جایگزین چگونه اعلام می‌شود و پس از بازگشت چه کسی اختلاف‌ها را reconcile می‌کند.

Downtime Exercise Card
Scenario:          [planned/unplanned/partial/cyber]
Unavailable scope: [component/interface/location]
Start signal:      [who declares, how communicated]
Fallback:          [approved workflow and forms]
Identity method:   [patient/encounter/order continuity]
Read-only data:    
Safety limits:     [what must stop or escalate]
Return criteria:   [health + data checks]
Reconciliation:    [owner, key, duplicate/conflict rules]
Exercise evidence: [timeline, observations, gaps, actions]
  • قطع کامل و جزئی، نه فقط خاموشی برنامه اصلی؛
  • وابستگی Identity، Terminology، Notification و چاپ؛
  • Read-only cache با freshness و warning روشن؛
  • ثبت کاغذی/Offline با شناسه قابل reconcile؛
  • رویدادهای ساخته‌شده هم‌زمان در دو مسیر؛
  • بازگشت مرحله‌ای، backlog، duplicate و conflict؛
  • تمرین نقش انسانی، تماس و escalation؛
  • ثبت action و آزمون effectiveness پس از Exercise.

برای طراحی Fault، steady state، recovery و محدودیت Chaos، راهنمای تست تاب‌آوری را ببینید. Fault injection در محیط سلامت بدون Scope، مجوز، Safety boundary و امکان توقف می‌تواند خود خطر ایجاد کند؛ تمرین باید در محیط و زمان مصوب انجام شود.

Backup، Restore و Reconciliation سه کنترل جدا هستند

موفقیت Job پشتیبان‌گیری ثابت نمی‌کند فایل قابل بازیابی، کامل، رمزگشایی‌پذیر یا سازگار با نسخه برنامه است. Restore نیز به‌تنهایی ثابت نمی‌کند داده‌های بین Recovery Point و بازگشت با رکوردهای Offline یا downstreamها reconciled شده‌اند.

مرحلهپرسششاهد
Backupچه داده/config/key و با چه retention ثبت شد؟manifest، checksum، encryption/key access
Restoreدر محیط پاک و نسخه هدف بالا آمد؟timed restore + integrity queries
Application validationWorkflow حیاتی با داده بازیابی‌شده کار می‌کند؟critical smoke + identity/reference checks
Reconciliationgap، duplicate و conflict چگونه حل شدند؟difference report + owner decisions
Returnکدام شرط اجازه بازگشت می‌دهد؟signed readiness + monitoring
LearningActionها واقعاً مؤثر شدند؟owner/due/retest/closure evidence

Configuration و Rule Change را Release مستقل ببینید

بسیاری از تغییرات پراثر بدون Deploy کد رخ می‌دهند: Form، order set، alert، role matrix، unit map، terminology package، interface route، template، Feature Flag یا device configuration. هر تغییر باید Request، rationale، reviewer، version، affected scope، test evidence، effective time و rollback داشته باشد.

Release Identity
Code commit/image digest:  ___
Database schema/migration: ___
Clinical content version:  ___
Terminology/IG package:     ___
Role/permission matrix:     ___
Interface mapping/config:   ___
Feature flags:              ___
Device/client versions:     ___
Synthetic fixture/seed:     ___
Environment checksum:       ___
Evidence pack ID:           ___

Four-eyes review یا approval بدون اجرای Test کافی نیست؛ اجرای Test بدون تأیید محتوا نیز کافی نیست. جداسازی نقش‌ها باید متناسب با ریسک باشد و مسیر Emergency change با expiry، retrospective review و rollback روشن داشته باشد.

Release Gate را بر Hazard و Unknown بنا کنید

Pass rate خام می‌تواند صد تست UI کم‌ریسک را کنار یک Scenario حیاتی Blocked جمع کند. Gate باید به Claim/Hazard ID، Evidence freshness، محیط، Defect، Unknown، mitigation، rollback و monitoring متصل باشد.

وضعیت Evidenceتفسیررفتار Gate نمونه
Passدر Scope و Oracle ثبت‌شده مطابق بودRisk حذف نشده؛ limitation باقی می‌ماند
Failرفتار با Oracle ناسازگار بودContain/fix/retest یا acceptance مجاز
Blockedپیش‌شرط/محیط/داده مانع اجرا شدUnknown؛ به‌عنوان Pass یا Not applicable پنهان نشود
Inconclusiveشاهد یا Oracle برای نتیجه کافی نبودتحقیق/روش بهتر؛ Gate طبق exposure
Not runهیچ شاهد جدید تولید نشدهRisk exposure و دلیل صریح
StaleEvidence به نسخه یا Config قبلی مربوط استImpact analysis و revalidation
Health IT Release Memo
Scope and release identity:     ___
Clinical/operational claims:    ___
Critical hazards and evidence:  ___
Open defects and workarounds:   ___
Blocked/inconclusive/unknown:   ___
Downtime/restore/rollback:      ___
Monitoring and alert owners:    ___
Residual risk and limitations:  ___
Recommendation: Go / Conditional / Hold
Authorized decision and expiry: ___

Production Monitoring باید Claim را ببیند، نه فقط CPU را

Availability سبز می‌تواند با backlog، stale data، mismatch، dropped result یا rule version غلط همراه باشد. برای هر Claim مهم، observable signal، numerator/denominator، freshness، slice، threshold مصوب، owner، runbook و escalation تعریف کنید.

SignalCounter-signalSliceاقدام
پیام acceptedprocessed/reconciled/ageinterface، event type، sitequeue trace و reconciliation
نتیجه ارسال شدdelivered/viewed/follow-up statechannel و workflowretry/escalation طبق Contract
Alert نمایش داده شدeligible/missed/override/unknownrule version و rolecontent/system review
Login successauthorization denial/anomalyrole/site/clientsecurity runbook
Restore job successrestore rehearsal agedataset/siteexercise و action

Metric باید از داده حساس حداقل لازم را نگه دارد. Patient ID، متن بالینی یا payload کامل را برای مشاهده‌پذیری عمومی log نکنید. Correlation ID مصنوعی/کنترل‌شده، hashing با threat review، access محدود و retention مصوب به‌کار ببرید؛ تصمیم دقیق با Privacy/Security است.

Incident و Near Miss را به Regression Evidence تبدیل کنید

Incident فقط Ticket فنی نیست. ابتدا containment و مسیر پاسخ سازمانی انجام می‌شود؛ سپس Timeline با زمان‌های چندمنبعی، affected scope، version/config، patient/workflow impact ارزیابی‌شده توسط نقش مناسب، Controlهای ناکام، detection gap و recovery ثبت می‌شود. هدف تحلیل سیستم است، نه یافتن سریع یک فرد برای سرزنش.

  • Artifact و log لازم را با مجوز و حداقل داده حفظ کنید.
  • Known impact، potential exposure و unknown را از هم جدا کنید.
  • Timeline را با timezone و clock uncertainty ثبت کنید.
  • هر Action یک Owner، deadline، evidence و effectiveness check داشته باشد.
  • Scenario به fixture مصنوعی و Regression test تبدیل شود.
  • Monitoring gap و runbook نیز مثل code defect اصلاح شوند.
  • Near miss و recovery موفق را برای فهم Controlهای مؤثر بررسی کنید.

Evidence Pack قابل ممیزی بسازید

Screenshot پراکنده یا لینک Pipeline که بعداً expire می‌شود Evidence Pack نیست. بسته باید immutable یا دست‌کم tamper-evident، قابل ردیابی، دارای retention و دسترسی مصوب و قابل بازتولید در حد روش باشد. داده حساس را فقط چون «مدرک تست» است بی‌حد نگه ندارید.

Evidence Pack Index
01 Context / Intended Use / Applicability decision
02 Hazard log and traceability matrix
03 Requirements, rules, profiles and approvals
04 Release identity and environment manifest
05 Synthetic fixture generator, seed and checksums
06 Test procedures, raw results and review records
07 Deviations, blocked/inconclusive items and defects
08 Security/privacy/usability/resilience evidence references
09 Downtime, restore, reconciliation and rollback evidence
10 Residual risk, release decision and expiry
11 Production monitors, runbooks and ownership
12 Change history, retention and access record

Report باید محدودیت و Unknown را کنار نتیجه نشان دهد. Evidence قابل ممیزی یعنی بتوان فهمید چه کسی، چه چیزی را، با کدام نسخه و روش، چه زمانی اجرا یا بررسی کرده است؛ نه اینکه خروجی حتماً تصمیم Go تولید کند.

نقش‌ها و تفکیک تصمیم

نقشمسئولیت نمونهنباید به‌تنهایی ادعا کند
QA/Testطراحی/اجرای Evidence، محدودیت و Defectاثربخشی بالینی یا انطباق کل سازمان
Developer/ArchitectDesign، implementation، review و observabilityپذیرش مستقل Risk ایجادشده توسط خود
Clinical/domain ownerWorkflow، content، oracle و consequence contextصحیح‌بودن فنی بدون Evidence
Human factors/UXکاربر هدف، task، study و analysisنمایندگی همه کاربران با expert opinion
Security/Privacythreat/privacy assessment و control requirementsPatient safety کامل
Regulatory/QualityApplicability، process و submission/audit scopeتضمین رفتار نرم‌افزار بدون V&V
Operations/SREdeployment، monitoring، continuity و incident responseتغییر Clinical rule بدون owner
Authorized risk ownerتصمیم release و residual riskنادیده‌گرفتن الزام یا safety gate بدون فرایند

RACI ثابت برای همه سازمان‌ها مناسب نیست. اصل مهم این است که Content approval، Evidence generation، independent review و Risk acceptance قابل تشخیص باشند و Emergency path نیز Audit و expiry داشته باشد.

آزمایش بازتولیدپذیر: Transport سبز، Context غلط

برای نشان‌دادن تفاوت انتقال و معنای Workflow، یک Fixture کاملاً ساختگی ساخته شد. هیچ بیمار، دارو، دوز، پزشک، مؤسسه یا داده واقعی در آن نیست. دو Patient مصنوعی P-۱۰۰ و P-۲۰۰ عمداً نام نمایشی یکسان «بیمار آزمایشی» دارند؛ دو Order با Itemهای خیالی SYN-A و SYN-B و Unitهای بی‌معنای UNIT-X/Y ایجاد می‌شوند. برای O-۱۰ نسخه ۲ وضعیت را Discontinued می‌کند، سپس duplicate و نسخه ۰ قدیمی دیر می‌رسند.

Fixture: fictional-health-it-orders-v1
Deliveries: 6

Naive consumer:
- key = displayName
- every delivery overwrites current state

Contract-aware consumer:
- entity key = patientId | encounterId | orderId
- same entity+version = duplicate/no-op
- lower version = stale/historical, never current
روشپیام پذیرفته/تحویلCurrent stateDuplicateStaleنتیجه
Transport gate۶ از ۶بررسی نمی‌کندبررسی نمی‌کندبررسی نمی‌کندPASS
Naive: displayName + arrival wins۶ از ۶۱ وضعیت؛ P-۱۰۰/O-۱۰ v0 ActiveپذیرفتهCurrent شدههویت‌ها ادغام و State عقب رفته
Contract-aware۶ از ۶۲ وضعیت؛ P-۱۰۰ v2 Discontinued، P-۲۰۰ v1 Active۲ کنار گذاشته۱ تاریخیInvariantهای Fixture حفظ شدند
{
  "transport": { "accepted": 6, "delivered": 6, "pass": true },
  "naive": {
    "currentStates": 1,
    "state": [{ "patientId": "P-100", "orderId": "O-10", "version": 0, "status": "active" }]
  },
  "contractAware": {
    "currentStates": 2,
    "duplicatesIgnored": 2,
    "staleIgnored": 1,
    "states": [
      { "patientId": "P-100", "orderId": "O-10", "version": 2, "status": "discontinued" },
      { "patientId": "P-200", "orderId": "O-20", "version": 1, "status": "active" }
    ]
  }
}

این خروجی فقط مکانیک شش Event دست‌نویس را ثابت می‌کند. نشان نمی‌دهد یک EHR، Interface، استاندارد، بیمارستان یا Workflow واقعی امن است؛ احتمال یا شدت Harm را اندازه نمی‌گیرد؛ قانون درست Patient matching یا State machine پزشکی ارائه نمی‌کند؛ و Benchmark، Coverage target یا Threshold عمومی نیست. Fixture عمداً برای آشکارکردن Failure طراحی شده و نتیجه آن قابل تعمیم آماری نیست.

درس محدود اما مهم این است: Delivery count باید با Identity invariant، Version rule، Idempotency، Current-state query و Reconciliation تکمیل شود. Contract واقعی باید توسط صاحبان دامنه و معماری محصول تعیین شود.

سناریوی بومی: کلینیک آزمایشی فارسی و قطعی ارتباط

یک Pilot کاملاً مصنوعی برای کلینیک فرضی در ایران در نظر بگیرید: ثبت بیمار ساختگی، ایجاد سفارش آزمایشی، ارسال به سرویس Lab Stub، بازگشت Result غیرپزشکی، نمایش فارسی و قطعی شبکه. محیط به هیچ سامانه ملی، بیمارستان، آزمایشگاه، پزشک، بیمار، پیامک، پرداخت یا Device واقعی وصل نیست و هیچ توصیه مقرراتی درباره ایران ارائه نمی‌کند.

ریسکتزریق مصنوعیInvariantشاهد
Patient collisionدو نام یکسان با ID متفاوتContext هر Order مستقل استUI + API + audit correlation
Unicodeی/ی، ک/ک، نیم‌فاصله، ارقام سه‌گانهنمایش درست؛ Identity collision خاموش رخ ندهدsearch/match negative cases
TimeUTC و Asia/Tehran؛ شمسی فقط نمایشترتیب canonical حفظ و timezone آشکار استevent timeline
Network cutTimeout بعد از commitretry Order دوم نسازدidempotency + reconciliation
Late eventنسخه قدیمی بعد از توقفCurrent state عقب نرودstate history/query
DowntimeLab Stub unavailableکاربر Completed کاذب نبیندqueue/alert/fallback rehearsal
RTLجدول، Modal، print و mixed LTR IDsPatient/Order و state قابل تمایزندvisual + user task review

Artifactها با checksum داخلی، dependency cache و Fixture seed ذخیره می‌شوند تا اجرای آفلاین ممکن باشد. تمام نام‌ها SYNTHETIC، Codeها خیالی و مقدارها فاقد معنای بالینی‌اند. اگر تیم روزی Sandbox بیرونی اضافه کند، قرارداد، مالک داده، دسترسی شبکه، عدم استفاده از اطلاعات واقعی و محدودیت محیط باید دوباره تصویب شوند.

برنامه ۳۰روزه برای شروع

هفتهخروجیفعالیتمعیار اتمام
۱: ScopeContext Contract و Applicability Matrixانتخاب یک Workflow، Actor، Intended Use، exclusion و ownerمرز و Claimها امضا و نسخه‌دارند
۲: RiskWorkflow map، Hazard scenarios و Traceabilitywalkthrough چندنقشی و تعیین Control/Oracleهر Hazard مهم owner و Evidence plan دارد
۳: EvidenceFixture مصنوعی و Test packidentity، state، duplicate، stale، failure، usability و downtimeنتایج با Build/Config/Data قابل بازتولیدند
۴: DecisionRelease memo و monitoringتمرین restore/reconcile، review unknown و runbookResidual risk، decision و expiry ثبت شده‌اند
  • یک Workflow محدود و پرمعنا انتخاب کنید، نه کل بیمارستان.
  • حداقل یک متخصص Workflow، یک QA، یک مهندس و یک مالک عملیات در walkthrough حاضر باشند.
  • پنج تا ده Hazard Scenario را عمیق کنید، نه صد عنوان بدون Control.
  • Fixture مصنوعی را با collision، duplicate، stale و outage بسازید.
  • Evidence و limitation را قبل از اجرای Gate تعریف کنید.
  • در پایان Pilot، defect count را هدف نگیرید؛ ببینید آیا تصمیم و Unknown روشن‌تر شده‌اند.

ضدالگوهای رایج در تست سامانه سلامت

ضدالگوچرا خطرناک است؟اصلاح
هر اپ سلامت = HIPAA/Medical Deviceشمول و jurisdiction را حدس می‌زندApplicability decision حقوقی/Regulatory
Testing guarantees safetyمحدودیت Evidence و Residual risk را پنهان می‌کندClaim محدود + limitation + owner decision
HTTP 200 = Integration passمعنا، هویت و Workflow را نمی‌سنجدLayered contract + reconciliation
نام بیمار = IdentityCollision و wrong-patient context می‌سازدstable IDs و merge/unmerge scenarios
FHIR JSON = InteroperabilityProfile، terminology و business rule جا می‌ماندIG-pinned validation + E2E
DICOM image opens = compatibleWorkflow، SOP و metadata را نمی‌سنجدStatement comparison + equipment validation
Production copy with names maskedبازشناسایی و leakage ممکن استSynthetic-first + formal data decision
QA invents clinical oracleExpected result بی‌اعتبار استversioned rule/content owner
Average latency onlytail، freshness و backlog پنهان می‌شودjourney/slice/tail/recovery metrics
Backup job greenقابلیت restore/reconcile معلوم نیستclean restore exercise
Pass rate gateCritical blocked test گم می‌شودHazard-based readiness
Monitoring infrastructure onlywrong/stale clinical state دیده نمی‌شودClaim-level signals
Downtime = maintenance pageworkflow انسانی و بازگشت جا می‌ماندexercise + reconciliation
Usability by QA role-playکاربر هدف نمایندگی نمی‌شودappropriate user research/simulation
Blocked = skippedUnknown به موفقیت ظاهری تبدیل می‌شودExposure و owner صریح

چک‌لیست نهایی تست نرم‌افزار سلامت

  • Intended Use، user، setting، population، workflow و exclusion نسخه‌دارند.
  • نوع محصول و Applicability توسط نقش‌های صلاحیت‌دار تعیین شده است.
  • Claimها محدود و به Hazard/Requirement/Control وصل‌اند.
  • Patient، encounter، order، specimen، result، device و practitioner هویت جدا دارند.
  • Merge/Unmerge، collision، context switch و چند Tab آزموده شده‌اند.
  • State machine، version، duplicate، late event و retry Contract دارند.
  • Clinical content/Rule و Oracle مالک و نسخه مشخص دارند.
  • FHIR/HL7/DICOM با نسخه/Profile/Statement و Workflow واقعی آزموده‌اند.
  • Terminology، code system، unit، precision، timezone و provenance کنترل شده‌اند.
  • Migration با semantic invariant و reconciliation فراتر از Count بررسی شده است.
  • داده Synthetic-first است و هیچ PHI/PII در fixture/log/ticket نشت نمی‌کند.
  • Security، Privacy، Usability و Accessibility برنامه و Owner جدا دارند.
  • Performance با workload، tail، freshness، degradation و recovery سنجیده شده است.
  • Downtime، restore، return-to-service و reconciliation تمرین شده‌اند.
  • Code، Config، Rule، Terminology، Permission و Flag همگی Release identity دارند.
  • Critical Hazardها Evidence تازه و محدودیت روشن دارند.
  • Blocked، Inconclusive، Not-run و Stale به‌عنوان Unknown گزارش می‌شوند.
  • Residual risk و Release decision مالک و expiry دارند.
  • Production monitoring به Claim و Workflow، نه فقط زیرساخت، متصل است.
  • Incident/Near miss به Action، effectiveness check و Regression fixture برمی‌گردد.

سؤالات متداول تست نرم‌افزار سلامت

آیا Pass شدن تست‌ها یعنی نرم‌افزار پزشکی ایمن است؟

خیر. Pass فقط رفتار مشاهده‌شده را در Scope، Build، Config، داده، روش و Oracle مشخص گزارش می‌کند. ایمنی به طراحی، Hazard control، محتوای بالینی، انسان، فرایند سازمانی، عملیات و شواهد متعدد وابسته است. محدودیت‌ها و Residual Risk باید به صاحب اختیار گزارش شوند.

آیا همه اپلیکیشن‌های سلامت باید HIPAA، FDA، HL7 و DICOM را رعایت کنند؟

نه. شمول به کارکرد، نقش سازمان، نوع داده، بازار، حوزه قضایی، Intended Use، طبقه‌بندی و Interfaceهای محصول بستگی دارد. حقوقی، Privacy، Regulatory و Quality باید منبع و نسخه لازم را تعیین کنند؛ QA سپس Requirement مصوب را به Test و Evidence تبدیل می‌کند.

آیا Valid شدن FHIR Resource، سازگاری کامل را ثابت می‌کند؟

خیر. Validator می‌تواند ساختار، Profile، invariant و بخشی از Terminology را بررسی کند، اما Business rule، authorization، Patient matching، workflow، رفتار طرف مقابل و استفاده انسانی نیازمند تست‌های دیگرند. نسخه FHIR و IG/Package نیز باید pin شوند.

برای محیط تست سلامت از داده واقعی استفاده کنیم؟

پیش‌فرض امن‌تر، داده مصنوعی نسخه‌دار و تکرارپذیر است. اگر نیاز واقعی به Extract وجود دارد، ضرورت، روش de-identification، ریسک بازشناسایی، دسترسی، محل، retention، audit و destruction باید با تصمیم رسمی Privacy/Legal/Security کنترل شود. حذف نام به‌تنهایی کافی نیست.

از کدام سناریو برای شروع تست HIS یا EHR استفاده کنیم؟

یک Workflow محدود با پیامد و handoff روشن انتخاب کنید؛ مثلاً ثبت بیمار مصنوعی تا سفارش و نتیجه غیرپزشکی در Sandbox. Context Contract، سه تا ده Hazard، شناسه‌های Patient/Encounter/Order، duplicate/stale event، قطعی، reconciliation و یک Release memo بسازید. کل سامانه را یک‌باره وارد Pilot نکنید.

جمع‌بندی: هدف، شواهد قابل‌ردگیری برای تصمیم بهتر است

تست نرم‌افزار سلامت از Context آغاز می‌شود، نه از ابزار. Intended Use و Clinical Workflow مرز را می‌سازند؛ Hazard و Claim تعیین می‌کنند چه چیزی باید کنترل شود؛ هویت، State، Terminology و Interoperability معنای داده را حفظ می‌کنند؛ Usability، Security، Privacy، Performance و Downtime شرایط استفاده را می‌سنجند؛ و Evidence Pack همراه با Unknown و Residual Risk، تصمیم Release را پاسخ‌گو می‌کند.

سبزشدن Transport مفید است، اما کافی نیست. پرسش نهایی این نیست که «چند تست Pass شد؟»؛ این است که «برای کدام Claim و Hazard، در کدام نسخه و Context، چه شاهدی داریم، چه چیزی هنوز نمی‌دانیم و چه کسی با دانستن آن تصمیم می‌گیرد؟»

روش تدوین و منابع

این راهنما با بازبینی انتقادی نسخه قبلی، جداسازی قصد جست‌وجوی تست Health IT از صفحات عمومی امنیت/حریم خصوصی/انطباق و تطبیق ادعاهای حساس با منابع رسمی جاری تدوین شد. مثال و اعداد آزمایش کاملاً ساختگی‌اند و در Node.js ۲۴.۱۸.۰ به‌صورت deterministic اجرا شدند.

  • ONC، SAFER Guides ۲۰۲۵: System Management، Contingency، Patient Identification، Order Entry، Result Follow-up و Communication؛ صفحه در ۲۷ فوریه ۲۰۲۶ به‌روزرسانی شده است.
  • FDA، Content of Premarket Submissions for Device Software Functions، Final Guidance، ژوئن ۲۰۲۳؛ فقط برای Scope تعریف‌شده همان راهنما.
  • HL7 FHIR، Validation: قابلیت‌ها و محدودیت روش‌های اعتبارسنجی محاسبه‌پذیر.
  • DICOM PS3.۲ جاری: Conformance Statement و محدودیت آن برای تضمین Interoperability.

بازبینی محتوایی: مرداد ۱۴۰۵. استاندارد، مقرره، Implementation Guide، Rule library و Clinical content تغییر می‌کنند؛ تیم باید نسخه جاری و Applicability محصول خود را پیش از استفاده تأیید کند.

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