
آموزش تست واحد Unit Testing پیشرفته در سی شارپ
آموزش تست واحد Unit Testing پیشرفته یکی دیگر از آموزش های گروه آموزشی پرووید می باشد که در این قسمت آن را به شما معرفی می کنیم. این بسته ی آموزشی نیز یکی از دوره های آموزشی دیگر که در حوزه ی فارسی سازی آموزش های انگلیسی تنظیم شده است می باشد. عنوان این بسته ی آموزشی Unit Testing پیشرفته است که با نام اصلی Advanced Unit Testing از شرکت Pluralsight منتشر شده است.
Unit Testing چیست؟
Unit Testing فرآیند حصول اطمینان از درستی یک قطعه کد است. کدی که مورد تست قرار می گیرد ممکن است یک متد، یک گروه از اعضای یک کلاس و یا یک کامپوننت کامل باشد.

از آنجا که Unit Testing نیاز به دانش مربوط به کد مورد تست دارد، اغلب توسط برنامه نویس انجام می شود. برای مثال، ممکن است یک گروه از تست ها درستی کار یک الگوریتم پیچیده را کنترل کنند.
چرا تست واحد و یا Unit Testing مهم است؟
تست واحد یک فرایند کلیدی در توسعه نرمافزار است که با استفاده از آن میتوان عملکرد و صحت عملیات یک واحد کد را بررسی کرد. انجام تست واحد برای برنامهنویسان بسیار مهم است زیرا امکان اطمینان از صحت کدها و عملکرد صحیح برنامه را فراهم میکند. تست واحد به برنامهنویسان این اطمینان را میدهد که تغییراتی که در کد اعمال میکنند تأثیری منفی بر روی سایر بخشهای برنامه ندارد و کلیت سیستم را به هم نمیزند. علاوه بر این، تست واحد کمک میکند تا خطاهای برنامه در مراحل زودتری شناسایی شوند و در نتیجه زمان و هزینههای لازم برای رفع این خطاها کاهش یابد. همچنین تست واحد باعث افزایش اعتماد برنامهنویسان به کد خود میشود و در نتیجه کیفیت و قابلیت نگهداری کد را ارتقا میبخشد. به طور کلی، انجام تست واحد برنامهنویسان را قادر میسازد تا برنامههایی با کیفیت، پایدار و قابل اعتماد ایجاد کنند.
متد TDD یا Test–Driven Development که اساس توسعه ی یک نرم افزار را بر اساس تست ها قرار میدهد، یک مثال بسیار مناسب از اهمیت Testing در توسعه ی نرم افزار است.

بعضی از مزیت های Unit Testing عبارت اند از:
- اطمینان از صحت کار نرم افزار
- کمک به ساده تر شدن فرآیند ریفکتورینگ
- کمک در مستندسازی نرم افزار
طراحی تستهای خوانا با Fixture Setup و الگوی SUT Factory
در پروژههای بزرگ C#، تعداد زیاد تستها زمانی ارزشمند است که توسعهدهنده بتواند هدف هر تست و شرایط اجرای آن را بهسرعت تشخیص دهد. این آموزش در کنار مقایسه اصول DRY و DAMP، روی خوانایی تستها و الگوهای آمادهسازی Fixture تمرکز دارد. با بررسی الگوی `SUT Factory` یاد میگیرید ساخت شیء مورد آزمایش را از جزئیات تکراری آمادهسازی جدا کنید و تستهایی بنویسید که رفتار مورد انتظار را واضحتر نشان دهند. این مباحث بهویژه در مجموعه تستهایی کاربرد دارند که وابستگیهای متعدد یا مراحل آمادهسازی پیچیده دارند.
در ادامه، الگوی `Auto-Mocking Container` بهصورت عملی بررسی میشود؛ رویکردی که میتواند ساخت وابستگیهای آزمایشی را در سناریوهای مناسب سادهتر کند. همچنین مفهوم `Assertion Roulette` مطرح میشود تا بتوانید تستهایی را بهتر تحلیل کنید که چندین Assertion دارند و هنگام شکست، علت دقیق خطا بهسادگی مشخص نیست. آموزش با پرداختن به تست سیستمهای پیچیده و بررسی روشها در پروژههای Enterprise، از مثالهای محدود فراتر میرود. این بخش برای توسعهدهندگانی مفید است که میخواهند ساختار تستهای موجود را بهبود دهند و هزینه فهم، نگهداری و عیبیابی آنها را کاهش دهند.
تست Equality در Entity و Value Object و بررسی هویت
مقایسه دو شیء در C# همیشه به معنای بررسی یکسان بودن تمام ویژگیهای آنها نیست؛ نتیجه مورد انتظار به مدل دامنه و تعریف هویت بستگی دارد. این آموزش تفاوتهای مربوط به `Identity` و `Test-Specific Identity` را بررسی میکند و به تست کردن Equality در `Entity`ها و `Value Object`ها میپردازد. در طراحی دامنه، یک Entity معمولاً با هویت خود شناخته میشود، درحالیکه برابری Value Object به مقادیر تشکیلدهنده آن وابسته است. نوشتن تستهای متناسب با این تفاوتها کمک میکند رفتار مقایسه اشیا را دقیقتر ارزیابی کنید و از خطاهای ظریف در منطق برنامه جلوگیری شود.
بخش `Structural Inspection` نیز به بررسی ساختار اشیا در تستها اختصاص دارد و در کنار مباحث هویت، زاویه متفاوتی برای ارزیابی رفتار کد فراهم میکند. آموزش همچنین به فلسفه طراحی API و بررسی جریان داده در کلاس `Basket` میپردازد؛ موضوعاتی که ارتباط میان طراحی کد و قابلیت تستپذیری آن را روشنتر میکنند. وقتی کلاسها مسئولیتهای مشخصی داشته باشند و جریان داده قابلردیابی باشد، نوشتن تستهای هدفمند آسانتر میشود. این رویکرد برای برنامهنویسانی مناسب است که روی مدلهای دامنه، منطق تجاری و کدهای Enterprise کار میکنند و به دنبال تستهایی فراتر از بررسی ساده خروجی متدها هستند.
سرفصل مطالب آموزش ویدئویی پیشرفته ی Unit Testing در تست نرم افزار
فصل اول: مقایسه ی اصل DRY و DAMP- مقدمه
- تست ها به عنوان یک حاشیه ی امن
- معرفی اصل DRY
- انجام ریفکتورینگ کور کورانه
- معرفی اصل DAMP
- چرا باید به تست ها اعتماد کرد؟
- تست های Readable
- Fail شدن تست ها و اهمیت آن
- جمع بندی
- مقدمه
- تست های قابل شکستن
- تست های چهار فازی
- معرفی یک مثال
- الگوهای بخش Fixture Setup از تست ها
- الگوی Test Data Builder
- الگوی Object Mother
- الگوی Fluent Builder
- پیاده سازی عملی الگوی Test Data Builder
- الگوی SUT Factory
- الگوی SUT Mother
- الگوی SUT Builder
- پیاده سازی عملی SUT Factory
- الگوی Auto-Mocking Container
- پیاده سازی عملی الگوی Auto-Mocking Container
- الگوی Fixture Object
- پیاده سازی الگوی Fixture Object
- ترکیب الگوی Fixture Object و Test Data Builder
- جمع بندی
- مقدمه
- الگوهای Verification
- تست کردن سیستم های پیچیده
- تفاوت سیستم های Complex و Complicated
- روش سنتی TDD
- معرفی تکنیک Structural Inspection
- تکنیک Structural Inspection و Behavior Verification
- فلسه ی API Design
- واکنش های معمول برنامه نویسان به TDD
- انجام Unit Testing
- اثبات عملکرد صحیح کلاس Discount
- انجام Behavior Verification بر روی کلاس Basket
- پیاده سازی عملی Data Flow در کلاس Basket
- ترکیب کردن Knowledge ها
- پیاده سازی عملی Behavior مربوط به کلاس BasketTotalVisitor
- اطمینان حاصل کردن از یک روش Facade
- پیاده سازی عملی یکپارچه سازی کلاس BasketPipeline
- بررسی روش مذکور رو پروژه های Enterprise
- جمع بندی
- مقدمه
- انجام Verification برای روی DAMP Result
- اهمیت Identity
- Object Type ها
- Value Object ها
- تست کردن Equality مربوط به Value Object ها
- اینترفیس IEquatable جنریک
- تست کردن اینترفیس IEquatable جنریک
- انجام Structural Inspection بدون Property ها
- آموزش عملی تست کردن Equality مربوط به Value Object ها
- تست کردن Equality مربوط به Entity ها
- تست کردن Equality مربوط به Service ها
- آموزش عملی تست کردن Service ها با Identity مربوط به Value Object ها
- جمع بندی
- مقدمه
- مبحث Equality Pollution
- Comparer چیست؟
- مبحث Assertion Roulette
- Concrete Comparer چیست؟
- تست های ریفکتور شده
- Interface Comparer چیست
- تست های ریفکتور شده قسمت دوم
- آموزش عملی Composite Comparer
- مبحث Resemblance
- انجام تست بدون DSL
- Static Helper Method ها
- مبحث Likeness
- مبحث Semantic Comparison
- استفاده از Likeness به عنوان Resemblance
- جمع بندی







