Command line tools
There are three common ways to run Midje: via
lein midje, and
lein midje :autotest.
As explained below,
lein test makes it awkward to get an accurate combined failure count from your
clojure.test and Midje tests. Therefore I recommend
lein midje, which you can install as a Leiningen plugin.
The simple way to run
lein midje is like this:
% lein midje
That checks all facts and tests in your project's
:source-paths. (Midje users sometimes add facts to their source as documentation.) You can also name one or more specific namespaces:
% lein midje behaviors.t-line-number-reporting midje.checkers.t-collection
You can also use
* to abbreviate multiple namespaces:
% lein midje midje.emission.*
* names a whole namespace subtree. That is, the previous command will check both
lein midje has other ways of limiting checking to a subset of facts. See lein midje or
lein help midje for details.
lein midje shows output like this:
FAIL "a '`fact' that's not true" at (core.clj:7) ;; FAIL is normally highlighted in red. Expected: 5 Actual: 4 >>> Output from clojure.test tests: FAIL in (a-test-that-fails) (core.clj:9) expected: (= (+ 2 2) 5) actual: (not (= 4 5)) 1 failures, 0 errors. ;; Highlighted in red to mark failure >>> Midje summary: FAILURE: 1 claim was not confirmed. (But 1 was.) ;; Highlighted in red. Subprocess failed $ echo $? 2
clojure.testoutput only appears if any
deftestswere run. The Midje and
clojure.testoutputs are never mixed together, even if tests and facts appear in the same namespace.
Colorizing can be changed.
The exit status is the number of failures (whether from
clojure.testor Midje), up to a maximum of 255. As a result, scripts on Unix-like systems can check for success or failure in the normal way.
It's often convenient to have
lein midje make all its checks, then wait around to recheck when any file has changed. That's done like this:
% lein midje :autotest
In versions of
lein-midje before 3.0, the argument was --lazytest.
Changes propagate. Therefore, if a source file changes, all files that depend on it, either directly or indirectly, are also considered changed. Therefore, a change to source will cause tests and facts to be rechecked. (File dependencies are discovered from namespace
ns statements, so dependencies created by, say,
(require (calculate-namespace)) aren't tracked.)
:autotest can be told to watch only certain subdirectories. See lein midje or
lein help midje for details.
(Note: Although this is the command-line interface to the repl tools
autotest function, you don't get a repl prompt you can type at.)
Continuing to use
Midje reports to
clojure.test's output, so if you combine Midje facts and
clojure.test tests, you'll see all the output together.
Moreover, every Midje fact reports itself to
clojure.test as a test, and each check reports to
clojure.test whether it passed or failed. Such reports do not necessarily end up in the
lein midje summary. Roughly speaking,
clojure.test doesn't count assertions except when they're in
deftest forms. For that reason, a freestanding
is like this one:
(is (= 1 2))
... does not contribute to the failure count printed at the end of a
lein test run. The same is true of freestanding facts. If you want their results counted, you need to include them in
deftest. (You can wrap a
deftest around the whole file below the