eg delivers clojure.test function tests with conciseness.
(deftest inc-test
(is (= 1 (inc 0))))
in eg becomes:
(eg inc [0] 1)
Core ideas driving eg:
clojure.spec/fdef, but for testseg targets both Clojure and ClojureScript JVM. Untested for ClojureScript JS.
Disclaimer: eg is work-in-progress. Use it at your own risk!
Leiningen/Boot
[eg "0.2.4-alpha"]
Clojure CLI/deps.edn
eg {:mvn/version "0.2.4-alpha"}
eg stands for e.g. (short for example), and ge is just eg reversed. Reversed example: (ge inc 1 [0]).
Let's try eg! Start by creating a REPL session and then requiring eg and ge:
(require '[eg :refer [eg ge]])
Each eg test tests one function using examples. You could think of it as a function's test definition:
(eg not ; testing clojure.core/not
[false] ; with input parameters vector `[false]`
true) ; returning expected value `true`
a clojure.test test named not-test was generated.
There are times when we prefer to have expected values
on the left, and input parameters on the right.
For that we use ge, a useful mnemonic for the inverted flow of the test example:
(ge + 10 [3 7]) ; one liners are also ok, as with `defn`
Each eg test can contain an arbitrary number of examples:
(eg *
[3] 3
[3 2] 6)
Predicates can also be used in place of an expected value:
(eg dec [4] integer?)
=> or <= delimiters between input parameters and expected value can be used to improve readability, or
override the default order of eg or ge.
(eg hash-map
[:d 1] {:d 1}
[:a 1 :b 2 :c 3 :d 4] => {:a 1 :b 2 :c 3 :d 4}
map? <= {:a 1 :b 2 :c 3 :d 4})
It's possible to run only selected tests by using metadata ^:focus on eg or ge:
(eg ^:focus false? [false] true)
There are some caveats to consider when using ^:focus with ClojureScript:
clojure.test/deftest will be executed, despite the presence of focused eg, or ge tests.Between eg, and ge, choose the form that is most convenient for your combination of function examples and use it only once for testing a function. For example, don't do this:
(ge inc [1] 2)
(ge inc [0] 1)
or this:
(eg inc [1] 2)
(ge inc [0] 1)
Finally, run your tests as you normally would with clojure.test.
Clojure tests in the REPL:
(clojure.test/run-all-tests)
; or
(clojure.test/run-tests some.ns)
Clojure tests in the terminal:
> lein test
ClojureScript tests in the REPL:
(cljs.test/run-all-tests)
; or
(cljs.test/run-tests some.ns)
test-selectors for use of metadataeg and geRun tests expected to pass, targeting Clojure:
> lein clj-test-pass
Run tests expected to pass, targeting ClojureScript JVM->nodejs:
> lein cljs-test-pass
Run tests expected to fail, targeting Clojure:
> lein clj-test-fail
Run tests expected to fail, targeting ClojureScript JVM->nodejs:
> lein cljs-test-fail
Copyright (c) 2019 Carlos da Cunha Fontes
The Universal Permissive License (UPL), Version 1.0
Can you improve this documentation?Edit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |