Я работаю над некоторыми криптографическими программами в ближайшем будущем. Это действительно весело, и использование юнит-тестирования делает его более увлекательным, потому что я не нервничаю, когда ломаю вещи. Проблема в том, что все крипто-функции каждый раз генерируют разные результаты, потому что они управляются довольно хорошим генератором псевдослучайных чисел IMHO.
Как проверить рандомизированные функции?
с макросом bind, конечно!
(defmacro with-fake-prng [ & exprs ]
"replaces the prng with one that produces consisten results"
`(binding [com.cryptovide.split/get-prng (fn [] (cycle [1 2 3]))
com.cryptovide.modmath/mody 719
com.cryptovide.modmath/field-size 10]
~@exprs))
затем я обертываю свои тестовые функции в (with-fake-prng (deftest mytest ....))
У clojure много этих «макросов связывания». вроде with-out-string
и тому подобное.
У меня также есть макрос, который загружает каждое пространство имен в repl. (Я не пользуюсь этим сейчас, когда перешел на торт)
(defmacro load-all []
'(use
:reload-all
'com.cryptovide.modmath
...
'com.cryptovide.gui
'com.cryptovide.checksum
'com.cryptovide.log))
ps: всегда помните первое правило макроклуба