You are on page 1of 75

‫‪ASP .

NET‬‬
‫‪Core 3.0‬‬
‫}پیشرفته{‬

‫‪2019‬‬
‫مدرس‪ :‬علیرضا ارومند‬ ‫‪www.NikAmooz.com‬‬

‫جلسه دوم‬
‫معرفی علیرضا ارومند‬
‫‪ .1‬مدرس و مشاور ‪ASP.NET Core‬و معماریهای نرمافزاری (نیک آموز)‬
‫‪ .2‬مدیر فنی خبرگزاری نسیم‬
‫‪ .3‬کارشناس ارشد توسعه نرم افزار داتین (فناپ)‬
‫‪ .4‬کارشناس ارشد توسعه نرم افزار ارتباط فردا (بانک آینده)‬
‫‪ .5‬متخصص انجام پروژههای وب و ‪.NET‬‬
‫‪ .6‬و‪...‬‬
‫‪xUnit‬‬

‫مدرس‪ :‬علیرضا ارومند‬


‫چه خواهیم آموخت؟‬
‫‪ .1‬چرا تست اتوماتیک؟‬
‫‪ .2‬چه تستهایی باید داشته باشیم؟‬
‫‪ .3‬آشنایی با هرم تست نرم افزار‬
‫‪ .4‬معرفی ‪xUnit‬‬
‫‪ Mock .5‬چیست؟‬
‫اهمیت کیفیت نرم افزار‬
‫‪ .1‬کاربران راضی‬
‫‪ .2‬توسعه دهندگان راضیتر‬
‫‪ .3‬روئسای خوشحال تر‬
‫تست اتوماتیک یا دستی‬
‫تست دستی‬ ‫تست اتوماتیک‬
‫خطای بیشتر‬ ‫خطای کمتر‬
‫هزینه نیروی انسانی‬ ‫هزینه توسعه و نگهداری‬
‫هزینه به ازای تمام اجراها یکسان اجرای چندین باره کم هزینه‬
‫یافتن خطای سریع‬ ‫یافتن خطا با تاخیر‬
‫نگهداری با سورس‬ ‫وابسته به فرد‬
‫انواع تست‬
UI Subcutaneous

Integration UnitTest
‫آهسته‬
‫پیچیده‬ ‫‪UI‬‬
‫شکننده‬
‫فراگیر‬ ‫‪Subcutaneous‬‬

‫‪Integration‬‬ ‫سریع‬
‫ساده‬
‫‪Unit‬‬ ‫باثبات‬
‫کاربرد انواع تست‬
View Rendering
Controller Infrastructures

UU
UUUII UII

Model UI

UUUUUUI Web API UiUi

SSSS
‫نکته‬
‫‪ .1‬هرم تست تنها راهنمایی است‬
‫‪ .2‬کاربرد در اغلب موارد‬
‫‪ .3‬هر کاری باید ارزشمند باشد‬
‫ در تست نرم افزار‬AAA

Arrange Act Assert


‫‪ xUnit‬چیست‬

‫‪ .1‬کتابخانهی رایگان‬
‫‪Open Source .2‬‬
‫‪ .3‬توسعه توسط اعضای ‪NUnit‬‬
‫پشتیبانی از‬

.NET Core . NET Full

UWP Xamarin

.NET Standard
‫مراحل ایجاد‬
‫‪ .1‬ایجاد پروژه ای برای تست‬
‫‪ .2‬افزودن ‪xUnit‬‬
‫‪ .3‬ایجاد رابطه با پروژه هدف‬
‫مراحل اجرا‬
‫‪ .1‬نوشتن تابع تست‬
‫‪ .2‬اجرای تابع تست‬
Test Runner ‫معرفی‬
‫ مسئول اجرای توابع تست‬.1
Test Framework ‫ وابسته به‬.2
Vs Test Explorer .3
.NET Core CLI .4
Third-Party .5
‫بررسی ساختار پروژه و تست‬
‫نام گذاری تست‬
MethodName_StateUnderTest_ExpectedBehavior .1
MethodName_ExpectedBehavior_StateUnderTest .2
test[Feature being tested] .3
Should_ExpectedBehavior_When_StateUnderTest .4
When_StateUnderTest_Expect_ExpectedBehavior .5
‫‪ Assert‬و کاربرد آن‬
‫‪ .1‬نتیجه ‪ Act‬را بررسی میکند‬
‫‪ .2‬در صورت صحیح بودن همه تست پاس‬
‫‪ .3‬در صورت ناموفق بودن یکی کال ناموفق‬
‫انواع ‪Assert‬‬

‫‪ .1‬بررسی مقادیر ‪Boolean‬‬


‫‪ .2‬توابع مختلف کار با رشتهها‬
‫‪ .3‬انواع بررسی برای اعداد‬
‫‪ .4‬امکان کار با مجموعهها‬
‫‪Event .5‬ها‬
‫چند ‪ Assert‬نیاز داریم؟‬

‫‪ .1‬حداقل یکی برای هر تست‬


‫‪ .2‬محدودیت نداریم‬
‫‪ .3‬پوشش تمام حاالت ضروری‬
‫‪Exception‬ها‬
‫‪ .1‬تمامی حاالت خطا بررسی میشود‪.‬‬
‫‪ Throws .2‬بررسی خطای ارسالی‬
‫تعداد تست ها زیاد میشود‬

‫مدیریت کدها سخت تر میشود‬

‫اجرای تستها زمانگیر‬

‫تستهای ناکارمد‬
‫دسته بندی تستها‬
‫‪ .1‬استفاده از ‪Trait‬‬
‫‪ .2‬امکان اجرای دستهای از تستها‬
‫‪ .3‬میتوان فیلتر انجام داد‬
‫غیرفعال کردن تست‬

‫‪ .1‬مقداردهی به ‪Skip‬‬
‫‪ .2‬غیر فعال سازی موقف‬
‫‪ .3‬عدم نیاز به ‪ Comment‬کردن‬
‫‪ .4‬مناسب برای شرایط موقت‬
‫ایجاد خروجی‬

‫‪ .1‬خروجیهای معمول کار نمیکند‬


‫‪ .2‬استفاده از ‪ITestOutputHelper‬‬
‫‪ .3‬خروجی بعد از اجرا قابل مشاهده‬
‫یافتن کالسهای‬ ‫‪DRY‬‬
‫شامل تست‬

‫ایجاد نمونه برای‬


‫نمایش نتیجه‬
‫هر تست‬

‫اجرای هر تست‬
‫اشتراک منابع‬

‫‪ .1‬تولید و نگهداری منابع پرهزینه‬


‫‪ .2‬نیاز به اشتراک منابع بین تستها‬
‫‪ .3‬استفاده از ‪IClassFixture‬‬
‫‪ .4‬عدم تخریب تست با اشتراک‬
‫اشتراک منابع بین کالسها‬
‫‪ .1‬ایجاد کالس ‪CollectionFixture‬‬
‫‪ .2‬تعیین نام مجموعه ‪CollectionDefenition‬‬
‫‪ .3‬معرفی به کالسها با ‪Collection‬‬
‫دادههای ورودی و تست‬
‫‪ .1‬اجرای سناریو تست برای دادههای مختلف‬
‫‪ .2‬هزینه باالی نگهداری چندین تست‬
‫روشهای تامین داده‬
External
Inline Data Prop/Field/Method Custom Attribute
DataSource

Local/ Developer Shared/Developer Shared / Developer Shared / Everyone


Inline Data
Theory ‫ ساخت تست با‬.1
InlineData ‫ ارسال اطالعات با‬.2
‫اشتراک اطالعات‬

‫‪ .1‬عدم امکان اشتراک در روش ‪Inline‬‬


‫‪ .2‬امکان تامین داده ها از اعضای کالس‬
‫‪ .3‬معرفی با ‪MemberData‬‬
‫ اختصاصی‬Attribute ‫توسعه‬
DataAttribute ‫ ارث بری از‬.1
GetData ‫ باز نویسی‬.2
‫‪Moq‬‬

‫مدرس‪ :‬علیرضا ارومند‬


‫چه خواهیم آموخت؟‬
‫‪ Moq .1‬چیست؟‬
‫‪ .2‬بازگشت مقادیر دلخواه‬
‫‪ .3‬تایید عملکرد صحیح کالسها‬
‫‪... .4‬‬
‫نگاهی کلی به ‪Mocking‬‬
‫‪ .1‬برنامه بخش های مختلفی دارد‬
‫‪ .2‬نیاز به تست یک قسمت بدون سایر بخشها‬
‫‪ .3‬تامین وابستگیها به کمک ‪Mocking‬‬
‫تعریف‬
‫جایگزینی نسخههای عملیاتی وابستگیهای‬
‫برنامه با نسخههایی صرفا جهت تست برنامه را‬
‫‪ Mocking‬گویند‬
‫چرا ‪Mocking‬؟‬

‫‪ .1‬افزایش سرعت تست‬


‫‪ .2‬امکان توسعه موازی‬
‫‪ .3‬افزایش قابلیت اطمینان به تستها‬
‫‪ .4‬کاهش هزینههای تست برنامه‬
‫‪Test doubles‬‬
‫‪ .1‬هر چیزی که جایگزین شی اصلی شود‬
‫‪ .2‬با هدف کاهش وابستگی‬
‫‪Fakes‬‬

‫‪ .1‬یک نسخه عملیاتی از وابستگی‬


‫‪ .2‬برای محیط نهایی مناسب نیست‬
‫‪ .3‬برای مثال ‪EF In memory Provider‬‬
‫‪Dummies‬‬
‫‪ .1‬یک نسخه غیر عملیاتی از وابستگی‬
‫‪ .2‬هیچ کاربردی ندارد‬
‫‪ .3‬صرفا جهت تامین پارامترها است‬
‫‪Stubs‬‬

‫‪ .1‬یک نسخه عملیاتی از وابستگی‬


‫‪ .2‬تامین دادههای بازگشتی از متدها و خواص‬
‫‪Mocks‬‬

‫‪ .1‬یک شی جهت شبیه سازی وابستگی‬


‫‪ .2‬بخشهای مورد نیاز را شبیه سازی میکنیم‬
Test Doubles‫ و پشتیبانی از‬Moq
Dummies .1
Stubs .2
Mocks .3
‫آشنایی با ‪Moq‬‬
‫‪ .1‬یک پروژه ‪Open Source‬‬
‫‪ .2‬بیش از ‪ 32‬میلیون دانلود از ‪Nuget‬‬
‫اهداف طراحی‬
‫‪ .1‬سادگی در طراحی‬
‫‪ .2‬ارائه راهکاریهای عملیاتی به جای آکادمیک‬
‫‪ .3‬استفاده ساده و راحت‬
‫نصب ‪Moq‬‬

‫‪ .1‬دانلود و نصب از روی ‪Nuget‬‬


‫‪ .2‬افزودن ‪ using Moq‬به کالسهای تست‬
‫ایجاد نمونه از ‪Mock Object‬‬
‫‪ .1‬ایجاد نمونه از کالس ><‪Moq‬‬
‫‪ .2‬نگهداری نمونه کالس در ‪Object‬‬
‫تعیین مقدار خروجی از متدها‬
‫‪ .1‬متد ‪ Setup‬برای انتخاب متد دلخواه‬
‫‪ .2‬بازگشت مقدار دلخواه با ‪Returns‬‬
‫‪Argument Matching‬‬
‫‪ .1‬استفاده از کالس ‪It‬‬
‫‪ .2‬تابع ‪ IsAny‬یعنی هرمقداری‬
‫‪ .3‬تابع ‪ Is‬برای ارسال شرط به جای هرمقداری‬
‫‪Argument Matching‬‬
‫‪ IsIn .4‬بررسی وجود ورودی در لیست اشیا‬
‫‪ IsInRange .5‬برای تعیین محدوده مقبول‬
‫‪ IsRegex .6‬بررسی ‪ Regex‬روی ورودی‬
Loose ‫ و‬Strict ‫های‬Mock
‫کردن‬Setup ‫ عدم نیاز به‬Loose .1
‫ کردن متدها‬Setup ‫ اجبار به‬Strict .2
‫‪Mock‬های ‪ Strict‬و ‪Loose‬‬
‫‪ .3‬حالت پیشفرض ‪Loose‬‬
‫‪ .4‬امکان تنظیم هنگام نمونه سازی ‪Mock‬‬
‫‪Loos‬‬ ‫‪strict‬‬
‫‪ Setup‬ساده‬ ‫مراحل ‪ Setup‬سخت تر‬

‫بازگرداندن مقادیر پیشفرض‬ ‫تعیین مقدار برای هر متد‬

‫کمتر به مشکل میخورد‬ ‫با کوچکترین تغییری تست ‪ Failed‬میشود‬

‫تستهای جاری با تغییر کالس ادامه پیدا میکند‬ ‫تستهای موجود متوقف میشود‬
‫نکته‬
‫فقط زمانی که اجباری وجود دارد از حالت‬
‫‪ Strict‬استفاده کنید و در سایر موارد حالت‬
‫‪ Loos‬که پیشفرض سیستم هم میباشد بهترین‬
‫انتخاب است‪.‬‬
‫‪ Mock‬و پارامترهای ‪Out‬‬
‫‪ .1‬مقدار را در ‪ Setup‬ارسال میکنیم‬
‫‪ .2‬نیازی به ‪Returns‬ندارد‬
‫‪ Mock‬کردن ‪Properties‬‬
‫‪ .1‬استفاده از ‪Setup‬‬
‫‪ .2‬تعیین خروجی به کمک ‪Returns‬‬
‫خواص تو در تو‬

‫‪ .1‬خاصیت میتواند شامل خاصیت دیگر باشد‬


‫‪ .2‬پیاده سازی خواص تو در تو سخت و زمانبر‬
‫‪ Auto-Mocking‬خواص تو در تو‬
‫‪ .1‬تنظیم داخلیترین ‪Property‬‬
‫‪ .2‬حجم کدنویسی کاهش مییابد‬
‫مقادیر پیشفرض‬
Default ‫ها مقدار‬Value Type ‫ برای‬.1
‫ها‬Value Type ‫ برای‬Null .2
‫مقادیر پیشفرض‬
‫‪ .3‬مجموعه خالی برای مجموعهها‬
‫‪ .4‬تغییر عملکرد با خاصیت ‪DefaultValued‬‬
‫نگهداری تغییرات‬
‫‪ .1‬به صورت پیشفرض نگهداری نمیشود‬
‫‪ .2‬استفاده از ‪SetupProperty‬‬
‫‪ .3‬در صورت زیاد بود ‪SetupAllProperties‬‬
‫تست وضعیت‬
‫‪ .1‬سیستم اجرا میشود‬
‫‪ .2‬وضعیت سیستم چک میشود‬
‫‪ .3‬اغلب تست های موجود از این گروه است‬
‫تست عملکرد‬
‫‪ .1‬وضعیت سیستم مهم نیست‬
‫‪ .2‬اجرا شدن بخش خاصی از کد مهم است‬
‫‪ .3‬مثال صدا زده شدن تابع به تعداد خاص‬
‫بررسی صدا زدن تابع‬
‫‪ .1‬انتخاب تابع مورد نظر به کمک ‪Verify‬‬
‫‪ .2‬عدم صدا زدن تابع برابر با خطا در تست‬
‫‪ .3‬امکان ارسال پیام خروجی برای ‪Verify‬‬
‫بررسی تعداد دفعات صدا زدن‬
‫‪ .1‬انتخاب تابع مورد نظر به کمک ‪Verify‬‬
‫‪ .2‬ارسال تعداد به پارامتر ‪Times‬‬
‫‪ .3‬بررسی عدم صدا زدن با ‪Times.Never‬‬
‫بررسی صدا زدن ‪ Getter‬خواص‬
‫‪ .1‬استفاده از ‪VerifyGet‬‬
‫‪ .2‬امکان بررسی تعداد دفعات مانند توابع‬
‫بررسی صدا زدن ‪ Setter‬خواص‬
‫‪ .1‬استفاده از ‪VerifySet‬‬
‫‪ .2‬امکان تعیین مقدار مورد انتظار‬
‫‪ .3‬تعداد مراجعه مانند قبل قابل بررسی‬
Exception ‫ایجاد‬
Returns ‫ به جای‬Throws ‫ استفاده از‬.1
Generic ‫ با‬Exception ‫ امکان تعیین نوع‬.2
‫بازگشت مقادیر مختلف‬
‫‪ .1‬استفاده ‪SetupSequence‬‬
‫‪ .2‬امکان تنظیم چندین ‪Returns‬‬
‫‪ Moq‬و کالسهای ‪Concrete‬‬
‫‪ .1‬بهتر است ‪ Interface‬داشته باشیم‬
‫‪ .2‬متدها باید قابلیت بازنویسی داشته باشند‬
‫‪ .3‬در صورت اجبار باید متدها ‪Virtual‬‬
‫‪ Moq‬و مقادیر ‪Protected‬‬
‫‪ .1‬باید توابع و خواص قابل مشاهده باشد‬
‫‪ .2‬افزودن ‪Moq.Protected‬‬
‫‪ Moq‬و مقادیر ‪Protected‬‬
‫‪ .4‬نوع بازگشتی به صورت ‪Generic‬‬
‫‪ .5‬انتخاب ورودی به صورت رشته‬
‫شبکههای اجتماعی نیک آموز‬
‫اطالع رسانی سریع کارگاههای نسبتا رایگان‪،‬‬
‫کوپنهای تخفیف‪ ،‬مقالت‪ ،‬فیلم و دورههای نیک آموز‬

You might also like