В Части 1 мы рассмотрели концепцию генераторов. Во Части 2 мы добавили бегун поверх них. В Части 3 мы добавили возможность сжатия всем нашим генераторам.

На данный момент наш бегун не использует возможности сжатия, которые мы представили в предыдущей части.

Та же статья на dev.to по адресу: https://dev.to/dubzzz/your-own-property-based-testing-framework-part-4-runners-with-shrink-53f7

Сжиматели были введены в попытке найти наименьший случай отказа. Они достигают одной главной цели: по одному значению вычисляют строго меньшие.

С точки зрения исполнителя, чтобы получить наименьший возможный случай сбоя, мы хотим уменьшить размер, как только обнаружим проблему. Итак, мы генерируем значения и запускаем для них предикат, и как только мы находим проблему, мы берем это значение и уменьшаем его. Более того, перебирая эти сжатые записи, мы можем найти другую, которая не сработает, мы сжимаем ее и повторяем до тех пор, пока не сможем найти более мелкие ошибки.

Процесс обобщен на схеме ниже:

С точки зрения кода, мы можем адаптировать наш miniFc.assert следующим образом:

Вот и все, наша самодельная структура на основе свойств теперь может генерировать значения, запускать тесты и находить сбои, а в случае неудачи сжимать ее до чего-то меньшего, чтобы помочь нашим пользователям.

Игровой пример доступен по адресу https://runkit.com/dubzzz/part-4-runners-with-shrink.

Но, к сожалению, эта конструкция оказалась недостаточно прочной…

Некоторых вещей в этом фреймворке будет недостаточно, некоторые из этих ограничений подробно описаны в официальной документации fast-check по адресу https://github.com/dubzzz/fast-check/blob/master/documentation/1- Путеводители/HowItWorks.md

В двух словах:

  • Наш способ отображения от генератора к другому требует как карты, так и функции отмены карты. К сожалению, реверсирование объекта не всегда осуществимо и может потребовать дополнительной работы только для того, чтобы получить возможность сжатия.
  • Наш способ отображения из генератора затрудняет предоставление генератора oneof с возможностями сжатия.
  • Генераторы тока слишком фиктивны, они пропускают множество краеугольных случаев. Хотя однородный рандом — это хорошо, поиск ошибок может занять бесконечное время…