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

در مطالب قبلی در مورد انواع آزمون ها،ابزارهای موجود در دات نت برای اجرای آزمون ها و نحوه صحیح نوشتن آزمون ها صحبت شد.یکی از این ابزار xUnit می باشد که در این مطلب شما نحوه آزمون از طریق xUnit در NET Core. را فرا خواهید گرفت.
ایجاد Solution
/sample-unit-testing
sample-unit-testing.sln
/SampleService
SampleService.cs
SampleService.csproj
/SampleService.Tests
SampleService_IsPrimeShould.cs
SampleServiceTests.csproj
- برای شروع PowerShell را اجرا کنید.
- دستور زیر را داخل PowerShell ,Bash و یا Cmd نوشته و اجرا کنید.
dotnet new sln -o sample-unit-testing
دستور dotnet new sln یک سولوشن جدید در پوشهsample-unit-testing
ایجاد می کند.
- با اجرای دستور cd sample-unit-testing به داخل پوشه ایجاد شده رفته و سپس دستور زیر را اجرا کنید
dotnet new classlib -o SampleService
این دستور یک پروژه از نوع Class Library در داخل پوشه SampleService ایجاد می کند که دارای یک کلاس پیشفرض به نام class1 می باشد.
- class1 را به SampleService تغییر نام داده و کد زیر را با کد داخل آن جایگزین کنید :
using System;
namespace Sample.Services
{
public class SampleService
{
public bool IsTrue(int value)
{
throw new NotImplementedException("Not implemented.");
}
}
}
داخل تابع IsTrue در سطر 8 یک Exception از نوع NotImplementedException (به معنای اینکه کدی در داخل تابع نوشته نشده است) بر میگرداند، در ادامه این کد اپدیت خواهید شد.
- برای افزودن پروژه SampleService به سولوشن sample-unit-testing از دستور زیر استفاده کنید:
dotnet sln add ./SampleService/SampleService.csproj
- با اجرای دستور زیر پروژه SampleService.Tests را ایجاد کنید:
dotnet new xunit -o SampleService.Tests
دستور بالا یک پروژه تست با استفاده از xUnit به پوشه سولوشن اضافه کرده و پکیج های زیر را برای اجرای آزمون افزوده و پیکربندی میکند.
- “Microsoft.NET.Test.Sdk”
- “xunit”
- “xunit.runner.visualstudio”
- برای افزودن پروژه تست به سولوشن از دستور زیر استفاده کنید :
dotnet sln add ./SampleService.Tests/SampleService.Tests.csproj
- در ادامه با دستور زیر پروژه SampleService را به پروژه تست به عنوان dependency اضافه کنید:
dotnet add ./SampleService.Tests/SampleService.Tests.csproj reference ./SampleService/SampleService.csproj
ایجاد یک آزمون
یک روش محبوب در توسعه آزمون محور (TDD) نوشتن یک آزمون قبل از اجرای کد هدف است. “در این آموزش از روش TDD استفاده شده است.” تابع IsTrue قابل فراخوانی است ، اما قابل اجرا نمی باشد و نتیجه آزمایش تابع IsTrue ناموفق است. در روش TDD کد هدف برای پذیرفته شدن در آزمون ویرایش می شود و شما مدام این روش را تکرار می کنید ، یک تست می نویسید اگر نتیجه تست نا موفق بود کد هدف را تا زمان اجرای موفق تست ویرایش می کنید.
ویرایش پروژه SampleTest
- فایل UnitTest1.cs را حذف کنید.
- فایل SampleService_IsTrueShould.cs را اضافه کنید.
- کد زیر را داخل فایل SampleService_IsTrueShould.cs بنویسید :
using Xunit;
using Sample.Services;
namespace Sample.UnitTests.Services
{
public class SampleService_IsTrueShould
{
[Fact]
public void IsTrue_InputIs1_ReturnFalse()
{
var sampleService = new SampleService();
bool result = sampleService.IsTrue(1);
Assert.False(result, "1 should not be true");
}
}
}
صفت [Fact] ، تابع تست را به اجرا کننده آزمون معرفی میکند .
- دستور dotnet test را اجرا کنید، با اجرای این دستور هر دو پروژه کامپایل شده و سپس آزمون های پروژه آزمون اجرا می شوند.
- همانطور که مشخص بود تست تابع IsTrue با مشکل رو برو می شود زیرا داخل تابع پیاده سازی نشده است
- طبق قواعد TDD ساده ترین کدی را که می تواند منجر به اجرای صحیح آزمون شود به تابع IsTrue اضافه کنید.
- تابع IsTrue را به صورت زیر بروز کنید.
public bool IsTrue(int value) { if (value== 1) { returnfalse; } thrownew NotImplementedException("Not fully implemented."); }
اکنون با اجرای دستور dotnet test ، تست قبول می شود.
تست با مقادیر مختلف
زمانی که شما به تست یک تابع با چندین ورودی مختلف نیاز دارید ممکن است تصمیم بگیرید تست های مختلف با کد های مشابه بنویسید در حالی که فقط ورودی آنها با یکدیگر تفاوت دارند.
اما صفت های زیر در xUnit این امکان را فراهم می کنند که یک تابع تست با ورودی های مختلف بنویسید
-
[Theory] مجموعه ای از تست ها را نشان می دهد که همان کد را اجرا می کنند اما آرگومان های ورودی متفاوتی دارند.
- [InlineData] مقادیری را برای ورودی ها مشخص می کند.
برای درک بهتر موضوع تغییرات زیر را اضافه کنید :
1-در داخل کلاس SampleService تابع زیر را اضافه کنید :
public bool IsNegativeNumber(int number) { if (number >= 0) { return false; } throw new NotImplementedException("Not fully implemented."); }
2-کلاس تست جدید به نام SampleService_IsNegative به پروژه تست افزوده و کد داخل آن را به صورت زیر تغییر دهید :
using Xunit; using Sample.Services; namespace Sample.UnitTests.Services { public class SampleService_IsNegative { [Theory] [InlineData(2)] [InlineData(0)] [InlineData(1)] public void IsNegative_ReturnTrue(int value) { var sampleService = new SampleService(); bool result = sampleService.IsNegativeNumber(1); Assert.False(result, $"{value} should not be negative"); } }
پروژه نمونه در مخزن گیت هاب
دیدگاهتان را بنویسید