Чи варто платити за FluentAssertions? Порівняння з Shouldly

Як багато хто з вас вже знає, FluentAssertions з версії V8 більше не буде безкоштовним. Я не буду обговорювати, чому це сталося, чи це добре, чи погано, і також не буду навчати, як перейти на Shouldly. Для цього рекомендую прочитати статтю, яку можна знайти тут. Я не можу додати до цього нічого нового, і переписувати її немає сенсу.

Те, що я хочу поділитися, це, що ви можете або могли робити з FluentAssertions, і що ви не можете зробити з Shouldly.

FluentAssertions vs Shouldly

  1. Assertion Scope (область тверджень) — це дає вам більше ясності, дозволяючи групувати кілька перевірок за допомогою AssertionScope. Якщо ви з тих, хто вважає, що ніколи не слід використовувати кілька assert у тестах, тоді це просто не стосується вас. Мені подобається використовувати це і бачити «узагальнений звіт про помилки», звичайно, там, де це має сенс.
using (new AssertionScope())  
{  
 result.Should().NotBeNull();  
 result.FirstName.Should().Be("Vladutu");  
 result.LastName.Should().Be("Cosmin");  
}

Shouldly не має альтернативи цьому, і, по суті, зупиниться на першій умові, яка не виконана.

  1. Shouldly’s ShouldBeEquivalentTo vs BeEquivalentTo з FluentAssertions — як би ви не дивилися на це, ви зрештою визнаєте, що BeEquivalentTo набагато потужніший для порівняння складних об’єктів, особливо якщо у вас є вкладені властивості.

  2. Перевірки колекцій — У Shouldly є ShouldBeInOrder і ShouldContain, але тестувати конкретні речі у колекції складніше.

collection.Should().SatisfyRespectively(  
 first =>  
 {  
 first.Id.Should().Be(1);  
 first.Name.Should().StartWith("J");  
 first.Attributes.Should().NotBeNull();  
 },  
 second =>  
 {  
 second.Id.Should().Be(2);  
 second.Name.Should().EndWith("e");  
 second.Attributes.Should().NotBeEmpty();  
 });
  1. Розширюваність — значно обмежена. Гарний приклад того, що я маю на увазі, є в документації FluentAssertions тут.

  2. Predicate Assertions (твердження з предикатами) — Наскільки я знаю, Shouldly не має подібного механізму.

result.Should().Match(r => r.Name == "Cosmin" && r.Age > 25);

Можливо, FluentAssertions має більше функцій, яких немає в Shouldly, але саме ці для мене найважливіші. Водночас, я мушу визнати, що Shouldly має простіший синтаксис і легше використовується початківцями.

Висновок

Якщо ви використовуєте FluentAssertions лише для підвищення читабельності коду, тобто тільки для Should().Be(“whatever”), то, ймовірно, немає сенсу платити (або просити компанію платити) за підписку. Якщо ж ви використовуєте його трохи глибше, і дійсно задіюєте його потенціал, тоді варто зануритися глибше. Переписування тестів, які не можна просто виправити, замінивши метод, може коштувати більше, ніж самі ліцензії.

Перекладено з: Should You Pay for FluentAssertions? A Comparison with Shouldly

Leave a Reply

Your email address will not be published. Required fields are marked *