TDD توسعه نرمافزار با تستهای خودکار!

آموزش Test Driven Development آتریا

تهیه زیرساخت‌های موردنیاز برای هوش مصنوعی، ازجمله سرور، GPU، فضای ذخیره‌سازی، اینترنت پرسرعت و پایدار و نیروی متخصص برای شرکت‌ها هزینه زیادی دارد. فولادی با بیان مزایای متعدد رایانش ابری، مانند کاهش هزینه‌ها، افزایش انعطاف‌پذیری و مقیاس‌پذیری، بر اهمیت این فناوری در تحول دیجیتال تأکید کرد. از اینکه ما را در توسعه بهتر و هدفمند‌تر دیجیاتو همراهی می‌کنیداز شما سپاسگزاریم. دقت داشته باشید برای نوشتن تست ها از XUnit.net Test Framework استفاده میکنیم. همچنین از ابزار NCrunch برای Continuous Testing استفاده می کنیم. اما همونطور که قبلا گفتیم، این تست پاس نمی‌شه چونکه assert دوم قیمت دو کیلو هندوانه رو تست می‌کنه در صورتیکه متد getPrice در کلاس Melon همواره عدد ثابت ۴۰۰۰ رو بازگشت می‌ده.

با توجه به این دو قانون، توسعهٔ مبتنی بر آزمون را می‌توان به عنوان یک مدل توسعهٔ iterative تعریف کرد که در آن برنامه‌نویس موارد آزمون را قبل از نوشتن کد با استفاده از نیازمندی‌ها استخراج می‌کند. سپس کدی برای افزایش عملکردی کوچک نوشته می‌شود تا در تست پاس شود و در صورت شکست تست، کد می‌تواند به‌طور مکرر برای افزایش کیفیت و طراحی مجدداً تغییر داده شود. یادوتون باشه که در توسعه تست محور، در هر مرحله باید قدم‌های کوچکی برداریم. یا وقتی داریم تست رو پاس می‌کنیم تغییرات کوچکی در کد انجام بدیم.هدف در مرحله دو (پاس کردن تست) فقط پاس کردن تست هستش. یعنی باید تمرکزمون رو بزاریم که تست پاس بشه، نه اینکه کل کدی که مد نظر داریم رو پیاده سازی کنیم.

به ارور خوردیم چون فکر یه‌جایی – آماده بودن کامل موقعیت – رو نکرده بودیم. پس با انجام یک‌سری تغییرات (دیباگ) دوباره تست رو انجام دادیم (تست). این پروسه رو انقدر انجام می‌دیم تا تمام باگ‌ها گرفته بشه و در ازای ورودی‌های ما خروجی‌های مورد انتظارمون برآورده بشن. البته بررسی کردن برخی موارد دیگر می‌تواند زمان بسیار بیشتری نیاز داشته باشد. برای مثال تصور کنید که یک صفحه پرداخت را ایجاد کرده‌اید که می‌خواهید از درستی کار ورودی‌ها مطمئن شوید، شما برای هر بار تست کردن صفحه نیاز دارید تا تک تک ورودی‌ها را پر کرده و بعد دکمه ارسال را بزنید. گاهی اوقات انجام این کارها از ۲۰ ثانیه به چندین دقیقه زمان نیاز خواهد داشت.

همچنین، او تصریح می‌کند که TDD در همه شرایط عملی یا مناسب نیست و برنامه‌نویسان حرفه‌ای باید بدانند که چه زمانی استفاده از این روش می‌تواند بیش از حد مفید باشد. همانطور که سیستم را بر اساس بازخورد، رفع اشکال و ویژگی‌های اضافی تکامل می‌دهید، به شما می‌گوید که کد قابل نگهداری مطابق انتظار کار کرده و به کار خود ادامه می‌دهد. تست‌ها می‌توانند به عنوان مستند برای یک توسعه‌دهنده عمل کنند. اگر از نحوه عملکرد یک کلاس یا کتابخانه مطمئن نیستید، بروید و تست‌ها را بخوانید. با TDD، تست ها معمولاً برای سناریوهای مختلف نوشته می شوند، یکی از آنها احتمالاً نحوه استفاده از کلاس است.

برای مثال به کارهای آزمایشی فکر کنید که نیاز است مدام خطاها را بررسی کنید و ببینید که پروژه به چه شکلی است. استفاده از یک فریمورک ناشناخته و یادگیری عکس‌ و العمل‌های آن می‌تواند مثال خوبی از انجام یک کار آزمایشی باشد. روش معمولی که برای تایید یک کد استفاده می‌شود (با در نظر گرفتن اینکه پروژه ما یک وب اپلیکیشن است) این است که پروژه را در مرورگر باز کرده و خروجی را درست مانند یک کاربر مشاهده بکنیم. این بدان معناست که شما با هر بار تغییر در کدها باید مرورگر را باز کنید، روی دکمه‌ای که می‌خواهید یک کار را انجام دهد کلیک نمایید و خروجی را مشاهده کنید. Green Step مرحله دوم چرخه TDD به ما می گوید که کدی بنویسیم که تست را Pass کند.

سوالات و اشکالاتی که تنها یک مشاور فنی، باتجربه و آگاه در آن زمینه می تواند پاسخگو آن باشد. تیم آموزشی آتریا همیشه آماده بوده تا سوالات و اشکالات شما را برطرف نموده و مسیر یادگیری صحیح را پیش روی شما قرار دهد. شما می توانید از طریق فرم مقابل، درخواست مشاوره خود را ثبت کنید. Test Driven Developement یا TDD یا توسعه‌ی تست محور،‌ یک روش توسعه‌ی نرم‌افزار است که با هدف کاهش خطاهای برنامه‌نویسی ایجاد شده است. در شیوه‌ی عادی و با استفاده از آزمون واحد( Unit Test ) می‌توانیم برنامه را تست کنیم ولی بدون داشتن یک قانون مشخص برای آزمون نرم‌افزار، معمولا نوشتن تست به تاخیر می‌افتد یا به طور کلی انجام نمی‌شود.

یعنی وقتی می‌گیم یک کلاس high cohesion است یعنی اون کلاس با یک مجموعه از عملکرد (function) های مرتبط طراحی شده. Cohesion مفهوم عمومی‌تری نسبت به SRP (Single Responsibility Principle) هستش ولی هر دو با هم به صورت نزدیکی مرتبط هستن. به این معنی که کلاس‌هایی که به SRP پایبند باشن، دارای high cohesion هستن و قابلیت نگهداری بالاتری دارن. مثلا فرض کنید میخوایم تستی بنویسیم که قیمت ۲ کیلو هندوانه رو تست می‌کنه. خب وقتی همچین تستی بنویسیم، از اونجا که متد getPrice همواره مقدار ثابت ۴۰۰۰ رو بازگشت می‌ده، تستمون پاس نمی‌شه و برای پاس کردنش مجبوریم که کد رو تغییر بدیم.

با توسعه تست ها از روی الزامات، به جای کد، ارتباطات افزایش می یابد. خالق نیازمندی‌ها، توسعه‌دهنده و تست‌کننده باید در تست‌ها و کدهای بعدی با یکدیگر همکاری کنند و در نتیجه درک همه از کار در دست افزایش یابد.با نوشتن تست یا مجموعه تستی ابتدا نیازی به منتظر ماندن برای انجام تست نیست. کد را می توان بلافاصله نوشت و تست کرد، به خصوص زمانی که تست خودکار در فرآیند گنجانده شود (بهترین روش در نظر گرفته می شود). اگر کد خراب شود، می توان آن را به عقب رانده شد، و اگر موفق شد، مورد بعدی را می توان شروع کرد. توییتر از TDD به عنوان یکی از رویکردهای اصلی در توسعه نرم‌افزارهای خود استفاده می‌کند. TDD به توییتر کمک کرده است تا کد پایدارتری تولید کند و تغییرات را با اطمینان بیشتری در سیستم عرضه کند.

این رویکرد پیشگیرانه برای تست کردن با اصول تست Shift-left و DevSecOps همسو می‌شود؛ جایی که امنیت و آزمایش از همان ابتدا در چرخهٔ عمر توسعهٔ نرم‌افزار یکپارچه شده‌است. از آن‌جایی که صنعت نرم‌افزار همچنان امنیت و قابلیت اطمینان را در اولویت قرار می‌دهد، TDD آماده است تا نقش مهمی در تقویت نرم‌افزار در برابر تهدیدات احتمالی ایفا کند. Test Driven Development یا به اختصار TDD یک متدولوژی توسعه نرم افزار است که از طریق تکنیک test first به ما در تست و توسعه هرچه سریعتر و باکیفیت تر نرم افزار کمک می کند. TDD در حقیقت تشکیل شده از یک چرخه بی نهایت تکراری (Iterative) شامل مراحل Red ,Green و Refactor که در شکل زیر نمایش داده شده است. در دنیای تست نرم افزار، تکنیک TDD یک از مهمترین و کاربردی ترین تکنیک ها برای نوشتن تست های اتوماتیک است. هیچ کتابی را در زمینه تست نرم افزار مشاهده نخواهید کرد مگر آنکه چند فصل را به TDD اختصاص داده باشد.

برای مثال از NUnit و MsTest و XUnit می توانید در توسعه تست محور استفاده کنید. در این رابطه می توانید از بسته ی آموزش ویدئویی Unit Testing فریم ورک xUnit.net و آموزش تست واحد Unit Testing پیشرفته استفاده کنید. مارتین،در فصل پنجم کتاب "The Clean Coder"، به معرفی و اهمیت روش توسعه به روش تست‌محور یا TDD (Test-Driven Development) می‌پردازد. TDD یک روش توسعه نرم‌افزار است که برنامه‌نویسان را ملزم می‌کند قبل از نوشتن کد تولیدی، تست‌های واحد (unit tests) را بنویسند. این روش که بخشی از جنبش "برنامه‌نویسی افراطی" (Extreme Programming) بود، طی سال‌ها به یکی از اصول بنیادین در توسعه‌ی چابک (Agile) تبدیل شده است. TDD به طور قابل توجهی بهره‌وری را افزایش می‌دهد و کدهای بدون باگ و با کیفیت بالا تولید می‌کند.

این دو قانون با هم کار می‌کنند تا فرایند توسعه را در TDD هدایت کنند. با تمرکز بر نوشتن تست‌های شکست‌خورده، ابتدا مطمئن می‌شوید که کد شما نیازمندی‌های مورد نظر را برآورده می‌کند. به‌طور هم‌زمان، با حذف تکراری‌ها، پایگاه کد خود را قابل مدیریت‌تر و قابل درک‌تر می‌کنید که منجر به توسعهٔ بهتر می‌شود. یکی از مزیت‌های توسعه مبتنی بر آزمون، امکان شناسایی و رفع مشکلات نرم‌افزار در مراحل ابتدایی توسعه است. با تعریف تست‌ها و سناریوهای آزمون، احتمال وقوع خطاها و نقص‌ها در نرم‌افزار کاهش می‌یابد و توسعه‌دهندگان قادر به شناسایی و رفع این مشکلات در مراحل زودهنگام هستند.

در توسعه نرم افزار، خطاها رایج هستند، اما بازخورد می تواند به رفع آنها کمک کند. بازخورد دیرهنگام ممکن است منجر به انباشته شدن تغییرات در بالای کدهای شکسته شود و ردیابی علت اصلی را دشوار کند. TDD نوید بازخورد فوری را می دهد و احتمال بروز باگ را کاهش می دهد. در این مقاله، "TDD چیست" و موارد دیگر در مورد آن را بررسی خواهیم کرد. شرکت آی‌بی‌ام، در توسعه نرم‌افزارهای خود از TDD بهره می‌برد. از جمله محصولاتی که با استفاده از TDD در آی‌بی‌ام توسعه یافته است می‌توان به RTC) Rational Team Concert) اشاره کرد.

چگالی تست بالاتر و پوشش تست به طور پیش فرض از مزایای TDD هستند. در رویکرد سنتی، احتمال بیشتری وجود دارد که تست کنار گذاشته شود یا به فانکشن های حیاتی محدود شود، به خصوص اگر زمان کوتاه باشد. از سوی دیگر، TDD نظم و انضباط همه فانکشن ها را که با مجموعه ای از تست های واحد خودکار مرتبط است، ایجاد می کند. علاقمندان به یادگیری تست نرم افزار می توانند همچنین این دوره را به صورت غیر حضوری از طریق لینک بسته آموزش تست نرم افزار دریافت نمایند. به طور کلی می توان گفت باید قواعد ریفکتور رعایت شود، از آنجایی که همه آزمایش‌ها در طول قدم بازسازی مجدد اجرا می‌شوند، توسعه‌دهنده می‌تواند مطمئن باشد که این فرآیند هیچ یک از عملکردهای موجود را تغییر نمی‌دهد. هدف از این دوره آموزش تست اتوماتیک نرم افزار و Automate کردن فرایند تست و استقرار یک نرم افزار است.

بنابراین می‌توانید ورودی‌های مورد انتظاری که یک متد به آن نیاز دارد و آنچه می‌توانید به‌عنوان نتیجه انتظار داشته باشید، همه بر اساس ادعاهای مطرح‌شده در تست را ببینید. عنصر کلیدی برای مؤثر بودن در توسعه مبتنی بر تست، درک این است که واقعاً چیست. من متوجه شدم که تصورات غلط زیادی در مورد نحوه انجام درست TDD وجود دارد. TDD یکی از روش هایی است که اگر آن را اشتباه انجام دهید، اغلب بهای گزافی را پرداخت می کنید. سرورهای CI مانند Jenkins، Travis CI و CircleCI می توانند هر زمان که تغییرات کد اعمال می شود، به طور خودکار تست های شما را بسازند و اجرا کنند و از اجرای منظم و مداوم تست ها اطمینان حاصل کنند.

برای آشنایی با نحوه نوشتن یک نقشه تست (Test plane) این مقاله را بررسی کنید. دوره آموزش Asp.Net Core شامل پروژه های واقعی و متنوع برای درک کامل محتوای مباحث ... یکی از استانداردهای ویدیوهای آموزشی، توجه به مدت زمان آن ویدیو است. به نحوی که ویدیوها دارای مدت زمان بین 5 تا 20 دقیقه باشند تا منجر به خستگی دانشجو نگردد. برای این منظور سعی شده است تا حتی الامکان این استاندارد در ضبط ویدیوهای آموزشی رعایت شده باشد.

در این مرحله حداقل کد لازم برای قبولی در تست را پیاده سازی می کنید. در این مرحله اول، شما یک تست برای عملکرد خاصی که می خواهید پیاده سازی کنید، می نویسید. این تست در ابتدا با شکست مواجه خواهد شد زیرا فانکشن هنوز در دسترس نیست. شرکت هایی مانند نتفلیکس به شدت به TDD برای اطمینان از کیفیت و قابلیت اطمینان پلت فرم استریم خود متکی هستند. با استفاده از best practice های TDD، آنها می‌توانند به طور مداوم ویژگی‌ها و به‌روزرسانی‌های جدید را بدون به خطر انداختن پایداری سرویس خود ارائه دهند. به طور مشابه، Atlassian از TDD برای ساخت و نگهداری مجموعه ابزارهای همکاری(collaboration) خود استفاده می‌کند، و آنها را قادر می‌سازد تا با حفظ استانداردهای بالای کیفیت، سریع تکرار شوند.

اما با این حال، او تصمیم گرفت به مدفورد، اورگن سفر کند تا این روش را به طور مستقیم از کنت بک (Kent Beck)، یکی از بنیان‌گذاران TDD، یاد بگیرد. این می تواند به افزایش درک توسعه دهندگان از بخش هایی از سیستم کمک کند و بنابراین به حمایت از مالکیت کد جمعی کمک می کند. در نتیجه، تغییرات در کد می تواند توسط هر توسعه دهنده ای انجام شود نه تنها توسعه دهنده ای که کد را درک می کند. توسعه تست محور (TDD) است و در واقع این نتایج را ارائه می دهد. در دنیای امروز، توسعه بر اساس تست ها هدایت می شوند از همین رو اولین قدم در این توسعه نیز نوشتن تست ها واحد ( Unit Test ) می باشد که با شکست مواجه می شود زیرا کدی که تست می کند هنوز وجود ندارد. علاوه بر این، TDD انعطاف پذیری و سازگاری کد را افزایش می دهد.

این روند تکرار می‌شود تا نرم‌افزار به صورت کامل و با تمامی ویژگی‌ها و تست‌ها توسعه یابد. در این قسمت از سایت پرووید آموزش ویدیویی رایگان دیگری را در رابطه با توسعه تست محور نرم افزار و یا همان Test-Driven Development در اختیار شما قرار می دهیم. امیدواریم که این آموزش نیز مورد توجه تمامی عزیزان قرار بگیرد. در ابتدای کار توصیه می‌کنیم که از آموزش تست واحد Unit Testing برای برنامه نویسان سی شارپ در سی شارپ و آموزش توسعه تست محور Test Driven Development پیشرفته در سی شارپ استفاده کنید. تست نرم افزار را می‌توان یکی از زیر مجموعه‌های مبحث کیفیت نرم افزار با نام “تضمین کیفیت” در نظر گرفت. در این دوره هرم تست و مفاهیم آن و آنچه از آن استنباط می شود را آموزش می دهیم.

برنامه‌نویس هدف خود را با داشتن آزمون‌ها به روشنی می‌داند و می‌توانند صرفاً با تمرکز بر روی همین آزمون‌ها، از یک هدف و نیازمندی مبهم خود را دور کند. یک مهندس نرم‌افزار آمریکایی به نام کنت بک، که توسعه یا «بازکشف» این روش را به وی نسبت می‌دهند، در سال ۲۰۰۳ اظهار داشت که TDD طرح‌های ساده و الهام بخش اعتماد به نفس را تشویق می‌کند. متولد ۱۳۵۰، تحصیل‌کرده مهندسی نرم‌افزار و کارشناسی زبان و ادبیات انگلیسی. از سال ۱۳۷۶ روزنامه‌نگارم و راه‌اندازی نخستین صفحه فناوری اطلاعات در روزنامه‌های ایران، سردبیری نخستین هفته‌نامه و نخستین روزنامه فناوری اطلاعات ایران جزو سوابق من است. پلتفرم ابرآمد این امکان را به سازمان‌ها می‌دهد که سرویس‌های ابری‌ خود را متناسب با نیازهای زیرساختی‌‌شان به‌صورت Self-Service ایجاد و مدیریت کنند.

اینجا کاری که میخوایم انجام بدیم اینه که تست کنیم آیا قیمت ۴ کیلو هندوانه درست هست یا نه (یعنی ۴۰۰۰ تومن). یادتون باشه زمانی که دارید تست می‌نویسید،‌ تصور کنید که بهترین کد رو در اختیار دارید. در واقع وقتی کدی وجود نداره بهتره که تصور کنیم بهترین کد ممکن چطور رابط (Interface) ی می‌تونه داشته باشه. ما داریم قصه‌ای برای خودمون تعریف می‌کنیم که method ها از بیرون چطور در دسترس قرار می‌گیرن. قرار نیست همیشه این قصه به حقیقت بپیونده، اما بهتره که همیشه با بهترین API ممکن شروع کنیم. BDD سطوح مختلف تست، از جمله تست واحد، ادغام و پذیرش را پوشش می دهد.


برنامه نویسی چقدر طول میکشد