Тестирование на Основе Свойств. Простой пример
Теория
Итак, напишем тесты согласно свойствам, которые мы определили.
int Add(int x, int y) => x+y;У нас должно получиться 3 теста:
public class AddTwoNumbersTestsПока это не сильно отличается от обычных тестов на основе примеров. Теперь задача состоит в том, чтобы сгенерировать правильные псевдослучайные значения, которые можно использовать в качестве входных данных. В этом нам поможет FsCheck.
{
int Add(int x, int y) => x + y;
[Theory]
public void NoOrderOfParameters(int x, int y)
{
var res1 = Add(x, y);
var res2 = Add(y, x);
Assert.Equal(res1, res2);
}
[Theory]
public void ZeroDoesNothing(int x)
{
var res1 = Add(x, 0);
var res2 = x;
Assert.Equal(res1, res2);
}
[Theory]
public void OrderDoesntMatter(int x, int y, int z)
{
var res1 = Add(Add(x, y), z);
var res2 = Add(x, Add(y, z));
Assert.Equal(res1, res2);
}
}
FsCheck — это платформа тестирования на основе свойств, созданная для F#, но её можно использовать и в C#. Программист предоставляет спецификацию программы в виде свойств, которым должны удовлетворять функции, методы или объекты, а FsCheck проверяет, сохраняются ли эти свойства на большом количестве случайно сгенерированных случаев. Вы фактически пишете тестируемую спецификацию вашей программы. Спецификации выражаются на F#, C# или VB с использованием комбинаторов, определённых в библиотеке FsCheck. FsCheck предоставляет комбинаторы для определения свойств, наблюдения за распределением тестовых данных и определения генераторов тестовых данных. При сбое свойства FsCheck автоматически отображает минимальный контрпример.
Есть плагины FsCheck для всех популярных тестовых сред. Всё, что нам нужно, - это установить NuGet пакет и заменить атрибуты
[Theory] на [Property].Тесты по-прежнему будут проходить. По умолчанию FsCheck останавливается после 100 попыток. Если вы хотите знать протестированные значения, задайте свойству Verbose атрибута Property значение true:
[Property(Verbose = true)]Вот пример вывода:
NoOrderOfParametersКонечно, это очень простой пример. Далее рассмотрим что-то более реалистичное.
Standard Output:
0:
(0, 0)
1:
(-1, 1)
2:
(1, 1)
…
Продолжение следует…
Источник: https://bartwullems.blogspot.com/2023/01/property-based-testing-in-cpart-2.html