- در اینجا اگر نمیتونید از وهله سازی خودکار توسط DI Container استفاده کنید، میشود آنرا دستی هم انجام داد. اصطلاحا به آن Service locator گفته میشود. نمونه آنرا در استفاده از ObjectFactory.GetInstance در قسمت 12 دیدهاید (استفاده از الگوی واحد کار و کلاسهای سرویس تهیه شده در یک برنامه کنسول ویندوزی ).
پروژهی DNTIdentity به ASP.NET Core 2.1 ارتقاء داده شد.
- مشاهدهی لیست کامل تغییرات
برای اجرای آن فقط کافی است:
- ابتدا SDK جدید را نصب کنید.
- سپس مجوز SSL آنرا تبدیل به مجوز امن و قابل اطمینان کنید.
- در ادامه به پوشهی DataLayer مراجعه کرده و ابتدا دستور dotnet restore را صادر کنید. بعد از آن دو فایل cmd موجود در آنرا اجرا کنید. فایل اول مهاجرتها را تولید میکند و فایل دوم، آنها را به بانک اطلاعاتی از نوع LocalDB اعمال خواهد کرد. بانک اطلاعاتی تولید شده را در پوشهی wwwroot/App_Data میتوانید مشاهده کنید.
- در آخر به پوشهی اصلی برنامه مراجعه کرده و دو فایل bat موجود در آنرا اجرا کنید. اولی وابستگیها را بازیابی میکند و دومی برنامه را کامپایل کرده و سپس بر روی پورت SSL 5001 ارائه میدهد که بلافاصله در مرورگر قابل مشاهده خواهد بود.
برای اجرای این مراحل نیاز به IDE خاصی ندارید. همینقدر که SDK جدید را نصب کرده باشید، کافی است.
پروژهی DNTIdentity به ASP.NET Core 2.0 ارتقاء داده شد.
- مشاهدهی لیست کامل تغییرات
برای اجرای آن فقط کافی است
- ابتدا SDK جدید را نصب کنید.
- سپس به پوشهی DataLayer مراجعه کرده و ابتدا دستور dotnet restore را صادر کنید. بعد از آن دو فایل cmd موجود در آنرا اجرا کنید. فایل اول مهاجرتها را تولید میکند و فایل دوم، آنها را به بانک اطلاعاتی از نوع LocalDB اعمال خواهد کرد. بانک اطلاعاتی تولید شده را در پوشهی wwwroot/App_Data میتوانید مشاهده کنید.
- در آخر به پوشهی اصلی برنامه مراجعه کرده و دو فایل bat موجود در آنرا اجرا کنید. اولی وابستگیها را بازیابی میکند و دومی برنامه را کامپایل کرده و سپس بر روی پورت 5000 ارائه میدهد که بلافاصله در مرورگر قابل مشاهده خواهد بود.
برای اجرای این مراحل نیاز به IDE خاصی ندارید. همینقدر که SDK جدید را نصب کرده باشید، کافی است.
اولین پروژه
معمولا برای شروع از تاریخچه و توضیحات دیگر استفاده میکنند اما روش آموزشی که در پیش خواهیم گرفت با انجام پروژههای عملی بوده و هر جا که نیاز به توضیح باشد ، بیان میکنیم ...
ایجاد اولین پروژه Win32 Console Application
ویژوال استادیو را اجرا نمایید و از گزینه File -> New -> Project و سپس طبق عکس زیر پروژه Win32 Console Application را انتخاب نمایید ، دقت کنید که زبان انتخاب شده ++Visual C باشد.
در این مرحله میتوانید محل ذخیره شده پروژه را در قسمت Location تنظیم نمایید و از قسمت Name میتوانید نام دلخواه را وارد کنید در حالت پیش فرض اگر اولین پروژه Win32 Console در مسیر تعین شدهی قسمت Location باشد ، نام ConsoleApplication1 قرار گرفته است . پس از تنظیمات Ok کنید .
در این مرحله Next را بزنید .
در این مرحله در قسمت Additional options تیک Empty project را بزنید ، همانند عکس فوق تنظیمات را انجام دهید .
پس از انجام مراحل فوق پروژه بصورت شکل زیر ظاهر میشود .
برای کد نویسی روی نام پروژه که در اینجا ConsoleApplication1 میباشد ، راست کلیک میکنیم و گزینه Add و سپس New Item را انتخاب میکنیم .
طبق عکس زیر فایل با پسوند cpp را انتخاب و Add میکنیم .
فایلی که اکنون به پروژه اضافه کردیم خالی و با نام پیش فرض Source.cpp میباشد ، دستورات زیر را در آن تایپ کنید .حال پروژه به شکل زیر خواهد بود .
#include<iostream> int main() { std::cout<<"Hello world ...\n"; return 0; }
برای اجرای پروژه کلید F5 را فشار دهید و اگر میخواهید نتیجه کار را مشاهده کنید کلید Ctrl + F5 را امتحان کنید .
شما اولین پروژه VC++ را اجرا نمودید ( آفرین ) .
اما توضیحات :
خط اول برنامه یک راهنمای پیش پردازنده است ، کاراکتر # که نشان میدهد این خط یک راهنمای پیش پردازنده است و بعد عبارت include و نام یک فایل کتابخانه ای که بین علامت <> قرار داده شده ، فایل سرآیند استفاده شده در اینجا iostream میباشد . (به فایلهای کتابخانه ای ، فایلهای سرآیند (Header Files) نیز گفته میشود. ) راهنمای پیش پردازنده خطی است که به کامپایلر اطلاع میدهد در برنامه موجودیتی است که تعریف آن را در فایل سرآیند مذکور جستجو کند . در این برنامه از std::cout استفاده شده ، که کامپایلر در مورد آن چیزی نمیداند لذا به فایل iostream مراجعه نموده ، تعریف آن را مییابد و آن را اجرا میکند .
خط 3 :
بخشی از هر برنامه تابع میباشد . پرانتزهای واقع پس از آن main نشان میدهند که main یک بلوک برنامه بنام تابع است. برنامهها میتوانند حاوی یک یا چندین تابع باشند، اما main تابع اصلی برنامه است که وجود آن الزامی میباشد . کلمه کلیدی int که در سمت چپ main قرار گرفته، بر این نکته دلالت دارد که main یک مقدار صحیح برمیگرداند.
خط 5 :
با استفاده از این دستور رشته ای را به خروجی استاندارد که معمولا صفحه نمایش باشد ارسال میکنیم .
خط 6 :
که ;0 return میباشد مقدار برگشتی تابع را مشخص میکند در حقیقت این خط که مقدار 0 را برمیگرادند نشان دهنده اتمام موفقیت آمیز برنامه میباشد .
به مرور زمان نسبت به موارد بالا بیشتر و مفصل صحبت خواهیم نمود .
git branch [branch name]
git branch
git checkout [branch name]
git checkout -b [branch name]
تذکر:
در صورتیکه working tree تقریبا clean نباشد، یعنی تغییراتی در فایلها صورت گرفته باشد که این تغییرات هنوز در repository ذخیره نشده باشند، git امکان تعویض شاخه را نخواهد داد. علت تقریبا به این جهت است که در مواردی git میتواند برخی تفاوتها را نادیده بگیرد؛ مثلا اگر فایلی در شاخهی دیگر وجود نداشته باشد. در این حالت سه راهکار پیش روی کاربر است:
برای حذف یک شاخه ایجاد شده از دستور زیر استفاده میشود:
git branch -d [branch name]
git branch -m [old name][new name]
git merge [branch name]
تداخل یا conflict:
git merge --abort
git merge --continue
git stash save "[stash name]"
git stash list
stash@{number}
git stash show stahs@{[number]}
git stash Drop [stash name]
git stash clear
به مثالهای زیر و شکل شاخهها بعد از اعمال دستورات merge و rebase توجه کنید :
در شاخه master فایل readme5 اضافه شده و در شاخه a2 فایل readme4 اضافه شده و بعد تغییری در آن ذخیره شده است
شاخه a1 در master ادغام شده است
شکل درختی شاخهها پس از ادغام
شکل شاخهها بعد از اعمال rebase
همانطور که مشاهده میشود با سوئیچ به شاخه master هنوز head در محل قبلی خود است
با اعمال دستور ادغام، head به محل آخرین commit منتقل میشود
بعد از انجام دستور rebase باید از دستور merge استفاده کرد. زیرا هر شاخه برای خود head جداگانهای دارد. بعد از اجرای این فرمان، هنوز head در شاخه مقصد به آخرین فرمان خود اشاره میکند. در آخرین فرمان، شاخهای اضافه شده، بنابراین اجرای دستور merge حالت fast forward را پیاده میکند و head به آخرین commit منتقل میشود.
تذکر:
git rebase [destination branch]
git rebase [destination][source]
به تفاوت محل درج ادغامها در merge و rebase توجه کنید.
git cherry-pick [branch name]
- polyfills.js : برای ساختن برنامههای سازگار با انواع مرورگرها میباشد. به دلیل اینکه وقتی کدها را با جدیدترین ویژگیها مینویسیم، ممکن است که همهی مرورگرها توانایی پشتیبانی از آن ویژگیها را نداشته باشند.
- scripts.js : شامل اسکریپتهایی میباشد که در بخش scripts، در فایل angular.json تعریف کردهایم.
- webpack loader : runtime.js میباشد. این فایل شامل webpack utilitiesهایی میباشد که برای بارگذاری دیگر فایلها مورد نیاز است.
- styles.css : شامل style هایی است که در بخش styles، در فایل angular.json تعریف کردهایم.
- main.js : شامل تمامی کدها از قبیل کامپوننتها ( کدهای مربوط به css ، html ، ts) ، دایرکتیوها، pipes و سرویسها و ماژولهای ایمپورت شده از جمله third partyهای میباشد.
npm install --save-dev webpack-bundle-analyzer
"bundle-report": "ng build --prod --stats-json && webpack-bundle-analyzer dist/stats.json"
"bundle-report": "ng build --prod --stats-json && webpack-bundle-analyzer dist/YourApplicationName/stats.json"
npm run bundle-report
- در این حالت مرورگر منتظر میماند تا فونت دانلود شود و آن را parse کند و تنها بعد از آن متن را بر روی صفحه نمایش میدهد. متن روی صفحه تا زمانیکه فونت دانلود و parse نشده باشد، قابل مشاهده نیست؛ این FOIT است (Flash of invisible text) .
- مرورگر در ابتدا متن را با استفاده از فونت معمول نمایش میدهد و بعد از آن سعی میکند که ساختارهای فونت خارجی را دریافت کند. وقتی که دانلود انجام شد و سپس آن را parse کرد، فونت سفارشی دانلود شده، با فونت معمول جایگزین خواهد شد؛ این FOUT است ( Flash of unstyled text ).
در این مطلب نحوهی استفاده از ReportGenerator را برای ایجاد گزارش مربوط به Code coverage، ارائه میدهیم. ReportGenerator دیتاهای تولید شدهی توسط coverlet, OpenCover, dotCover, Visual Studio, NCover, Cobertura, JaCoCo, Clover و ... را به یک گزارش قابل درک در فرمتهای Html, Coberura و CSV تبدیل میکند. در این مطلب چند موردتست نویسی با xUnit در Asp.Net Core را نوشتهام و اکنون میخواهیم برای تستهای نوشته شده، Code coverage آنها را بدست آوریم.
در کد زیر، سه تست برای متد AverageUsersAge نوشته شده است:
[Fact] public async Task AverageUsersAge_When_Repository_Return_Null_Then_Zero_Should_Be_Returned() { _userRepository.Setup(a => a.GetAllUsers()) .ReturnsAsync((List<User>)null); var result = await _userService.AverageUsersAge(); result.Should().Be(0); } [Fact] public async Task AverageUsersAge_When_Repository_Return_Empty_Then_Zero_Should_Be_Returned() { _userRepository.Setup(a => a.GetAllUsers()) .ReturnsAsync(new List<User>()); var result = await _userService.AverageUsersAge(); result.Should().Be(0); } [Fact] public async Task AverageUsersAge_When_Repository_Return_List_Of_Users_Then_Average_Of_Age_Should_Be_Retunred() { _userRepository.Setup(a => a.GetAllUsers()) .ReturnsAsync(UserMockData.People); var result = await _userService.AverageUsersAge(); var expected = (UserMockData.AdultUser.Age + UserMockData.ChildUser.Age + UserMockData.InfantUser.Age) / 3; result.Should().Be(expected); }
dotnet tool install -g dotnet-reportgenerator-globaltool
dotnet test --collect:"XPlat Code Coverage"
reportgenerator -reports:"C:\Users\Farhad\source\repos\xUnitExample\xUnitExample.Tests\TestResults\*\coverage.cobertura.xml" -targetdir:"coveragereport" -reporttypes:Html
2021-11-18T14:05:02: Arguments 2021-11-18T14:05:02: -reports:C:\Users\Farhad\source\repos\xUnitExample\xUnitExample.Tests\TestResults\*\coverage.cobertura.xml 2021-11-18T14:05:02: -targetdir:coveragereport 2021-11-18T14:05:02: -reporttypes:Html 2021-11-18T14:05:02: Writing report file 'coveragereport\index.html' 2021-11-18T14:05:02: Report generation took 0.3 seconds
در عکس ارسال شده، تستهای نوشته شده برای تمامی لایهها به صورت جدا ایجاد شدهاست.
تست مربوط به UserService:
در عکس بالا قسمتهایی که تست شدهاند، با رنگ سبز مشخص میشود و اگر قسمتی از کد تست نشده باشد، با رنگ قرمز مشخص میشود.
برای مثال در عکس زیر مشخص شدهاست که برای فایل ApplicationConfiguration هیچ تستی نوشته نشدهاست.
اگر از CICD استفاده میکنید، میتوانید در قسمت CI پروژه، هربار دستورات بالا را اجرا کنید و Code coverage مربوط به هر Build را به صورت جداگانه در کنار فایلهای آپلود شده داشته باشد.
نکته: برای اجرای دستورات بالا و ساخت گزارش باید ورژن SDK نصب شده بر روی سیستم شما برابر 2.2.401 یا بیشتر باشد و ورژن Microsoft.NET.Test.Sdk برابر 16.5.0 یا بیشتر باشد.