Add support for auto-generating info/dir
[bpt/emacs.git] / doc / misc / ert.texi
CommitLineData
d221e780
CO
1\input texinfo
2@c %**start of header
3@setfilename ../../info/ert
4@settitle Emacs Lisp Regression Testing
5@c %**end of header
6
9e7a4bcf 7@dircategory Emacs misc features
d221e780 8@direntry
f9405d87 9* ERT: (ert). Emacs Lisp regression testing tool.
d221e780
CO
10@end direntry
11
12@copying
ab422c4d 13Copyright @copyright{} 2008, 2010--2013 Free Software Foundation, Inc.
d221e780
CO
14
15@quotation
16Permission is granted to copy, distribute and/or modify this document
6872a814 17under the terms of the GNU Free Documentation License, Version 1.3 or
d221e780 18any later version published by the Free Software Foundation; with no
6872a814
GM
19Invariant Sections, with the Front-Cover texts being ``A GNU Manual,''
20and with the Back-Cover Texts as in (a) below. A copy of the license
0b1af106 21is included in the section entitled ``GNU Free Documentation License''.
6872a814
GM
22
23(a) The FSF's Back-Cover Text is: ``You have the freedom to copy and
6bf430d1 24modify this GNU manual.''
d221e780
CO
25@end quotation
26@end copying
27
563a450c 28@node Top
d221e780
CO
29@top ERT: Emacs Lisp Regression Testing
30
31ERT is a tool for automated testing in Emacs Lisp. Its main features
32are facilities for defining tests, running them and reporting the
33results, and for debugging test failures interactively.
34
35ERT is similar to tools for other environments such as JUnit, but has
36unique features that take advantage of the dynamic and interactive
37nature of Emacs. Despite its name, it works well both for test-driven
38development (see
39@url{http://en.wikipedia.org/wiki/Test-driven_development}) and for
40traditional software development methods.
41
42@menu
43* Introduction:: A simple example of an ERT test.
7359a765 44* How to Run Tests:: Run tests in Emacs or from the command line.
d221e780
CO
45* How to Write Tests:: How to add tests to your Emacs Lisp code.
46* How to Debug Tests:: What to do if a test fails.
47* Extending ERT:: ERT is extensible in several ways.
48* Other Testing Concepts:: Features not in ERT.
0b1af106 49* GNU Free Documentation License:: The license for this documentation.
d221e780
CO
50
51@detailmenu
52 --- The Detailed Node Listing ---
53
54How to Run Tests
55
56* Running Tests Interactively:: Run tests in your current Emacs.
57* Running Tests in Batch Mode:: Run tests in emacs -Q.
7359a765 58* Test Selectors:: Choose which tests to run.
d221e780
CO
59
60How to Write Tests
61
7359a765 62* The @code{should} Macro:: A powerful way to express assertions.
d221e780 63* Expected Failures:: Tests for known bugs.
7359a765 64* Tests and Their Environment:: Don't depend on customizations; no side effects.
d221e780
CO
65* Useful Techniques:: Some examples.
66
67How to Debug Tests
68
69* Understanding Explanations:: How ERT gives details on why an assertion failed.
70* Interactive Debugging:: Tools available in the ERT results buffer.
71
72Extending ERT
73
74* Defining Explanation Functions:: Teach ERT about more predicates.
75* Low-Level Functions for Working with Tests:: Use ERT's data for your purposes.
76
77Other Testing Concepts
78
466a320e
GM
79* Mocks and Stubs:: Stubbing out code that is irrelevant to the test.
80* Fixtures and Test Suites:: How ERT differs from tools for other languages.
d221e780 81
0b1af106
GM
82Appendix
83
84* GNU Free Documentation License:: The license for this documentation.
85
d221e780
CO
86@end detailmenu
87@end menu
88
563a450c 89@node Introduction
d221e780
CO
90@chapter Introduction
91
92ERT allows you to define @emph{tests} in addition to functions,
93macros, variables, and the other usual Lisp constructs. Tests are
f99f1641 94simply Lisp code: code that invokes other code and checks whether
d221e780
CO
95it behaves as expected.
96
97ERT keeps track of the tests that are defined and provides convenient
98commands to run them to verify whether the definitions that are
99currently loaded in Emacs pass the tests.
100
101Some Lisp files have comments like the following (adapted from the
102package @code{pp.el}):
103
104@lisp
105;; (pp-to-string '(quote quote)) ; expected: "'quote"
106;; (pp-to-string '((quote a) (quote b))) ; expected: "('a 'b)\n"
107;; (pp-to-string '('a 'b)) ; same as above
108@end lisp
109
110The code contained in these comments can be evaluated from time to
111time to compare the output with the expected output. ERT formalizes
112this and introduces a common convention, which simplifies Emacs
113development, since programmers no longer have to manually find and
114evaluate such comments.
115
116An ERT test definition equivalent to the above comments is this:
117
118@lisp
119(ert-deftest pp-test-quote ()
120 "Tests the rendering of `quote' symbols in `pp-to-string'."
121 (should (equal (pp-to-string '(quote quote)) "'quote"))
122 (should (equal (pp-to-string '((quote a) (quote b))) "('a 'b)\n"))
123 (should (equal (pp-to-string '('a 'b)) "('a 'b)\n")))
124@end lisp
125
126If you know @code{defun}, the syntax of @code{ert-deftest} should look
127familiar: This example defines a test named @code{pp-test-quote} that
128will pass if the three calls to @code{equal} all return true
129(non-nil).
130
dd90fd1a 131@code{should} is a macro with the same meaning as @code{cl-assert} but
d221e780
CO
132better error reporting. @xref{The @code{should} Macro}.
133
466a320e 134Each test should have a name that describes what functionality it tests.
f99f1641
PE
135Test names can be chosen arbitrarily---they are in a
136namespace separate from functions and variables---but should follow
d221e780
CO
137the usual Emacs Lisp convention of having a prefix that indicates
138which package they belong to. Test names are displayed by ERT when
139reporting failures and can be used when selecting which tests to run.
140
141The empty parentheses @code{()} in the first line don't currently have
142any meaning and are reserved for future extension. They also make
466a320e 143the syntax of @code{ert-deftest} more similar to that of @code{defun}.
d221e780
CO
144
145The docstring describes what feature this test tests. When running
146tests interactively, the first line of the docstring is displayed for
147tests that fail, so it is good if the first line makes sense on its
148own.
149
150The body of a test can be arbitrary Lisp code. It should have as few
151side effects as possible; each test should be written to clean up
152after itself, leaving Emacs in the same state as it was before the
153test. Tests should clean up even if they fail. @xref{Tests and Their
154Environment}.
155
156
563a450c 157@node How to Run Tests
d221e780
CO
158@chapter How to Run Tests
159
160You can run tests either in the Emacs you are working in, or on the
161command line in a separate Emacs process in batch mode (i.e., with no
162user interface). The former mode is convenient during interactive
163development, the latter is useful to make sure that tests pass
466a320e
GM
164independently of your customizations; and it allows you to invoke
165tests from makefiles, and to write scripts that run tests in several
d221e780
CO
166different Emacs versions.
167
168@menu
169* Running Tests Interactively:: Run tests in your current Emacs.
170* Running Tests in Batch Mode:: Run tests in emacs -Q.
466a320e 171* Test Selectors:: Choose which tests to run.
d221e780
CO
172@end menu
173
174
563a450c 175@node Running Tests Interactively
d221e780
CO
176@section Running Tests Interactively
177
178You can run the tests that are currently defined in your Emacs with
466a320e
GM
179the command @kbd{@kbd{M-x} ert @kbd{RET} t @kbd{RET}}. (For an
180explanation of the @code{t} argument, @pxref{Test Selectors}.) ERT will pop
d221e780
CO
181up a new buffer, the ERT results buffer, showing the results of the
182tests run. It looks like this:
183
184@example
185Selector: t
955ada11
MA
186Passed: 31
187Skipped: 0
188Failed: 2 (2 unexpected)
189Total: 33/33
d221e780
CO
190
191Started at: 2008-09-11 08:39:25-0700
192Finished.
193Finished at: 2008-09-11 08:39:27-0700
194
195FF...............................
196
197F addition-test
198 (ert-test-failed
199 ((should
200 (=
201 (+ 1 2)
202 4))
203 :form
204 (= 3 4)
205 :value nil))
206
207F list-test
208 (ert-test-failed
209 ((should
210 (equal
211 (list 'a 'b 'c)
212 '(a b d)))
213 :form
214 (equal
215 (a b c)
216 (a b d))
217 :value nil :explanation
218 (list-elt 2
219 (different-atoms c d))))
220@end example
221
466a320e
GM
222At the top, there is a summary of the results: we ran all tests defined
223in the current Emacs (@code{Selector: t}), 31 of them passed, and 2
224failed unexpectedly. @xref{Expected Failures}, for an explanation of
225the term @emph{unexpected} in this context.
d221e780
CO
226
227The line of dots and @code{F}s is a progress bar where each character
228represents one test; it fills while the tests are running. A dot
229means that the test passed, an @code{F} means that it failed. Below
230the progress bar, ERT shows details about each test that had an
231unexpected result. In the example above, there are two failures, both
232due to failed @code{should} forms. @xref{Understanding Explanations},
233for more details.
234
235In the ERT results buffer, @kbd{TAB} and @kbd{S-TAB} cycle between
236buttons. Each name of a function or macro in this buffer is a button;
237moving point to it and typing @kbd{RET} jumps to its definition.
238
239Pressing @kbd{r} re-runs the test near point on its own. Pressing
240@kbd{d} re-runs it with the debugger enabled. @kbd{.} jumps to the
241definition of the test near point (@kbd{RET} has the same effect if
242point is on the name of the test). On a failed test, @kbd{b} shows
243the backtrace of the failure.
244
245@kbd{l} shows the list of @code{should} forms executed in the test.
246If any messages were generated (with the Lisp function @code{message})
247in a test or any of the code that it invoked, @kbd{m} will show them.
248
249By default, long expressions in the failure details are abbreviated
250using @code{print-length} and @code{print-level}. Pressing @kbd{L}
251while point is on a test failure will increase the limits to show more
252of the expression.
253
254
563a450c 255@node Running Tests in Batch Mode
d221e780
CO
256@section Running Tests in Batch Mode
257
258ERT supports automated invocations from the command line or from
259scripts or makefiles. There are two functions for this purpose,
260@code{ert-run-tests-batch} and @code{ert-run-tests-batch-and-exit}.
261They can be used like this:
262
263@example
466a320e 264emacs -batch -l ert -l my-tests.el -f ert-run-tests-batch-and-exit
d221e780
CO
265@end example
266
267This command will start up Emacs in batch mode, load ERT, load
268@code{my-tests.el}, and run all tests defined in it. It will exit
269with a zero exit status if all tests passed, or nonzero if any tests
270failed or if anything else went wrong. It will also print progress
271messages and error diagnostics to standard output.
272
466a320e
GM
273If ERT is not part of your Emacs distribution, you may need to use
274@code{-L /path/to/ert/} so that Emacs can find it. You may need
275additional @code{-L} flags to ensure that @code{my-tests.el} and all the
276files that it requires are on your @code{load-path}.
d221e780
CO
277
278
563a450c 279@node Test Selectors
d221e780
CO
280@section Test Selectors
281
282Functions like @code{ert} accept a @emph{test selector}, a Lisp
283expression specifying a set of tests. Test selector syntax is similar
284to Common Lisp's type specifier syntax:
285
286@itemize
287@item @code{nil} selects no tests.
288@item @code{t} selects all tests.
289@item @code{:new} selects all tests that have not been run yet.
290@item @code{:failed} and @code{:passed} select tests according to their most recent result.
291@item @code{:expected}, @code{:unexpected} select tests according to their most recent result.
466a320e
GM
292@item A string is a regular expression that selects all tests with matching names.
293@item A test (i.e., an object of @code{ert-test} data type) selects that test.
d221e780 294@item A symbol selects the test that the symbol names.
466a320e
GM
295@item @code{(member TESTS...)} selects the elements of TESTS, a list of
296tests or symbols naming tests.
d221e780
CO
297@item @code{(eql TEST)} selects TEST, a test or a symbol naming a test.
298@item @code{(and SELECTORS...)} selects the tests that match all SELECTORS.
299@item @code{(or SELECTORS...)} selects the tests that match any SELECTOR.
300@item @code{(not SELECTOR)} selects all tests that do not match SELECTOR.
301@item @code{(tag TAG)} selects all tests that have TAG on their tags list.
466a320e
GM
302(Tags are optional labels you can apply to tests when you define them.)
303@item @code{(satisfies PREDICATE)} selects all tests that satisfy PREDICATE,
304a function that takes a test as argument and returns non-nil if it is selected.
d221e780
CO
305@end itemize
306
307Selectors that are frequently useful when selecting tests to run
308include @code{t} to run all tests that are currently defined in Emacs,
466a320e
GM
309@code{"^foo-"} to run all tests in package @code{foo} (this assumes
310that package @code{foo} uses the prefix @code{foo-} for its test names),
311result-based selectors such as @code{(or :new :unexpected)} to
d221e780
CO
312run all tests that have either not run yet or that had an unexpected
313result in the last run, and tag-based selectors such as @code{(not
314(tag :causes-redisplay))} to run all tests that are not tagged
315@code{:causes-redisplay}.
316
317
563a450c 318@node How to Write Tests
d221e780
CO
319@chapter How to Write Tests
320
321ERT lets you define tests in the same way you define functions. You
322can type @code{ert-deftest} forms in a buffer and evaluate them there
323with @code{eval-defun} or @code{compile-defun}, or you can save the
324file and load it, optionally byte-compiling it first.
325
326Just like @code{find-function} is only able to find where a function
327was defined if the function was loaded from a file, ERT is only able
328to find where a test was defined if the test was loaded from a file.
329
330
331@menu
466a320e 332* The @code{should} Macro:: A powerful way to express assertions.
d221e780 333* Expected Failures:: Tests for known bugs.
466a320e 334* Tests and Their Environment:: Don't depend on customizations; no side effects.
d221e780
CO
335* Useful Techniques:: Some examples.
336@end menu
337
563a450c 338@node The @code{should} Macro
d221e780
CO
339@section The @code{should} Macro
340
341Test bodies can include arbitrary code; but to be useful, they need to
466a320e 342check whether the code being tested (or @emph{code under test})
d221e780 343does what it is supposed to do. The macro @code{should} is similar to
dd90fd1a 344@code{cl-assert} from the cl package
466a320e
GM
345(@pxref{Assertions,,, cl, Common Lisp Extensions}),
346but analyzes its argument form and records information that ERT can
347display to help debugging.
d221e780
CO
348
349This test definition
350
351@lisp
352(ert-deftest addition-test ()
353 (should (= (+ 1 2) 4)))
354@end lisp
355
356will produce this output when run via @kbd{M-x ert}:
357
358@example
359F addition-test
360 (ert-test-failed
361 ((should
362 (=
363 (+ 1 2)
364 4))
365 :form
366 (= 3 4)
367 :value nil))
368@end example
369
370In this example, @code{should} recorded the fact that (= (+ 1 2) 4)
371reduced to (= 3 4) before it reduced to nil. When debugging why the
372test failed, it helps to know that the function @code{+} returned 3
373here. ERT records the return value for any predicate called directly
374within @code{should}.
375
376In addition to @code{should}, ERT provides @code{should-not}, which
377checks that the predicate returns nil, and @code{should-error}, which
378checks that the form called within it signals an error. An example
379use of @code{should-error}:
380
381@lisp
382(ert-deftest test-divide-by-zero ()
383 (should-error (/ 1 0)
384 :type 'arith-error))
385@end lisp
386
387This checks that dividing one by zero signals an error of type
388@code{arith-error}. The @code{:type} argument to @code{should-error}
389is optional; if absent, any type of error is accepted.
390@code{should-error} returns an error description of the error that was
8350f087 391signaled, to allow additional checks to be made. The error
d221e780
CO
392description has the format @code{(ERROR-SYMBOL . DATA)}.
393
394There is no @code{should-not-error} macro since tests that signal an
395error fail anyway, so @code{should-not-error} is effectively the
396default.
397
398@xref{Understanding Explanations}, for more details on what
399@code{should} reports.
400
401
563a450c 402@node Expected Failures
d221e780
CO
403@section Expected Failures
404
466a320e 405Some bugs are complicated to fix, or not very important, and are left as
d221e780
CO
406@emph{known bugs}. If there is a test case that triggers the bug and
407fails, ERT will alert you of this failure every time you run all
408tests. For known bugs, this alert is a distraction. The way to
409suppress it is to add @code{:expected-result :failed} to the test
410definition:
411
412@lisp
413(ert-deftest future-bug ()
414 "Test `time-forward' with negative arguments.
466a320e 415Since this functionality isn't implemented, the test is known to fail."
d221e780
CO
416 :expected-result :failed
417 (time-forward -1))
418@end lisp
419
420ERT will still display a small @code{f} in the progress bar as a
421reminder that there is a known bug, and will count the test as failed,
422but it will be quiet about it otherwise.
423
424An alternative to marking the test as a known failure this way is to
425delete the test. This is a good idea if there is no intent to fix it,
426i.e., if the behavior that was formerly considered a bug has become an
427accepted feature.
428
429In general, however, it can be useful to keep tests that are known to
430fail. If someone wants to fix the bug, they will have a very good
431starting point: an automated test case that reproduces the bug. This
432makes it much easier to fix the bug, demonstrate that it is fixed, and
433prevent future regressions.
434
435ERT displays the same kind of alerts for tests that pass unexpectedly
466a320e 436as it displays for unexpected failures. This way, if you make code
d221e780
CO
437changes that happen to fix a bug that you weren't aware of, you will
438know to remove the @code{:expected-result} clause of that test and
439close the corresponding bug report, if any.
440
441Since @code{:expected-result} evaluates its argument when the test is
442loaded, tests can be marked as known failures only on certain Emacs
443versions, specific architectures, etc.:
444
445@lisp
446(ert-deftest foo ()
447 "A test that is expected to fail on Emacs 23 but succeed elsewhere."
448 :expected-result (if (string-match "GNU Emacs 23[.]" (emacs-version))
449 :failed
450 :passed)
451 ...)
452@end lisp
453
454
563a450c 455@node Tests and Their Environment
d221e780
CO
456@section Tests and Their Environment
457
955ada11
MA
458Sometimes, it doesn't make sense to run a test due to missing
459preconditions. A required Emacs feature might not be compiled in, the
460function to be tested could call an external binary which might not be
461available on the test machine, you name it. In this case, the macro
462@code{skip-unless} could be used to skip the test:
463
464@lisp
465(ert-deftest test-dbus ()
466 "A test that checks D-BUS functionality."
467 (skip-unless (featurep 'dbusbind))
468 ...)
469@end lisp
470
d221e780
CO
471The outcome of running a test should not depend on the current state
472of the environment, and each test should leave its environment in the
473same state it found it in. In particular, a test should not depend on
474any Emacs customization variables or hooks, and if it has to make any
466a320e
GM
475changes to Emacs's state or state external to Emacs (such as the file
476system), it should undo these changes before it returns, regardless of
d221e780
CO
477whether it passed or failed.
478
479Tests should not depend on the environment because any such
480dependencies can make the test brittle or lead to failures that occur
481only under certain circumstances and are hard to reproduce. Of
482course, the code under test may have settings that affect its
483behavior. In that case, it is best to make the test @code{let}-bind
466a320e 484all such setting variables to set up a specific configuration for the
d221e780
CO
485duration of the test. The test can also set up a number of different
486configurations and run the code under test with each.
487
488Tests that have side effects on their environment should restore it to
489its original state because any side effects that persist after the
490test can disrupt the workflow of the programmer running the tests. If
466a320e 491the code under test has side effects on Emacs's current state, such as
d221e780
CO
492on the current buffer or window configuration, the test should create
493a temporary buffer for the code to manipulate (using
494@code{with-temp-buffer}), or save and restore the window configuration
495(using @code{save-window-excursion}), respectively. For aspects of
496the state that can not be preserved with such macros, cleanup should
497be performed with @code{unwind-protect}, to ensure that the cleanup
498occurs even if the test fails.
499
500An exception to this are messages that the code under test prints with
501@code{message} and similar logging; tests should not bother restoring
502the @code{*Message*} buffer to its original state.
503
504The above guidelines imply that tests should avoid calling highly
505customizable commands such as @code{find-file}, except, of course, if
506such commands are what they want to test. The exact behavior of
507@code{find-file} depends on many settings such as
508@code{find-file-wildcards}, @code{enable-local-variables}, and
509@code{auto-mode-alist}. It is difficult to write a meaningful test if
510its behavior can be affected by so many external factors. Also,
511@code{find-file} has side effects that are hard to predict and thus
466a320e 512hard to undo: It may create a new buffer or reuse an existing
d221e780
CO
513buffer if one is already visiting the requested file; and it runs
514@code{find-file-hook}, which can have arbitrary side effects.
515
516Instead, it is better to use lower-level mechanisms with simple and
517predictable semantics like @code{with-temp-buffer}, @code{insert} or
466a320e 518@code{insert-file-contents-literally}, and to activate any desired mode
f99f1641 519by calling the corresponding function directly, after binding the
d221e780
CO
520hook variables to nil. This avoids the above problems.
521
522
563a450c 523@node Useful Techniques
d221e780
CO
524@section Useful Techniques when Writing Tests
525
526Testing simple functions that have no side effects and no dependencies
527on their environment is easy. Such tests often look like this:
528
529@lisp
530(ert-deftest ert-test-mismatch ()
531 (should (eql (ert--mismatch "" "") nil))
532 (should (eql (ert--mismatch "" "a") 0))
533 (should (eql (ert--mismatch "a" "a") nil))
534 (should (eql (ert--mismatch "ab" "a") 1))
535 (should (eql (ert--mismatch "Aa" "aA") 0))
536 (should (eql (ert--mismatch '(a b c) '(a b d)) 2)))
537@end lisp
538
539This test calls the function @code{ert--mismatch} several times with
540various combinations of arguments and compares the return value to the
541expected return value. (Some programmers prefer @code{(should (eql
542EXPECTED ACTUAL))} over the @code{(should (eql ACTUAL EXPECTED))}
543shown here. ERT works either way.)
544
545Here's a more complicated test:
546
547@lisp
548(ert-deftest ert-test-record-backtrace ()
549 (let ((test (make-ert-test :body (lambda () (ert-fail "foo")))))
550 (let ((result (ert-run-test test)))
551 (should (ert-test-failed-p result))
552 (with-temp-buffer
553 (ert--print-backtrace (ert-test-failed-backtrace result))
554 (goto-char (point-min))
555 (end-of-line)
466a320e
GM
556 (let ((first-line (buffer-substring-no-properties
557 (point-min) (point))))
558 (should (equal first-line
559 " signal(ert-test-failed (\"foo\"))")))))))
d221e780
CO
560@end lisp
561
562This test creates a test object using @code{make-ert-test} whose body
563will immediately signal failure. It then runs that test and asserts
564that it fails. Then, it creates a temporary buffer and invokes
565@code{ert--print-backtrace} to print the backtrace of the failed test
566to the current buffer. Finally, it extracts the first line from the
567buffer and asserts that it matches what we expect. It uses
568@code{buffer-substring-no-properties} and @code{equal} to ignore text
569properties; for a test that takes properties into account,
570@code{buffer-substring} and @code{ert-equal-including-properties}
571could be used instead.
572
573The reason why this test only checks the first line of the backtrace
574is that the remainder of the backtrace is dependent on ERT's internals
575as well as whether the code is running interpreted or compiled. By
f99f1641
PE
576looking only at the first line, the test checks a useful property---that
577the backtrace correctly captures the call to @code{signal} that
578results from the call to @code{ert-fail}---without being brittle.
d221e780
CO
579
580This example also shows that writing tests is much easier if the code
581under test was structured with testing in mind.
582
583For example, if @code{ert-run-test} accepted only symbols that name
584tests rather than test objects, the test would need a name for the
585failing test, which would have to be a temporary symbol generated with
466a320e 586@code{make-symbol}, to avoid side effects on Emacs's state. Choosing
d221e780
CO
587the right interface for @code{ert-run-tests} allows the test to be
588simpler.
589
590Similarly, if @code{ert--print-backtrace} printed the backtrace to a
591buffer with a fixed name rather than the current buffer, it would be
592much harder for the test to undo the side effect. Of course, some
593code somewhere needs to pick the buffer name. But that logic is
594independent of the logic that prints backtraces, and keeping them in
595separate functions allows us to test them independently.
596
597A lot of code that you will encounter in Emacs was not written with
598testing in mind. Sometimes, the easiest way to write tests for such
599code is to restructure the code slightly to provide better interfaces
600for testing. Usually, this makes the interfaces easier to use as
601well.
602
603
563a450c 604@node How to Debug Tests
d221e780
CO
605@chapter How to Debug Tests
606
607This section describes how to use ERT's features to understand why
608a test failed.
609
610
611@menu
612* Understanding Explanations:: How ERT gives details on why an assertion failed.
613* Interactive Debugging:: Tools available in the ERT results buffer.
614@end menu
615
616
563a450c 617@node Understanding Explanations
d221e780
CO
618@section Understanding Explanations
619
620Failed @code{should} forms are reported like this:
621
622@example
623F addition-test
624 (ert-test-failed
625 ((should
626 (=
627 (+ 1 2)
628 4))
629 :form
630 (= 3 4)
631 :value nil))
632@end example
633
634ERT shows what the @code{should} expression looked like and what
635values its subexpressions had: The source code of the assertion was
636@code{(should (= (+ 1 2) 4))}, which applied the function @code{=} to
637the arguments @code{3} and @code{4}, resulting in the value
638@code{nil}. In this case, the test is wrong; it should expect 3
639rather than 4.
640
641If a predicate like @code{equal} is used with @code{should}, ERT
642provides a so-called @emph{explanation}:
643
644@example
645F list-test
646 (ert-test-failed
647 ((should
648 (equal
649 (list 'a 'b 'c)
650 '(a b d)))
651 :form
652 (equal
653 (a b c)
654 (a b d))
655 :value nil :explanation
656 (list-elt 2
657 (different-atoms c d))))
658@end example
659
660In this case, the function @code{equal} was applied to the arguments
661@code{(a b c)} and @code{(a b d)}. ERT's explanation shows that
662the item at index 2 differs between the two lists; in one list, it is
663the atom c, in the other, it is the atom d.
664
665In simple examples like the above, the explanation is unnecessary.
666But in cases where the difference is not immediately apparent, it can
667save time:
668
669@example
670F test1
671 (ert-test-failed
672 ((should
673 (equal x y))
674 :form
675 (equal a a)
676 :value nil :explanation
677 (different-symbols-with-the-same-name a a)))
678@end example
679
680ERT only provides explanations for predicates that have an explanation
681function registered. @xref{Defining Explanation Functions}.
682
683
563a450c 684@node Interactive Debugging
d221e780
CO
685@section Interactive Debugging
686
466a320e 687Debugging failed tests essentially works the same way as debugging any
d221e780
CO
688other problems with Lisp code. Here are a few tricks specific to
689tests:
690
691@itemize
692@item Re-run the failed test a few times to see if it fails in the same way
693each time. It's good to find out whether the behavior is
694deterministic before spending any time looking for a cause. In the
695ERT results buffer, @kbd{r} re-runs the selected test.
696
466a320e
GM
697@item Use @kbd{.} to jump to the source code of the test to find out exactly
698what it does. Perhaps the test is broken rather than the code
d221e780
CO
699under test.
700
701@item If the test contains a series of @code{should} forms and you can't
702tell which one failed, use @kbd{l}, which shows you the list of all
703@code{should} forms executed during the test before it failed.
704
705@item Use @kbd{b} to view the backtrace. You can also use @kbd{d} to re-run
706the test with debugging enabled, this will enter the debugger and show
707the backtrace as well; but the top few frames shown there will not be
708relevant to you since they are ERT's own debugger hook. @kbd{b}
709strips them out, so it is more convenient.
710
711@item If the test or the code under testing prints messages using
712@code{message}, use @kbd{m} to see what messages it printed before it
713failed. This can be useful to figure out how far it got.
714
715@item You can instrument tests for debugging the same way you instrument
f99f1641 716@code{defun}s for debugging: go to the source code of the test and
d221e780
CO
717type @kbd{@kbd{C-u} @kbd{C-M-x}}. Then, go back to the ERT buffer and
718re-run the test with @kbd{r} or @kbd{d}.
719
720@item If you have been editing and rearranging tests, it is possible that
f99f1641 721ERT remembers an old test that you have since renamed or removed:
d221e780 722renamings or removals of definitions in the source code leave around a
466a320e
GM
723stray definition under the old name in the running process (this is a
724common problem in Lisp). In such a situation, hit @kbd{D} to let ERT
d221e780
CO
725forget about the obsolete test.
726@end itemize
727
728
563a450c 729@node Extending ERT
d221e780
CO
730@chapter Extending ERT
731
732There are several ways to add functionality to ERT.
733
734@menu
735* Defining Explanation Functions:: Teach ERT about more predicates.
736* Low-Level Functions for Working with Tests:: Use ERT's data for your purposes.
737@end menu
738
739
563a450c 740@node Defining Explanation Functions
d221e780
CO
741@section Defining Explanation Functions
742
743The explanation function for a predicate is a function that takes the
744same arguments as the predicate and returns an @emph{explanation}.
745The explanation should explain why the predicate, when invoked with
746the arguments given to the explanation function, returns the value
747that it returns. The explanation can be any object but should have a
748comprehensible printed representation. If the return value of the
749predicate needs no explanation for a given list of arguments, the
750explanation function should return nil.
751
752To associate an explanation function with a predicate, add the
753property @code{ert-explainer} to the symbol that names the predicate.
754The value of the property should be the symbol that names the
755explanation function.
756
757
563a450c 758@node Low-Level Functions for Working with Tests
d221e780
CO
759@section Low-Level Functions for Working with Tests
760
761Both @code{ert-run-tests-interactively} and @code{ert-run-tests-batch}
762are implemented on top of the lower-level test handling code in the
09e80d9f 763sections of @file{ert.el} labeled ``Facilities for running a single test'',
466a320e 764``Test selectors'', and ``Facilities for running a whole set of tests''.
d221e780
CO
765
766If you want to write code that works with ERT tests, you should take a
767look at this lower-level code. Symbols that start with @code{ert--}
466a320e
GM
768are internal to ERT, whereas those that start with @code{ert-} are
769meant to be usable by other code. But there is no mature API yet.
d221e780
CO
770
771Contributions to ERT are welcome.
772
773
563a450c 774@node Other Testing Concepts
d221e780
CO
775@chapter Other Testing Concepts
776
777For information on mocks, stubs, fixtures, or test suites, see below.
778
779
780@menu
466a320e
GM
781* Mocks and Stubs:: Stubbing out code that is irrelevant to the test.
782* Fixtures and Test Suites:: How ERT differs from tools for other languages.
d221e780
CO
783@end menu
784
563a450c 785@node Mocks and Stubs
d221e780
CO
786@section Other Tools for Emacs Lisp
787
788Stubbing out functions or using so-called @emph{mocks} can make it
789easier to write tests. See
790@url{http://en.wikipedia.org/wiki/Mock_object} for an explanation of
791the corresponding concepts in object-oriented languages.
792
793ERT does not have built-in support for mocks or stubs. The package
794@code{el-mock} (see @url{http://www.emacswiki.org/emacs/el-mock.el})
795offers mocks for Emacs Lisp and can be used in conjunction with ERT.
796
797
563a450c 798@node Fixtures and Test Suites
d221e780
CO
799@section Fixtures and Test Suites
800
801In many ways, ERT is similar to frameworks for other languages like
802SUnit or JUnit. However, two features commonly found in such
803frameworks are notably absent from ERT: fixtures and test suites.
804
466a320e
GM
805Fixtures are mainly used (e.g., in SUnit or JUnit) to provide an
806environment for a set of tests, and consist of set-up and tear-down
d221e780
CO
807functions.
808
809While fixtures are a useful syntactic simplification in other
810languages, this does not apply to Lisp, where higher-order functions
811and `unwind-protect' are available. One way to implement and use a
812fixture in ERT is
813
814@lisp
815(defun my-fixture (body)
816 (unwind-protect
817 (progn [set up]
818 (funcall body))
819 [tear down]))
820
821(ert-deftest my-test ()
822 (my-fixture
823 (lambda ()
824 [test code])))
825@end lisp
826
827(Another way would be a @code{with-my-fixture} macro.) This solves
828the set-up and tear-down part, and additionally allows any test
829to use any combination of fixtures, so it is more flexible than what
830other tools typically allow.
831
832If the test needs access to the environment the fixture sets up, the
833fixture can be modified to pass arguments to the body.
834
835These are well-known Lisp techniques. Special syntax for them could
836be added but would provide only a minor simplification.
837
838(If you are interested in such syntax, note that splitting set-up and
839tear-down into separate functions, like *Unit tools usually do, makes
840it impossible to establish dynamic `let' bindings as part of the
841fixture. So, blindly imitating the way fixtures are implemented in
842other languages would be counter-productive in Lisp.)
843
844The purpose of test suites is to group related tests together.
845
846The most common use of this is to run just the tests for one
847particular module. Since symbol prefixes are the usual way of
848separating module namespaces in Emacs Lisp, test selectors already
849solve this by allowing regexp matching on test names; e.g., the
850selector "^ert-" selects ERT's self-tests.
851
466a320e 852Other uses include grouping tests by their expected execution time,
1df7defd 853e.g., to run quick tests during interactive development and slow tests less
466a320e 854often. This can be achieved with the @code{:tag} argument to
d221e780
CO
855@code{ert-deftest} and @code{tag} test selectors.
856
563a450c 857@node GNU Free Documentation License
0b1af106
GM
858@appendix GNU Free Documentation License
859@include doclicense.texi
860
d221e780
CO
861@bye
862
466a320e 863@c LocalWords: ERT JUnit namespace docstring ERT's
d221e780
CO
864@c LocalWords: backtrace makefiles workflow backtraces API SUnit
865@c LocalWords: subexpressions