فرمول طلایی تستنویسی نرمافزار؛ تبدیل خواستههای مبهم به کدهای آزمون خودکار با منطق هار
توسعه مبتنی بر رفتار با یک ساختار زبانی سهبخشی، خواستههای مبهم مشتریان را به تستهای اجرایی خودکار بدل میکند. این الگو منطق اثبات ریاضی سال ۱۹۶۹ را به زبانی ساده میآورد تا تیمها پیش از کدنویسی، تغییرات دقیق سیستم را مشخص کنند.
به قلم شیرین کریمی
این خبر را به اشتراک بگذارید
بهطور خلاصه
- ساختار «فرض-هنگامیکه-آنگاه» فرمول ریاضی {P} C {Q} هار را به زبانی ساده و کاربردی برای تست نرمافزار تبدیل میکند.
- این قالب منظم اجازه میدهد ابزارهای تست نیازمندیهای زبانی را مستقیماً به کدهای آزمایشی خودکار ترجمه و اجرا کنند.
- تفکیک یک محرک واحد در بخش «هنگامیکه» از شکنندگی سناریوها پیشگیری کرده و یافتن علل خطاها را بسیار ساده میسازد.
ساختار زبانی «فرض-هنگامیکه-آنگاه» (Given-When-Then) با وادار کردن تیمها به شفافسازی دقیق وضعیت آغازین، محرک مشخص و نتیجه نهایی، نیازمندیهای مبهم را به آزمونهای نرمافزاری قابل اجرا بدل میکند. این رویکرد، یک سیستم اثبات ریاضیاتی محصول سال ۱۹۶۹ به نام «منطق هار» (Hoare logic) را در قالب زبانی روزمره بازآفرینی میکند تا تحلیلگران کسبوکار بتوانند معیارهایی تدوین کنند که ابزارهای تست مستقیماً و به صورت خودکار اجرا کنند.[2][6]
ریشه شکست اغلب پروژههای نرمافزاری در شکاف ارتباطی نهفته است: مدیران محصول نیازها را به زبان طبیعی و روزمره مینویسند، اما کامپیوترها فقط دستورهای صفر و یک با تغییر وضعیت مشخص را میفهمند. برای نمونه، درخواستی مثل «کاربر بتواند بهسادگی رمزش را بازیابی کند» هیچ مرز قابل سنجشی ارائه نمیدهد؛ برنامهنویس باید رفتار سیستم را حدس بزند و آزمایشگر هم ناچار است برداشتهای سلیقهای را بررسی کند.[6]
این شکاف زبانی در گذشته همواره نرخ بالایی از ایرادات فنی و امکانات ناهماهنگ به بار میآورد. تیمها شدیداً نیازمند ساختاری بودند که خواندنش برای افراد غیرفنی آسان باشد، اما همزمان قالب منظم و استانداردی داشته باشد تا کامپایلر آزمونهای خودکار بتواند آن را بدون جلسات رفتوبرگشت طولانی تحلیل و اجرا کند.[5]
پایههای ریاضیاتی چارچوب
راهکار این چالش در مقاله سال ۱۹۶۹ تونی هار (Tony Hoare)، دانشمند علوم کامپیوتر، نهفته بود که پایههای اصلموضوعی برای برنامهنویسی رایانهای را بنا نهاد. هار ثابت کرد که صحت عملکرد هر برنامه را میتوان با یک ساختار سهتکه ریاضیاتی به نام «سهتایی هار» ارزیابی و اثبات کرد؛ سیستمی که تغییرات وضعیت در محیط را میسنجد.[1]
این فرمول به شکل {P} C {Q} نمایش داده میشود. در این رابطه، {P} بیانگر پیششرط، C دستور یا عملیات اجرایی، و {Q} پسشرط یا نتیجه است. طبق این اصل، اگر پیششرط صادق و برقرار باشد، با اجرای دستور حتماً باید برقراری پسشرط تضمین شود.[1]
همین ساختار پایهای، سنگبنای درستیسنجی صوری (Formal Verification) در دانش کامپیوتر شد. این نگرش بهجای تکیه بر بررسی ساده خروجی، رفتار را به اثبات ریاضیاتی پیوند میزند؛ به این معنا که گذار وضعیتی سامانه دقیقاً مطابق معماری تعریفشده رخ داده و جای هیچ ابهامی در عملکرد سیستم باقی نمانده است.[1][6]
ترجمه منطق صوری به زبان ساده
دههها بعد در سال ۲۰۰۶، دن نورث (Dan North) مهندس نرمافزار، متدولوژی «توسعه مبتنی بر رفتار» (BDD) را معرفی کرد. نورث متوجه شد که برنامهنویسان بیش از حد درگیر ابزارها و سازوکارهای تستنویسی شدهاند؛ بنابراین سهتایی ریاضی هار را به قالب زبانی «فرض-هنگامیکه-آنگاه» درآورد تا تمرکز کل تیم بر رفتار سامانه قرار گیرد.[2]
بخش «فرض» (Given) پیششرط سیستم را تعریف میکند. این بند، وضعیت دقیق سامانه را قبل از انجام هرگونه اقدام مشخص میسازد؛ مثلاً: «فرض کنید کاربری با نشانی ایمیل test@example.com و موجودی صفر در سیستم ثبت شده باشد». این جمله مرز سفتوسختی را برای آزمون تعیین میکند.[2][4]
وادار کردن تیمها به تعریف این نقطه آغازین، فرضیات پنهان را از بین میبرد. برنامهنویس دیگر نیاز ندارد حدس بزند که آیا کاربر وارد حساب شده است یا پایگاهداده رکوردی برای پردازش دارد؛ چرا که پیششرط سیستم همه چیز را شفاف و الزامی کرده است.[6]
بخش «هنگامیکه» (When) مجری دستور کار است. این عبارت تنها یک رفتار، رخداد یا محرک معین را که هدف اصلی آزمون است جدا میکند؛ مانند: «هنگامیکه کاربر در صفحه ورود، درخواست بازیابی گذرواژه را ثبت میکند». این بخش باید کاملاً یکپارچه و منفرد بماند تا آزمایش سلامت منطقی خود را حفظ کند.[2][4]
مشخصات اجرایی نرمافزار
بخش «آنگاه» (Then) پسشرط سیستم را میسنجد. این بند تغییرات دیدهپذیر و ملموس در وضعیت سامانه را معین میسازد؛ نظیر: «آنگاه سامانه یک ایمیل بازیابی با پیوند ورود موقت ۲۴ ساعته ارسال میکند». این خروجی قابل اندازهگیری، معیار اصلی کارکرد درست نرمافزار است.[2][4]
از آنجا که این ترکیب سهگانه ساختاری کاملاً قاعدهمند دارد، فریمورکهای تست نظیر کیوکامبر (Cucumber) و اسپکفلو (SpecFlow) میتوانند متن را با الگوهای زبانی تحلیل کنند. این ابزارها متنهای ساده را مستقیماً به کدهای تست به زبانهای جاوا، پایتون یا روبی وصل کرده و شکاف میان زبان انسان و ماشین را پر میکنند.[4]
این موتورهای پردازش، مستندات معیارهای پذیرش پروژه را از فایلهای متنی راکد به کدهای مشخصات اجرایی زنده بدل میکنند. همین نیازمندیها خود به آزمونهای خودکاری تبدیل میشوند که در خطوط استقرار مداوم کد (CI/CD) بهطور پیوسته اجرا شده و خطاهای ناخواسته را قبل از ورود به محیط عملیاتی صید میکنند.[5][6]
مارتین فاولر، از معماران نامآشنای نرمافزار، اشاره میکند که این قالب به رویکرد استاندارد بیان رفتارهای سیستمی تبدیل شده است. فاولر مینویسد: «این سبک از تستنویسی بسیار فراگیر شده است»؛ چرا که زبانی مشترک میان توسعهدهندگان و تحلیلگران کسبوکار به وجود میآورد که بدون اصطکاک جریان دارد.[3]
نقش زبان فراگیر و مشترک
پذیرش این دستور زبان یک دگرگونی فرهنگی نیز در تیم محصول ایجاد میکند. استانداردسازی واژگان مورد استفاده برای بیان کارکرد سامانه، همان چیزی را میسازد که کارشناسان طراحی دامنهمحور (DDD) به آن «زبان فراگیر» (Ubiquitous Language) میگویند؛ زبانی مشترک که اهداف فنی و مالی را همسو میسازد.[3]
این واژگان مشترک از جزیرهای عمل کردن تیمها جلوگیری میکند؛ جایی که تحلیلگر یک سند مینویسد، برنامهنویس کدی متفاوت پیاده میکند و تیم تضمین کیفیت تستهای کاملاً مجزایی آماده میسازد. سناریوهای مبتنی بر این ساختار، به تنها منبع مرجع حقیقت مشترک میان این سه تخصص تبدیل میشوند.[5]
خطاهای رایج در پیادهسازی
با وجود سادگی ظاهری، تیمها اغلب زمانی به مشکل میخورند که کارهای متعددی را در بخش «هنگامیکه» میگنجانند. سناریویی با چندین محرک، اصل تفکیک دستور را در الگوی اصلی هار نقض میکند و پیچیدگی بیموردی میسازد که کشف ریشه خطاها را دشوار میسازد.[1][6]
وقتی سناریو به صورت «هنگامیکه کاربر وارد شد و کالا را اضافه کرد و تسویهحساب را زد» نوشته شود، عیبیابی غیرممکن میشود؛ چون تست خودکار نمیتواند مشخص کند کدامیک از این سه عمل باعث نقض نتیجه نهایی شده و عملاً آزمون را در فاز رفع عیب بلااستفاده میسازد.[6]
خطای متداول دیگر، گره زدن این ساختار به رابط کاربری بهجای منطق کسبوکار است. نوشتن عباراتی مانند «هنگامیکه روی دکمه سبزرنگ ثبت میزنم» تستهایی آسیبپذیر میسازد که با هر تغییر ظاهری در قالب صفحه میشکنند و هزینه نگهداری بالایی میتراشند.[4][6]
یک سناریوی بهینه همیشه نیت کسبوکار را مینویسد نه حرکات فیزیکی را. جمله «هنگامیکه مشتری اطلاعات پرداخت را تایید میکند»، چه دکمه سبز باشد، چه سوایپ لمسی و چه دستور صوتی، پایدار میماند و طول عمر آزمونهای شما را تضمین میکند.[4]
توسعه تستها با جداول داده
فریمورکهای مدرن اجازه میدهند تا جدول دادهها (Data Tables) را مستقیماً به سناریوها متصل کنید. با این قابلیت، یک سناریوی واحد میتواند دهها حالت مختلف و مقادیر متغیر حاشیهای را به شکلی خودکار بیازماید و پوشش آزمونها را با کمترین زمان و هزینه به اوج برساند.[4][5]
برای نمونه، تست موتور قیمتگذاری میتواند جدولی با ۵۰ حالت از ترکیب سطح کاربری، مبلغ سبد خرید و کدهای تخفیف را ثبت کند. سیستم همان سهتایی هار را ۵۰ بار متوالی اجرا کرده و پسشرط را در برابر تکتک دادهها ارزیابی میکند تا اطمینان کامل حاصل شود.[1][4]
در صورت نگارش اصولی، این مشخصات اجرایی به عنوان مستندات زنده معماری نرمافزار عمل میکنند. هر زمان سیستم تغییر کند، تستها همراه با آن بهروز میشوند؛ بنابراین مستندات فنی هرگز با کد اجرایی و زنده ناهمخوان نخواهند شد و چالشی دیرینه در مهندسی نرمافزار برطرف میشود.[3][5]
موفقیت این ساختار در آن است که نظم و دقت محض ریاضی را بدون نمادهای پیچیده ریاضیاتی پیاده میکند. این تجربه ثابت میکند برای سنجش رفتارهای نرمافزاری دشوار، بهترین راه ترسیم مرزها در قالبی صریح، ساختیافته و ساده است تا رایانهها خواسته دقیق انسانها را اعتبارسنجی کنند.[6]
این تحلیل چگونه انجام شد
- روش
- اجزای ساختاری معیارهای پذیرش در متدولوژی مدرن توسعه مبتنی بر رفتار را با اصول منطق صوری مقاله سال ۱۹۶۹ تونی هار تطبیق دادیم.
- یافته
- ساختار «فرض-هنگامیکه-آنگاه» فراتر از یک الگوی زبانی ساده برای تحلیلگران است؛ این روش ترجمه مستقیم اثباتهای اصلموضوعی گذار وضعیت به شمار میرود که به افراد غیرفنی امکان میدهد مرزهای آزمون را با مبانی دقیق ریاضی تعیین کنند.
- دادههایی که بر پایهٔ آنها کار کردیم
- پیششرط {P}، دستور {C}، پسشرط {Q}: Mathematical proof structure — Communications of the ACM
- فرض [زمینه]، هنگامیکه [رخداد]، آنگاه [نتیجه]: Linguistic testing syntax — DanNorth.net
- محدودیتهای این تحلیل
- این مقایسه صرفاً به بررسی منطق ساختاری سناریوها میپردازد و عملکرد موتورهای پردازشی زیرین را ارزیابی نمیکند.
اصطلاحات کلیدی
- سهتایی هار (Hoare Triple)
- فرمول و ساختاری ریاضیاتی ({P} C {Q}) در مبحث درستیسنجی صوری برای اثبات آنکه اجرای یک دستور، وضعیت سیستم را دقیقاً طبق نیت قبلی تغییر میدهد.
- توسعه مبتنی بر رفتار (BDD)
- رویکردی چابک در ساخت نرمافزار که همکاری پیوسته برنامهنویسان، کارشناسان کنترل کیفیت و مدیران محصول را تقویت میکند.
- مشخصات اجرایی (Executable Specification)
- خواستهها و نیازمندیهای سیستم که در قالبی استاندارد ثبت شده و مستقیماً به شکل تستهای خودکار نرمافزاری اجرا میشوند.
- گرکین (Gherkin)
- زبان اختصاصی دامنه که از کلمات کلیدی نظیر فرض، هنگامیکه و آنگاه برای تعریف سناریوهای اجرایی در ابزارهایی مانند کیوکامبر بهره میبرد.
پرسشهای متداول
آیا میتوان از ساختار «فرض-هنگامیکه-آنگاه» بدون ابزارهای تست خودکار استفاده کرد؟
بله؛ بسیاری از تیمهای محصول در جلسات طراحی و شفافسازی خواستهها صرفاً از این قالب برای گفتگو و جلوگیری از ابهام استفاده میکنند، حتی اگر تستها دستی اجرا شوند.
چنانچه سناریو به چندین پیششرط نیاز داشته باشد چه باید کرد؟
این ساختار از کلیدواژه «و» (And) پشتیبانی میکند. تیمها میتوانند شرایط متعدد را به شکل «فرض کنید کاربر وارد شده، و سبد خرید پر است» پشت سر هم بیاورند.
این روش چه تفاوتی با تستهای سنتی واحد (Unit Test) دارد؟
تستهای واحد کدهای مجزا و توابع مستقل برنامهنویسی را ارزیابی میکنند، درحالیکه این سناریوها رفتار یکپارچه کل سیستم را از منظر کاربر نهایی میسنجند.
بررسی عمیق دیدگاهها
توسعهدهندگان مبتنی بر رفتار
معتقدند این روش برای انطباق اهداف تجاری با کد حیاتی است و محصول را با خواسته مشتریان کاملاً هماهنگ میکند.
طرفداران توسعه مبتنی بر رفتار، ساختار «فرض-هنگامیکه-آنگاه» را موثرترین پل ارتباطی میان نیازمندیهای کسبوکار و اجرای فنی میدانند. از دیدگاه آنان، مستندات سنتی فضای زیادی برای تعبیر و تفسیرهای اشتباه باقی میگذارند؛ موضوعی که باعث میشود مهندسان ویژگیهایی تولید کنند که از نظر فنی درست کار میکند اما نیازی از کاربر برطرف نمیسازد. این روش با الزام افراد به روشنسازی پیششرطها و نتایج دقیق، تضمین میکند همان چیزی ساخته میشود که واقعاً انتظار میرفته است. علاوه بر این، این گروه بر مزیت مستندات زنده تأکید دارند. از آنجا که این معیارهای پذیرش به صورت روزانه روی کدهای سیستم اجرا میشوند، هرگز قدیمی و بیمصرف نخواهند شد. اگر رفتار سامانه عوض شود ولی سناریو دستنخورده بماند، خطوط خودکار مستقر متوقف شده و تیم وادار میشود مستندات خود را کاملاً بهروز نگه دارد.
حامیان درستیسنجی صوری
این ساختار را مدلی کاربردی ولی مجرد و ناکافی از اثباتهای کامل ریاضی میدانند.
دانشمندان علوم کامپیوتر در حوزه درستیسنجی صوری قبول دارند که این ساختار از منطق هار الهام گرفته است، اما نسبت به برابر دانستن آن با اثباتهای دقیق ریاضی هشدار میدهند. در درستیسنجی صوری، سهتایی هار در برابر همه حالتهای ممکن سامانه و با اثباتکنندههای خودکار قضایا ارزیابی میشود؛ درحالیکه در این سناریوها فقط متغیرها و مواردی سنجیده میشوند که ذهن انسان به یاد آورده و ثبت کرده است. این متخصصان معتقدند اگرچه این رویکرد برای نرمافزارهای تجاری بسیار عالی است، اما برای سامانههای حساس نظیر تجهیزات پزشکی یا صنایع هوافضا هرگز کافی نیست؛ چرا که پاس شدن چند سناریوی متنی تضمین نمیکند هسته نرمافزار خالی از باگهای مرگباری باشد که فقط تحلیلهای ریاضی صوری قادر به کشف آنها هستند.
مهندسان تضمین کیفیت
بر بار سنگین نگهداری ناشی از سناریوهای غیراصولی و شکننده تأکید دارند.
مهندسان تست خودکار همواره به دشواریهای فنی نگهداری حجم انبوهی از سناریوهای رفتاری اشاره میکنند. در حالی که نوشتن این سناریوها برای تحلیلگران کار آسانی است، متنهای غیرحرفهای بدهی فنی بسیار سنگینی به بار میآورند. وقتی سناریوها به المانهای ظاهری نرمافزار مانند رنگ دکمهها یا موقعیت المانها در صفحه گره بخورند، آزمونها شکننده شده و با کوچکترین تغییر طراحی پوسته سایت از کار میافتند. این کارشناسان ایجاد لایههای مجزای انتزاعی را ضروری میدانند. از نگاه آنان، این ساختار زبانی باید صرفاً نیت تجاری را توضیح دهد و لایهای مستقل از کد مسئول تعامل فنی با صفحات برنامه باشد. اگر این نظم رعایت نشود، زمان متخصصان تضمین کیفیت بهجای سنجش امکانات جدید، تلف تعمیر تستهای خراب و تاریخگذشته خواهد شد.
- توسعهدهندگان مبتنی بر رفتار
- معتقدند این روش برای انطباق اهداف تجاری با کد حیاتی است و تضمین میکند محصول نهایی دقیقاً طبق سفارش ساخته شود.
- مهندسان تضمین کیفیت
- بر بار سنگین نگهداری تمرکز دارند و هشدار میدهند سناریوهای غیراصولی باعث شکنندگی آزمونها و بازنویسی مداوم میشوند.
- حامیان درستیسنجی صوری
- این ساختار را مدلی مفید اما ناقص دانسته و تأکید دارند که این سبک اگرچه شبیه منطق هار است، اما جامعیت اثبات ریاضی را ندارد.
دیدگاههایی که این گزارش پوشش نداده
- مدیران محصول غیرفنی که قالببندی ایدههای آزاد در ساختار سفتوسخت زبانی برایشان دشوار و زمانبر است
- توسعهدهندگان سامانههای قدیمی (Legacy) که اتصال آزمونهای خودکار به کدهای بدون معماری قبلی برایشان عملاً ممکن نیست
منابع
[1]Communications of the ACMحامیان درستیسنجی صوریAn axiomatic basis for computer programming
مطالعه در Communications of the ACM →
[2]DanNorth.netتوسعهدهندگان مبتنی بر رفتارIntroducing BDD
مطالعه در DanNorth.net →
[3]MartinFowler.comتوسعهدهندگان مبتنی بر رفتارGivenWhenThen
مطالعه در MartinFowler.com →
[4]Cucumber Documentationمهندسان تضمین کیفیتGherkin Reference
مطالعه در Cucumber Documentation →
[5]IEEE Softwareتوسعهدهندگان مبتنی بر رفتارBehavior-Driven Development
مطالعه در IEEE Software →
[6]تیم سردبیری کوهستانمهندسان تضمین کیفیتتحلیل تیم سردبیری کوهستان
مطالعه در تیم سردبیری کوهستان →
بیشتر در جامعه
مشاهده همه →متدولوژی چابک
جایگزینی پرسونای فرضی با محرکهای موقعیتی؛ بازتعریف نیازمندیهای نرمافزار با جاب استوری
5 منبع
برنامهریزی چابک
چگونه برش افقی انتشار مانع از عرضه قابلیتهای جزیرهای در بکلاگهای خطی میشود
7 منبع
مهندسی نرمافزار
قانون وبر و خطای تخمین زمان؛ چرا اسکرام از اعداد فیبوناچی به جای ساعت استفاده میکند؟
5 منبع
متدولوژی چابک
برش عمودی داستانهای کاربر؛ چگونه با اتصال لایههای داده، منطق و رابط کاربری در هر اسپرینت، ریسک یکپارچهسازی را حذف کنیم؟
2 منبع
نظرات
هر زاویه. هر روز.
اخبار جامعه با پوشش کامل منابع و تحلیل دیدگاهها، هر روز و رایگان.





