مقدمه
ابزارهای تست واحد (Unit Testing) نقش مهمی در تضمین کیفیت کد ایفا میکنند. یکی از کتابخانههای محبوب در این حوزه، FluentAssertions است که به دلیل سینتکس روان و خوانا، به توسعهدهندگان امکان میدهد تستهای خود را به شکلی طبیعیتر و قابلفهمتر بنویسند. با این حال، تغییرات اخیر در مجوز (License) نسخه 8 این کتابخانه، که آن را از یک مجوز آزاد (Apache 2.0) به یک مدل تجاری با هزینه برای استفادههای تجاری تبدیل کرده، باعث شده است که بسیاری از توسعهدهندگان به دنبال جایگزینهایی باشند. در این میان، AwesomeAssertions بهعنوان یک فورک (Fork) مبتنی بر جامعه از FluentAssertions معرفی شده است که نهتنها جایگزینی مستقیم برای این کتابخانه ارائه میدهد، بلکه تعهد به حفظ مجوز آزاد Apache 2.0 را نیز تضمین میکند.
AwesomeAssertions چیست و چرا به وجود آمد؟
AwesomeAssertions یک فورک مبتنی بر جامعه از کتابخانه FluentAssertions است که با هدف حفظ دسترسی آزاد به قابلیتهای این کتابخانه ایجاد شده است. پس از اینکه نسخه 8 FluentAssertions تحت مالکیت شرکت Xceed قرار گرفت و مجوز آن به یک مدل تجاری تغییر یافت (با هزینهای حدود 130 دلار به ازای هر توسعهدهنده در سال برای استفاده تجاری)، نگرانیهایی در میان جامعه توسعهدهندگان به وجود آمد. این تغییر مجوز، استفاده از نسخههای جدیدتر را برای شرکتها و پروژههای تجاری محدود کرد و توسعهدهندگانی که به نسخههای قدیمیتر (مانند 7.x) وابسته بودند، از بهروزرسانیهای آینده محروم شدند.
در پاسخ به این چالش، AwesomeAssertions با تکیه بر کد منبع نسخههای پیشین FluentAssertions (که تحت مجوز Apache 2.0 بودند) ایجاد شد. این پروژه نهتنها بهعنوان یک جایگزین مستقیم عمل میکند، بلکه متعهد شده است که مجوز آزاد خود را حفظ کند تا توسعهدهندگان بتوانند بدون نگرانی از مسائل حقوقی یا هزینههای اضافی از آن استفاده کنند. این فورک توسط جامعهای از توسعهدهندگان مدیریت میشود و از مشارکت عمومی برای بهبود و نگهداری آن استقبال میکند.
ویژگیها و مزایای کلیدی AwesomeAssertions
AwesomeAssertions بسیاری از قابلیتهای اصلی FluentAssertions را حفظ کرده است، از جمله:
- سینتکس روان (Fluent Syntax): امکان نوشتن تستها به شکلی خوانا و طبیعی، مانند زبان انگلیسی.
- پیامهای خطای واضح: ارائه توضیحات دقیق در صورت شکست تستها، که به تشخیص سریع مشکلات کمک میکند.
- پشتیبانی گسترده: سازگاری با فریمورکهای تست مختلف مانند NUnit، XUnit و MSTest.
یکی از مزایای اصلی AwesomeAssertions، حفظ مجوز Apache 2.0 است. این مجوز به توسعهدهندگان اجازه میدهد کد را تغییر دهند، توزیع کنند و در پروژههای تجاری بدون هزینه اضافی استفاده کنند. علاوه بر این، این پروژه بهعنوان یک راهحل "Drop-in Replacement" طراحی شده است، به این معنا که میتوان آن را بدون نیاز به تغییرات گسترده در کد تست موجود، جایگزین FluentAssertions کرد.
برای مثال، اگر در پروژه خود از FluentAssertions استفاده میکنید، کدی مانند زیر دارید:
var numbers = new List<int> { 1, 2, 3 };
numbers.Should().HaveCount(3);با جایگزینی بسته FluentAssertions با AwesomeAssertions، همین کد بدون تغییر کار خواهد کرد، زیرا AwesomeAssertions از همان فضای نام (Namespace) و API استفاده میکند.
نحوه نصب و استفاده
برای شروع استفاده از AwesomeAssertions، کافی است بسته آن را از NuGet نصب کنید. دستور زیر را در کنسول مدیریت بستهها (Package Manager Console) اجرا کنید:
dotnet add package AwesomeAssertions --version 7.0.0
نسخه 7.0.0 بهعنوان یک نقطه شروع پایدار توصیه میشود، زیرا بر اساس نسخه 7 FluentAssertions ساخته شده که تحت مجوز Apache 2.0 است. نسخههای جدیدتر مانند 8.0.0-rc.1 نیز در دسترس هستند، اما ممکن است هنوز در مرحله آزمایشی باشند.
پس از نصب، میتوانید تستهای خود را مانند قبل بنویسید. به عنوان مثال:
var person = new { Name = "Ali", Age = 30 };
person.Should().BeEquivalentTo(new { Name = "Ali", Age = 30 });این کد بررسی میکند که آیا شیء person با شیء مورد انتظار معادل است یا خیر، و در صورت عدم تطابق، پیامی واضح ارائه میدهد.
تفاوتها و محدودیتها
اگرچه AwesomeAssertions بهعنوان یک جایگزین مستقیم طراحی شده، اما محدودیتهایی نیز دارد. برخلاف FluentAssertions که توسط یک تیم مرکزی و با پشتیبانی تجاری توسعه مییابد، AwesomeAssertions به مشارکت جامعه وابسته است. این بدان معناست که سرعت توسعه و افزودن ویژگیهای جدید ممکن است کندتر باشد. به عنوان مثال، پشتیبانی از انواع جدید معرفیشده در نسخههای اخیر C# (مانند DateOnly) ممکن است به زمان و تلاش داوطلبان بستگی داشته باشد.
همچنین، در حالی که نسخه 8 FluentAssertions تغییراتی مانند بهبود پیامهای خطا و پشتیبانی از ویژگیهای جدید را معرفی کرده، AwesomeAssertions در حال حاضر بر پایه نسخه 7 و گزینش تغییرات مرتبط از آن نسخه استوار است. این موضوع میتواند برای پروژههایی که به ویژگیهای خاص نسخه 8 نیاز دارند، یک محدودیت باشد.
مقایسه با سایر گزینهها
در کنار AwesomeAssertions، گزینههای دیگری مانند Shouldly نیز برای جایگزینی FluentAssertions وجود دارند.
Shouldly سینتکس متفاوتی ارائه میدهد که بیشتر بر سادگی و خوانایی تمرکز دارد. برای مثال:
var numbers = new List<int> { 1, 2, 3 };
numbers.Count.ShouldBe(3);با این حال، Shouldly فاقد برخی قابلیتهای پیشرفتهتر FluentAssertions مانند AssertionScope است که امکان گروهبندی چندین ادعا (Assertions) را فراهم میکند. AwesomeAssertions با حفظ این قابلیتها، گزینهای مناسبتر برای کسانی است که نمیخواهند ساختار تستهای خود را تغییر دهند.
نتیجهگیری
AwesomeAssertions یک راهحل قدرتمند و عملی برای توسعهدهندگانی است که به دنبال جایگزینی برای FluentAssertions در اکوسیستم داتنت هستند. این پروژه با حفظ مجوز آزاد Apache 2.0 و ارائه سازگاری کامل با کدهای موجود، به توسعهدهندگان اطمینان میدهد که میتوانند بدون نگرانی از هزینهها یا مسائل حقوقی به کار خود ادامه دهند. با این حال، وابستگی به مشارکت جامعه ممکن است به معنای کندی در بهروزرسانیها باشد، و توسعهدهندگانی که به ویژگیهای خاص نسخههای جدیدتر FluentAssertions نیاز دارند، باید این محدودیت را در نظر بگیرند.