آزمون واحد در NET Core. با استفاده از MSTest

پیش از این با مفهوم آزمون واحد و انواع آزمون های واحد آشنا شدید و چنذ آزمون واحد با استفاده از xUnit و NUnit نوشتید.اکنون نوبت آن رسیده است که با استفاده از MSTest یک آزمون واحد کامل بر روی یک تابع کاملتر بنویسید
پیش از این آزمون واحد ساده ای را تمرین کردید که تابعی را که به صورت ناقص نوشته بود و فقط عدد اول بودن عدد 2 را میتوانست تشخیص دهد می سنجید.
اکنون تصمیم داریم تابعی بنویسیم که میتواند عدد اول بودن ورودی را تشخیص دهد ، همانطور که می دانید اصل TDD میگوید ابتدا آرمون واحد کد را بنوسید.
“در مطالب قبلی بارها به این موضوع اشاره شد اما امروز با یک مثال کامل این اصل را درک خواهید کرد.”
ایجاد پروژه
-
سولوشن جدید با عنوان unit-testing-using-mstest ایجاد کنید.
-
پروژه PrimeService را ایجاد کرده و به سولوشن ساخته شده اضافه کنید.
-
با استفاده از دستور dotnet new mstest یک پروژه تست ایجاد کرده و سپس آنرا به سولوشن اضافه کنید.
فایل class1 را به PrimeService تغییر نام داده و کد زیر را داخل آن قرار دهید:
public bool IsPrime(int num)
{
if (num == 1)
{
return false;
}
throw new NotImplementedException("Please create a test first.");
}
هدف این است که کد تابع موجود در شروع به ساده ترین شکل ممکن نوشته شده و در آینده از طریق آزمون ها کامل شود.
اکنون شما یک تابع بسیار ساده نوشته اید که فقط میتواند عدد اول نبودن عدد “1” را تشخیص دهد، بیایید با توسعه آزمون واحد این تابع را کامل کنیم.
فایل UnitTest1.cs را به PrimeServiceTest تغییر نام داده و کد زیر را داخل آن بنویسید:
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Prime.Services;
namespace Prime.UnitTests.Services
{
[TestClass]
public class PrimeServiceTest
{
PrimeService primeService;
[TestInitialize]
public void TestInitialize()
{
primeService = new PrimeService();
}
[TestMethod]
public void IsPrimeOne()
{
var result = primeService.IsPrime(1);
Assert.IsFalse(result, $"{1} is not prime");
}
}
}
- صفت [TestClass] ،کلاس تست را به اجرا کننده آزمون معرفی میکند .
- صفت [TestMethod] ، تابع تست را به اجرا کننده آزمون معرفی میکند .
- صفت [TestInitialize] ، تابع مورد استفاده قبل از اجرای آزمون را برای تخصیص و پیکربندی منابع مورد نیاز همه آزمونهای کلاس آزمون مشخص می کند.
اکنون برنامه را تست کنید.
آزمون تایید می شود.
بیایید در ادامه مقدار 2 را در آزمون تست کنیم.
کدهای زیر را به ترتیب به تابع آزمون و تابع IsPrime اضافه کنید:
[DataTestMethod]
[DataRow(-1)]
[DataRow(0)]
[DataRow(1)]
public void IsPrimeTwo(int value)
{
var result = primeService.IsPrime(value);
Assert.IsFalse(result, $"{value} is not prime");
}
- صفت [DataTestMethod] مشخص می کند که تابع آزمون قرار است مقادیر مختلف را دریافت کند.
- صفت [DataRow] مقادیر ارسالی به تابع تست را دریافت می کند.
دستور dotnet test را اجرا کنید ، آزمون با مشکل روبرو می شود ، زیرا تابع نوشته شده فقط عدد 1 را می تواند تست کند .
اکنون دستور زیر را در ادامه دستورات داخلی تابع IsPrime اضافه کنید.
if (num < 2)
return false;
اکنون دوباره تست را اجرا کنید تابع شما میتواند عدد اول نبودن مقادیر کوچکتر از 2 را به درستی مشخص کند.
در ادامه تابع تست دیگری را بنویسید و عدد 3 و 2 را تست کنید تابع شما باز هم پاسخ صحیح را خواهد داد.
در ادامه عدد 4 را تست کنید همانطور که ملاحظه می کنید تابع شما نیاز به تغییر دارد.
اکنون کد زیر را به تابع IsPrime اضافه کنید.
if (num % 2 == 0)
return false;
اگر باقی مانده عدد تقسیم بر 2 برابر با 0 باشد پس عدد وارد شده عدد اول نمی باشد، به این ترتیب تابع می تواند عدد اول بودن اعدادی که بر 2 بخش پذیر می باشند تشخیص دهد.
احتمالا اکنون متوجه یکی از اهداف TDD شده اید و از زاویه دیگری متوجه شده اید که نوشتن آزمون واحد قبل از کد چگونه به تکمیل کدهای پیاده سازی کمک می کند.
در ادامه اعداد 5 6 7 8 را تست کنید می بینید که تابع به درستی عمل می کند.
وقتی عدد 9 را تست می کنید تابع نمی تواند پاسخ صحیح داشته باشد زیرا 9 بر 2 بخشپذیر نمی باشد.
پس کد زیر را نیز به تابع IsPrime اضافه کنید.
if (num % 3 == 0)
return false;
اکنون دوباره تست کنید تابع شما می تواند محاسبه کند که اعدادی که بر 3 بخشپذیر هستند اعداد اول نمی باشند.
اکنون عدد 25 را به تست کنید.
تابع نمی تواند این عدد را تست کند زیرا عدد 25 بر 3 و 2 بخش پذیر نیست، اکنون می توانید کد IsPrime را کمی جامع تر بنویسید و از یک حلقه برای تست بخش پذیر بودن اعداد استفاده کیند
به کد زیر توجه کنید :
for (int i = 2; i < num; i++)
{
if (num % i == 0)
return false;
}
یقینا می توان کد را به صورت بهینه تر و روش های مختلف نوشت ولی در اینجا هدف اصلی یادگیری MsTest بود که سعی شد با یک مثال جامع تر به مساله پرداخت شود
پروژه نمونه را می توانید در مخزن گیت هاب مشاهده کنید.
2 Comments
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
. Net و asb.net با هم فرق دارن؟
NET یک چارچوب نرم افزاری است که اجازه توسعه و اجرای برنامه ها را می دهد در حالی که ASP.NET یک چارچوب وب است که بخشی از دات نت می باشد و امکان ساخت برنامه های وب را فراهم می کند.