راهنمای مهاجرت به xUnit v3
نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۶/۲۶ ۰۹:۲۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
Assemblyها در زمان اجرای تستها جلوگیری میکند.Application Domain در نسخه ۲ فراهم میکند. این یعنی تستها کمتر روی یکدیگر تأثیر منفی میگذارند..exe که مستقیماً تستها را اجرا میکند..dll حاوی تستها به همراه یک فایل راهانداز (Stub) با پسوند .exe.Microsoft.NET.Test.Sdk جدا میکند، هرچند اگر همچنان بخواهید از VSTest Runner (مثلاً در Visual Studio یا محیطهای CI/CD) استفاده کنید، میتوانید با اضافه کردن پکیج xunit.runner.visualstudio این قابلیت را حفظ کنید.Console.WriteLine، Debug.WriteLine و Trace.WriteLine در نتیجه تست بود. این ویژگی که به دیباگ کردن تستهای ناموفق کمک شایانی میکند، در نسخه ۳ اضافه شده است.AssemblyInfo.cs یا هر فایل سیشارپ دیگر) آن را فعال کنید:// این Attribute خروجیهای Console.WriteLine را ثبت میکند [assembly: Xunit.CaptureConsole] // این Attribute خروجیهای Debug.WriteLine و Trace.WriteLine را ثبت میکند [assembly: Xunit.CaptureTrace]
Assembly Fixture)ClassFixture (برای یک کلاس) یا CollectionFixture (برای مجموعهای از کلاسها) استفاده میکردیم. اما اگر نیاز داشتید یک نمونه از یک کلاس سنگین (مانند یک دیتابیس در Docker یا یک وب سرور) را یک بار برای کل پروژه تست ایجاد کنید، راه حل سادهای وجود نداشت.AssemblyFixture این مشکل را حل کرده است. xUnit تنها یک نمونه از این Fixture را برای تمام تستهای موجود در Assembly ایجاد کرده و در اختیار همه آنها قرار میدهد.// AssemblyFixture را در سطح Assembly تعریف میکنیم
[assembly: Xunit.AssemblyFixture(typeof(DatabaseFixture))]
// کلاس فیکسچر که باید یک بار ساخته و در پایان از بین برود
public class DatabaseFixture : IDisposable
{
public SqlConnection Db { get; private set; }
public DatabaseFixture()
{
Db = new SqlConnection("MyConnectionString");
// ... کد مربوط به راهاندازی و مقداردهی اولیه دیتابیس ...
}
public void Dispose()
{
// ... کد مربوط به پاکسازی دیتابیس پس از اتمام تمام تستها ...
Db.Dispose();
}
}
// کلاس تست اول که از فیکسچر استفاده میکند
public class DatabaseTestClass1
{
private readonly DatabaseFixture _fixture;
// فیکسچر از طریق Constructor تزریق میشود
public DatabaseTestClass1(DatabaseFixture fixture)
{
_fixture = fixture;
}
[Fact]
public void Test1()
{
// استفاده از _fixture.Db
}
}
// کلاس تست دوم نیز از همان نمونه فیکسچر استفاده میکند
public class DatabaseTestClass2
{
private readonly DatabaseFixture _fixture;
public DatabaseTestClass2(DatabaseFixture fixture)
{
_fixture = fixture;
}
// ...
}SDK-style (.csproj) استفاده کند. اگر هنوز از فرمت قدیمی استفاده میکنید، ابتدا باید پروژه خود را به این فرمت تبدیل کنید.xunit.v3 گرفتهاند.<PackageReference Include="xunit" Version="2.x.x" /> <PackageReference Include="xunit.runner.visualstudio" Version="2.x.x" /> <PackageReference Include="xunit.analyzers" Version="0.x.x" />
<PackageReference Include="xunit.v3" Version="0.x.x" /> <PackageReference Include="xunit.runner.visualstudio" Version="3.x.x" /> <PackageReference Include="xunit.analyzers" Version="1.x.x" />
xunit.abstractions دیگر مورد نیاز نیست و باید به طور کامل از پروژه حذف شود..csproj پروژه تست خود را باز کرده و تگ را به آن اضافه کنید تا خروجی پروژه به Exe تغییر کند.<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<OutputType>Exe</OutputType> <IsPackable>false</IsPackable>
</PropertyGroup>
</Project>dotnet restore dotnet build
# اجرای مستقیم فایل اجرایی ./bin/Debug/net8.0/YourTestProject.exe # یا اجرای از طریق دستور dotnet run dotnet run # میتوانید آرگومانهای خط فرمان xUnit را نیز به آن پاس دهید dotnet run -- -xml results.xml
ValueTask برای تستهای async: برای بهبود عملکرد در تستهای آسنکرون، توصیه میشود به جای Task از ValueTask استفاده کنید. این کار در سناریوهایی که متد به صورت همزمان (Synchronously) کامل میشود، از تخصیص حافظه روی Heap جلوگیری میکند.[Fact]
public async ValueTask MyAsyncTest()
{
// ...
}Assertionهای جدید: نسخه ۳ شامل متدها و overloadهای جدیدی برای Assert است. مستندات رسمی را برای آشنایی با آنها بررسی کنید.dotnet test استفاده میکردید. این دستور همچنان با وجود پکیج xunit.runner.visualstudio کار میکند. اما اکنون یک گزینه جدید و قدرتمند دیگر نیز دارید: اجرای مستقیم فایل .exe خروجی. این روش میتواند سریعتر باشد و کنترل بیشتری بر روی فرآیند اجرای تستها به شما بدهد.