Есть ли хороший способ использовать методы QuickCheck Happstack.State?

У меня есть набор методов Happstack.State MACID, которые я хочу протестировать с помощью QuickCheck, но мне трудно найти самый элегантный способ сделать это. Проблемы, с которыми я сталкиваюсь:

  • Единственный способ оценить вычисление монады Ev — в монаде IO через query или update.
  • Невозможно создать только хранилище MACID в памяти; это предусмотрено. Следовательно, работа в монаде IO означает наличие временных файлов, которые нужно очищать после каждого теста.
  • Невозможно инициализировать новое хранилище MACID, кроме как с initialValue для состояния; он не может быть сгенерирован через Arbitrary, если я не выставлю метод доступа, который заменяет оптовую продажу состояния.
  • Обход всего вышеперечисленного означает написание методов, которые используют только функции MonadReader или MonadState (и запуск теста внутри Reader или State вместо Ev. Это означает отказ от использования getRandom или getEventClockTime и т.п. внутри определений методов.

Единственные варианты, которые я вижу, это:

  • Запустите методы в одноразовом хранилище MACID на диске, выполняя очистку после каждого теста и каждый раз начиная с initialValue.
  • Напишите методы, чтобы большая часть кода выполнялась в MonadReader или MonadState (что легче тестировать), и полагайтесь на небольшое количество клея, не поддерживающего QuickCheck, вокруг него, который вызывает getRandom или getEventClockTime по мере необходимости.

Есть ли лучшее решение, которое я пропускаю?


person Paul Kuliniewicz    schedule 03.06.2010    source источник


Ответы (2)


Вы можете проверить свойства быстрой проверки, которые включены в happstack-state:

http://patch-tag.com/r/mae/happstack/snapshot/current/content/pretty/happstack-state/tests/Happstack/State/Tests

Если вы просто проводите тестирование и хотите одноразовое хранилище данных, вы можете использовать экономию памяти, которая просто сохраняет состояние, файлы событий и контрольные точки в ОЗУ. Если вы потеряете власть, то все ваше государство будет потеряно. Это нормально для тестов, но не для реального живого сервера. В том сообщении, на которое вы ссылались, говорилось о реальных живых серверах, а не только о тестировании.

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

Чтобы заменить initialValue, вам нужно будет создать свой собственный метод, который полностью заменяет текущее состояние.

что-то типа:

newState :: YourState -> Update YourState ()
newState st = put st

или что-то.

  • Джереми
person stepcut    schedule 05.06.2010
comment
Подвох withMemorySaver заключается в том, что он требует, чтобы состояние happstack было собрано с тестами -f, что не является значением по умолчанию и не было изначально установлено на моем компьютере. Я не хочу раскрывать метод, который полностью заменяет состояние, но я полагаю, что могу написать функцию, которая использует withMemorySaver и запускает NewState, и выставляет это для тестирования вместо самого NewState. - person Paul Kuliniewicz; 06.06.2010
comment
Хм. withMemorySaver в любом случае несколько специфичен для набора тестов. Теоретически вы должны просто сделать: ctl ‹- runTxSystem (fmap Memory newMemoryStore) (Proxy :: Proxy MyState) Но по какой-то причине Happstack.State.Saver.Impl.Memory не отображается. Я исправлю это в следующем релизе. - person stepcut; 06.06.2010

Если вы пишете свои функции как полиморфные над MonadState (или MonadReader для запросов), может быть намного проще настроить тестовую обвязку с помощью runState/runReader.

Насколько я помню, генераторы кода happstack TH прекрасно справляются с такими подписями.

person Antoine Latter    schedule 06.06.2010
comment
Это то, что я пытался сделать изначально, но тогда вы теряете доступ к таким вещам, как getEventClockTime и getRandom, поскольку они живут в монаде Ev. - person Paul Kuliniewicz; 07.06.2010
comment
Это правда! Может быть, нам нужен класс, который предоставляет различные функции в монаде Ev, которые затем могут быть имитированы чем-то другим. - person Antoine Latter; 08.06.2010