Тестирование на Основе Свойств. Собственный генератор
Теория
Простой пример
Реальный пример
Сегодня рассмотрим, как писать собственные генераторы.
В предыдущем примере мы использовали Filter(), чтобы возвращать только нужные числа.
Для создания генератора нужен публичный статический класс с публичным статическим методом, возвращающим Arbitrary<T>.
public static class CCNumberGeneratorТеперь его можно использовать в качестве типа генератора в атрибуте Property:
{
public static Arbitrary<Int64> Generate()
{
return Arb.Default
.Int64()
.Filter(x => x > 100);
}
}
[Property(Arbitrary = new[] {
typeof(CCNumberGenerator) },
Verbose = true)]
public bool ValidateShouldFail(long num)
{
return !CardNumber.IsValid(num.ToString());
}
В примере выше мы использовали существующий генератор. Но можно и создать его с нуля. Одной из наиболее часто используемых функций является Gen.Choose(), которая осуществляет случайный выбор значения из интервала с равномерным распределением.Например, так можно создать генератор месяца в определённом году:
public static class MonthOfYearGeneratorНа самом деле, вспомогательных функций для генератора очень много, и можно создавать генераторы любой сложности.
{
public static Gen<MonthOfYear> Generator =
from month in Gen.Choose(1, 12)
from year in Gen.Choose(1982, 2023)
select new MonthOfYear()
{
Month = month,
Year = year
};
public static Arbitrary<MonthOfYear> Generate() =>
Arb.From(Generator);
}
В этом же классе можно создать свой сокращатель:
public static IEnumerable<MonthOfYear>А затем использовать перегрузку метода Generate, принимающую и генератор, и сокращатель:
Shrinker(MonthOfYear moy)
{
yield return new MonthOfYear() {
Month = moy.Month,
Year = moy.Year - 1
};
yield return new MonthOfYear() {
Month = moy.Month,
Year = moy.Year + 1
};
}
public static Arbitrary<MonthOfYear> Generate() =>Окончание следует…
Arb.From(Generator, Shrinker);
Источник: https://bartwullems.blogspot.com/2023/01/property-based-testing-in-cpart-4.html