aboutsummaryrefslogtreecommitdiffstats
path: root/doc/misc
diff options
context:
space:
mode:
authorJoakim Verona2011-10-14 11:00:50 +0200
committerJoakim Verona2011-10-14 11:00:50 +0200
commitdab7e06ab78b5aa2b747ded874bbef8b6667a28d (patch)
tree60e8a4d369258032e70dfbc5533027367e69997f /doc/misc
parent3d9b00348ff3d3c70e1cad0b4804170a6a24779d (diff)
parent466a320edc8304632373066a61ee9f5903aa82a1 (diff)
downloademacs-dab7e06ab78b5aa2b747ded874bbef8b6667a28d.tar.gz
emacs-dab7e06ab78b5aa2b747ded874bbef8b6667a28d.zip
upstream
Diffstat (limited to 'doc/misc')
-rw-r--r--doc/misc/ChangeLog13
-rw-r--r--doc/misc/ert.texi126
2 files changed, 80 insertions, 59 deletions
diff --git a/doc/misc/ChangeLog b/doc/misc/ChangeLog
index 294c6472000..02c2d2b8750 100644
--- a/doc/misc/ChangeLog
+++ b/doc/misc/ChangeLog
@@ -1,3 +1,16 @@
12011-10-14 Glenn Morris <rgm@gnu.org>
2
3 * ert.texi (Introduction, How to Run Tests)
4 (Running Tests Interactively, Expected Failures)
5 (Tests and Their Environment, Useful Techniques)
6 (Interactive Debugging, Fixtures and Test Suites):
7 Minor rephrasings.
8 (Running Tests Interactively, The @code{should} Macro): Add xrefs.
9 (Running Tests in Batch Mode): Simplify loading instructions.
10 (Test Selectors): Clarify some selectors.
11 (Expected Failures, Useful Techniques):
12 Make examples fit in 80 columns.
13
12011-10-13 Jay Belanger <jay.p.belanger@gmail.com> 142011-10-13 Jay Belanger <jay.p.belanger@gmail.com>
2 15
3 * calc.texi (Basic Operations on Units): Discuss temperature 16 * calc.texi (Basic Operations on Units): Discuss temperature
diff --git a/doc/misc/ert.texi b/doc/misc/ert.texi
index c9b624c6767..d1cecf1347a 100644
--- a/doc/misc/ert.texi
+++ b/doc/misc/ert.texi
@@ -82,8 +82,8 @@ Extending ERT
82 82
83Other Testing Concepts 83Other Testing Concepts
84 84
85* Mocks and Stubs:: Stubbing out code that is irrelevant to the test. 85* Mocks and Stubs:: Stubbing out code that is irrelevant to the test.
86* Fixtures and Test Suites:: How ERT differs from tools for other languages. 86* Fixtures and Test Suites:: How ERT differs from tools for other languages.
87 87
88@end detailmenu 88@end detailmenu
89@end menu 89@end menu
@@ -133,8 +133,8 @@ will pass if the three calls to @code{equal} all return true
133@code{should} is a macro with the same meaning as @code{assert} but 133@code{should} is a macro with the same meaning as @code{assert} but
134better error reporting. @xref{The @code{should} Macro}. 134better error reporting. @xref{The @code{should} Macro}.
135 135
136Each test should have a name that describes what functionality the 136Each test should have a name that describes what functionality it tests.
137test tests. Test names can be chosen arbitrarily --- they are in a 137Test names can be chosen arbitrarily --- they are in a
138namespace separate from functions and variables --- but should follow 138namespace separate from functions and variables --- but should follow
139the usual Emacs Lisp convention of having a prefix that indicates 139the usual Emacs Lisp convention of having a prefix that indicates
140which package they belong to. Test names are displayed by ERT when 140which package they belong to. Test names are displayed by ERT when
@@ -142,7 +142,7 @@ reporting failures and can be used when selecting which tests to run.
142 142
143The empty parentheses @code{()} in the first line don't currently have 143The empty parentheses @code{()} in the first line don't currently have
144any meaning and are reserved for future extension. They also make 144any meaning and are reserved for future extension. They also make
145@code{ert-deftest}'s syntax more similar to @code{defun}. 145the syntax of @code{ert-deftest} more similar to that of @code{defun}.
146 146
147The docstring describes what feature this test tests. When running 147The docstring describes what feature this test tests. When running
148tests interactively, the first line of the docstring is displayed for 148tests interactively, the first line of the docstring is displayed for
@@ -163,14 +163,14 @@ You can run tests either in the Emacs you are working in, or on the
163command line in a separate Emacs process in batch mode (i.e., with no 163command line in a separate Emacs process in batch mode (i.e., with no
164user interface). The former mode is convenient during interactive 164user interface). The former mode is convenient during interactive
165development, the latter is useful to make sure that tests pass 165development, the latter is useful to make sure that tests pass
166independently of your customizations, allows tests to be invoked from 166independently of your customizations; and it allows you to invoke
167makefiles and scripts to be written that run tests in several 167tests from makefiles, and to write scripts that run tests in several
168different Emacs versions. 168different Emacs versions.
169 169
170@menu 170@menu
171* Running Tests Interactively:: Run tests in your current Emacs. 171* Running Tests Interactively:: Run tests in your current Emacs.
172* Running Tests in Batch Mode:: Run tests in emacs -Q. 172* Running Tests in Batch Mode:: Run tests in emacs -Q.
173* Test Selectors:: Choose which tests to run. 173* Test Selectors:: Choose which tests to run.
174@end menu 174@end menu
175 175
176 176
@@ -178,7 +178,8 @@ different Emacs versions.
178@section Running Tests Interactively 178@section Running Tests Interactively
179 179
180You can run the tests that are currently defined in your Emacs with 180You can run the tests that are currently defined in your Emacs with
181the command @kbd{@kbd{M-x} ert @kbd{RET} t @kbd{RET}}. ERT will pop 181the command @kbd{@kbd{M-x} ert @kbd{RET} t @kbd{RET}}. (For an
182explanation of the @code{t} argument, @pxref{Test Selectors}.) ERT will pop
182up a new buffer, the ERT results buffer, showing the results of the 183up a new buffer, the ERT results buffer, showing the results of the
183tests run. It looks like this: 184tests run. It looks like this:
184 185
@@ -219,10 +220,10 @@ F list-test
219 (different-atoms c d)))) 220 (different-atoms c d))))
220@end example 221@end example
221 222
222At the top, there is a summary of the results: We ran all tests in the 223At the top, there is a summary of the results: we ran all tests defined
223current Emacs (@code{Selector: t}), 31 of them passed, and 2 failed 224in the current Emacs (@code{Selector: t}), 31 of them passed, and 2
224unexpectedly. @xref{Expected Failures}, for an explanation of the 225failed unexpectedly. @xref{Expected Failures}, for an explanation of
225term @emph{unexpected} in this context. 226the term @emph{unexpected} in this context.
226 227
227The line of dots and @code{F}s is a progress bar where each character 228The 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 229represents one test; it fills while the tests are running. A dot
@@ -261,7 +262,7 @@ scripts or makefiles. There are two functions for this purpose,
261They can be used like this: 262They can be used like this:
262 263
263@example 264@example
264emacs -batch -L /path/to/ert -l ert.el -l my-tests.el -f ert-run-tests-batch-and-exit 265emacs -batch -l ert -l my-tests.el -f ert-run-tests-batch-and-exit
265@end example 266@end example
266 267
267This command will start up Emacs in batch mode, load ERT, load 268This command will start up Emacs in batch mode, load ERT, load
@@ -270,9 +271,10 @@ with 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 271failed or if anything else went wrong. It will also print progress
271messages and error diagnostics to standard output. 272messages and error diagnostics to standard output.
272 273
273You may need additional @code{-L} flags to ensure that 274If ERT is not part of your Emacs distribution, you may need to use
274@code{my-tests.el} and all the files that it requires are on your 275@code{-L /path/to/ert/} so that Emacs can find it. You may need
275@code{load-path}. 276additional @code{-L} flags to ensure that @code{my-tests.el} and all the
277files that it requires are on your @code{load-path}.
276 278
277 279
278@node Test Selectors, , Running Tests in Batch Mode, How to Run Tests 280@node Test Selectors, , Running Tests in Batch Mode, How to Run Tests
@@ -288,23 +290,26 @@ to Common Lisp's type specifier syntax:
288@item @code{:new} selects all tests that have not been run yet. 290@item @code{:new} selects all tests that have not been run yet.
289@item @code{:failed} and @code{:passed} select tests according to their most recent result. 291@item @code{:failed} and @code{:passed} select tests according to their most recent result.
290@item @code{:expected}, @code{:unexpected} select tests according to their most recent result. 292@item @code{:expected}, @code{:unexpected} select tests according to their most recent result.
291@item A string selects all tests that have a name that matches the string, a regexp. 293@item A string is a regular expression that selects all tests with matching names.
292@item A test selects that test. 294@item A test (i.e., an object of @code{ert-test} data type) selects that test.
293@item A symbol selects the test that the symbol names. 295@item A symbol selects the test that the symbol names.
294@item @code{(member TESTS...)} selects TESTS, a list of tests or symbols naming tests. 296@item @code{(member TESTS...)} selects the elements of TESTS, a list of
297tests or symbols naming tests.
295@item @code{(eql TEST)} selects TEST, a test or a symbol naming a test. 298@item @code{(eql TEST)} selects TEST, a test or a symbol naming a test.
296@item @code{(and SELECTORS...)} selects the tests that match all SELECTORS. 299@item @code{(and SELECTORS...)} selects the tests that match all SELECTORS.
297@item @code{(or SELECTORS...)} selects the tests that match any SELECTOR. 300@item @code{(or SELECTORS...)} selects the tests that match any SELECTOR.
298@item @code{(not SELECTOR)} selects all tests that do not match SELECTOR. 301@item @code{(not SELECTOR)} selects all tests that do not match SELECTOR.
299@item @code{(tag TAG)} selects all tests that have TAG on their tags list. 302@item @code{(tag TAG)} selects all tests that have TAG on their tags list.
300@item @code{(satisfies PREDICATE)} Selects all tests that satisfy PREDICATE. 303(Tags are optional labels you can apply to tests when you define them.)
304@item @code{(satisfies PREDICATE)} selects all tests that satisfy PREDICATE,
305a function that takes a test as argument and returns non-nil if it is selected.
301@end itemize 306@end itemize
302 307
303Selectors that are frequently useful when selecting tests to run 308Selectors that are frequently useful when selecting tests to run
304include @code{t} to run all tests that are currently defined in Emacs, 309include @code{t} to run all tests that are currently defined in Emacs,
305@code{"^foo-"} to run all tests in package @code{foo} --- this assumes 310@code{"^foo-"} to run all tests in package @code{foo} (this assumes
306that package @code{foo} uses the prefix @code{foo-} for its test names 311that package @code{foo} uses the prefix @code{foo-} for its test names),
307---, result-based selectors such as @code{(or :new :unexpected)} to 312result-based selectors such as @code{(or :new :unexpected)} to
308run all tests that have either not run yet or that had an unexpected 313run all tests that have either not run yet or that had an unexpected
309result in the last run, and tag-based selectors such as @code{(not 314result in the last run, and tag-based selectors such as @code{(not
310(tag :causes-redisplay))} to run all tests that are not tagged 315(tag :causes-redisplay))} to run all tests that are not tagged
@@ -325,9 +330,9 @@ to find where a test was defined if the test was loaded from a file.
325 330
326 331
327@menu 332@menu
328* The @code{should} Macro:: A powerful way to express assertions. 333* The @code{should} Macro:: A powerful way to express assertions.
329* Expected Failures:: Tests for known bugs. 334* Expected Failures:: Tests for known bugs.
330* Tests and Their Environment:: Don't depend on customizations; no side effects. 335* Tests and Their Environment:: Don't depend on customizations; no side effects.
331* Useful Techniques:: Some examples. 336* Useful Techniques:: Some examples.
332@end menu 337@end menu
333 338
@@ -335,10 +340,12 @@ to find where a test was defined if the test was loaded from a file.
335@section The @code{should} Macro 340@section The @code{should} Macro
336 341
337Test bodies can include arbitrary code; but to be useful, they need to 342Test bodies can include arbitrary code; but to be useful, they need to
338have checks whether the code being tested (or @emph{code under test}) 343check whether the code being tested (or @emph{code under test})
339does what it is supposed to do. The macro @code{should} is similar to 344does what it is supposed to do. The macro @code{should} is similar to
340@code{assert} from the cl package, but analyzes its argument form and 345@code{assert} from the cl package
341records information that ERT can display to help debugging. 346(@pxref{Assertions,,, cl, Common Lisp Extensions}),
347but analyzes its argument form and records information that ERT can
348display to help debugging.
342 349
343This test definition 350This test definition
344 351
@@ -396,7 +403,7 @@ default.
396@node Expected Failures, Tests and Their Environment, The @code{should} Macro, How to Write Tests 403@node Expected Failures, Tests and Their Environment, The @code{should} Macro, How to Write Tests
397@section Expected Failures 404@section Expected Failures
398 405
399Some bugs are complicated to fix or not very important and are left as 406Some bugs are complicated to fix, or not very important, and are left as
400@emph{known bugs}. If there is a test case that triggers the bug and 407@emph{known bugs}. If there is a test case that triggers the bug and
401fails, ERT will alert you of this failure every time you run all 408fails, ERT will alert you of this failure every time you run all
402tests. For known bugs, this alert is a distraction. The way to 409tests. For known bugs, this alert is a distraction. The way to
@@ -406,7 +413,7 @@ definition:
406@lisp 413@lisp
407(ert-deftest future-bug () 414(ert-deftest future-bug ()
408 "Test `time-forward' with negative arguments. 415 "Test `time-forward' with negative arguments.
409Since this functionality isn't implemented yet, the test is known to fail." 416Since this functionality isn't implemented, the test is known to fail."
410 :expected-result :failed 417 :expected-result :failed
411 (time-forward -1)) 418 (time-forward -1))
412@end lisp 419@end lisp
@@ -427,7 +434,7 @@ makes it much easier to fix the bug, demonstrate that it is fixed, and
427prevent future regressions. 434prevent future regressions.
428 435
429ERT displays the same kind of alerts for tests that pass unexpectedly 436ERT displays the same kind of alerts for tests that pass unexpectedly
430that it displays for unexpected failures. This way, if you make code 437as it displays for unexpected failures. This way, if you make code
431changes that happen to fix a bug that you weren't aware of, you will 438changes that happen to fix a bug that you weren't aware of, you will
432know to remove the @code{:expected-result} clause of that test and 439know to remove the @code{:expected-result} clause of that test and
433close the corresponding bug report, if any. 440close the corresponding bug report, if any.
@@ -453,8 +460,8 @@ The outcome of running a test should not depend on the current state
453of the environment, and each test should leave its environment in the 460of the environment, and each test should leave its environment in the
454same state it found it in. In particular, a test should not depend on 461same state it found it in. In particular, a test should not depend on
455any Emacs customization variables or hooks, and if it has to make any 462any Emacs customization variables or hooks, and if it has to make any
456changes to Emacs' state or state external to Emacs such as the file 463changes to Emacs's state or state external to Emacs (such as the file
457system, it should undo these changes before it returns, regardless of 464system), it should undo these changes before it returns, regardless of
458whether it passed or failed. 465whether it passed or failed.
459 466
460Tests should not depend on the environment because any such 467Tests should not depend on the environment because any such
@@ -462,14 +469,14 @@ dependencies can make the test brittle or lead to failures that occur
462only under certain circumstances and are hard to reproduce. Of 469only under certain circumstances and are hard to reproduce. Of
463course, the code under test may have settings that affect its 470course, the code under test may have settings that affect its
464behavior. In that case, it is best to make the test @code{let}-bind 471behavior. In that case, it is best to make the test @code{let}-bind
465all such settings variables to set up a specific configuration for the 472all such setting variables to set up a specific configuration for the
466duration of the test. The test can also set up a number of different 473duration of the test. The test can also set up a number of different
467configurations and run the code under test with each. 474configurations and run the code under test with each.
468 475
469Tests that have side effects on their environment should restore it to 476Tests that have side effects on their environment should restore it to
470its original state because any side effects that persist after the 477its original state because any side effects that persist after the
471test can disrupt the workflow of the programmer running the tests. If 478test can disrupt the workflow of the programmer running the tests. If
472the code under test has side effects on Emacs' current state, such as 479the code under test has side effects on Emacs's current state, such as
473on the current buffer or window configuration, the test should create 480on the current buffer or window configuration, the test should create
474a temporary buffer for the code to manipulate (using 481a temporary buffer for the code to manipulate (using
475@code{with-temp-buffer}), or save and restore the window configuration 482@code{with-temp-buffer}), or save and restore the window configuration
@@ -490,13 +497,13 @@ such commands are what they want to test. The exact behavior of
490@code{auto-mode-alist}. It is difficult to write a meaningful test if 497@code{auto-mode-alist}. It is difficult to write a meaningful test if
491its behavior can be affected by so many external factors. Also, 498its behavior can be affected by so many external factors. Also,
492@code{find-file} has side effects that are hard to predict and thus 499@code{find-file} has side effects that are hard to predict and thus
493hard to undo: It may create a new buffer or may reuse an existing 500hard to undo: It may create a new buffer or reuse an existing
494buffer if one is already visiting the requested file; and it runs 501buffer if one is already visiting the requested file; and it runs
495@code{find-file-hook}, which can have arbitrary side effects. 502@code{find-file-hook}, which can have arbitrary side effects.
496 503
497Instead, it is better to use lower-level mechanisms with simple and 504Instead, it is better to use lower-level mechanisms with simple and
498predictable semantics like @code{with-temp-buffer}, @code{insert} or 505predictable semantics like @code{with-temp-buffer}, @code{insert} or
499@code{insert-file-contents-literally}, and activating the desired mode 506@code{insert-file-contents-literally}, and to activate any desired mode
500by calling the corresponding function directly --- after binding the 507by calling the corresponding function directly --- after binding the
501hook variables to nil. This avoids the above problems. 508hook variables to nil. This avoids the above problems.
502 509
@@ -534,8 +541,10 @@ Here's a more complicated test:
534 (ert--print-backtrace (ert-test-failed-backtrace result)) 541 (ert--print-backtrace (ert-test-failed-backtrace result))
535 (goto-char (point-min)) 542 (goto-char (point-min))
536 (end-of-line) 543 (end-of-line)
537 (let ((first-line (buffer-substring-no-properties (point-min) (point)))) 544 (let ((first-line (buffer-substring-no-properties
538 (should (equal first-line " signal(ert-test-failed (\"foo\"))"))))))) 545 (point-min) (point))))
546 (should (equal first-line
547 " signal(ert-test-failed (\"foo\"))")))))))
539@end lisp 548@end lisp
540 549
541This test creates a test object using @code{make-ert-test} whose body 550This test creates a test object using @code{make-ert-test} whose body
@@ -562,7 +571,7 @@ under test was structured with testing in mind.
562For example, if @code{ert-run-test} accepted only symbols that name 571For example, if @code{ert-run-test} accepted only symbols that name
563tests rather than test objects, the test would need a name for the 572tests rather than test objects, the test would need a name for the
564failing test, which would have to be a temporary symbol generated with 573failing test, which would have to be a temporary symbol generated with
565@code{make-symbol}, to avoid side effects on Emacs' state. Choosing 574@code{make-symbol}, to avoid side effects on Emacs's state. Choosing
566the right interface for @code{ert-run-tests} allows the test to be 575the right interface for @code{ert-run-tests} allows the test to be
567simpler. 576simpler.
568 577
@@ -663,7 +672,7 @@ function registered. @xref{Defining Explanation Functions}.
663@node Interactive Debugging, , Understanding Explanations, How to Debug Tests 672@node Interactive Debugging, , Understanding Explanations, How to Debug Tests
664@section Interactive Debugging 673@section Interactive Debugging
665 674
666Debugging failed tests works essentially the same way as debugging any 675Debugging failed tests essentially works the same way as debugging any
667other problems with Lisp code. Here are a few tricks specific to 676other problems with Lisp code. Here are a few tricks specific to
668tests: 677tests:
669 678
@@ -673,8 +682,8 @@ each time. It's good to find out whether the behavior is
673deterministic before spending any time looking for a cause. In the 682deterministic before spending any time looking for a cause. In the
674ERT results buffer, @kbd{r} re-runs the selected test. 683ERT results buffer, @kbd{r} re-runs the selected test.
675 684
676@item Use @kbd{.} to jump to the source code of the test to find out what 685@item Use @kbd{.} to jump to the source code of the test to find out exactly
677exactly it does. Perhaps the test is broken rather than the code 686what it does. Perhaps the test is broken rather than the code
678under test. 687under test.
679 688
680@item If the test contains a series of @code{should} forms and you can't 689@item If the test contains a series of @code{should} forms and you can't
@@ -699,8 +708,8 @@ re-run the test with @kbd{r} or @kbd{d}.
699@item If you have been editing and rearranging tests, it is possible that 708@item If you have been editing and rearranging tests, it is possible that
700ERT remembers an old test that you have since renamed or removed --- 709ERT remembers an old test that you have since renamed or removed ---
701renamings or removals of definitions in the source code leave around a 710renamings or removals of definitions in the source code leave around a
702stray definition under the old name in the running process, this is a 711stray definition under the old name in the running process (this is a
703common problem in Lisp. In such a situation, hit @kbd{D} to let ERT 712common problem in Lisp). In such a situation, hit @kbd{D} to let ERT
704forget about the obsolete test. 713forget about the obsolete test.
705@end itemize 714@end itemize
706 715
@@ -739,14 +748,13 @@ explanation function.
739 748
740Both @code{ert-run-tests-interactively} and @code{ert-run-tests-batch} 749Both @code{ert-run-tests-interactively} and @code{ert-run-tests-batch}
741are implemented on top of the lower-level test handling code in the 750are implemented on top of the lower-level test handling code in the
742sections named ``Facilities for running a single test'', ``Test 751sections of @file{ert.el} labelled ``Facilities for running a single test'',
743selectors'', and ``Facilities for running a whole set of tests''. 752``Test selectors'', and ``Facilities for running a whole set of tests''.
744 753
745If you want to write code that works with ERT tests, you should take a 754If you want to write code that works with ERT tests, you should take a
746look at this lower-level code. Symbols that start with @code{ert--} 755look at this lower-level code. Symbols that start with @code{ert--}
747are internal to ERT, those that start with @code{ert-} but not 756are internal to ERT, whereas those that start with @code{ert-} are
748@code{ert--} are meant to be usable by other code. But there is no 757meant to be usable by other code. But there is no mature API yet.
749mature API yet.
750 758
751Contributions to ERT are welcome. 759Contributions to ERT are welcome.
752 760
@@ -758,8 +766,8 @@ For information on mocks, stubs, fixtures, or test suites, see below.
758 766
759 767
760@menu 768@menu
761* Mocks and Stubs:: Stubbing out code that is irrelevant to the test. 769* Mocks and Stubs:: Stubbing out code that is irrelevant to the test.
762* Fixtures and Test Suites:: How ERT differs from tools for other languages. 770* Fixtures and Test Suites:: How ERT differs from tools for other languages.
763@end menu 771@end menu
764 772
765@node Mocks and Stubs, Fixtures and Test Suites, Other Testing Concepts, Other Testing Concepts 773@node Mocks and Stubs, Fixtures and Test Suites, Other Testing Concepts, Other Testing Concepts
@@ -782,8 +790,8 @@ In many ways, ERT is similar to frameworks for other languages like
782SUnit or JUnit. However, two features commonly found in such 790SUnit or JUnit. However, two features commonly found in such
783frameworks are notably absent from ERT: fixtures and test suites. 791frameworks are notably absent from ERT: fixtures and test suites.
784 792
785Fixtures, as used e.g. in SUnit or JUnit, are mainly used to provide 793Fixtures are mainly used (e.g., in SUnit or JUnit) to provide an
786an environment for a set of tests, and consist of set-up and tear-down 794environment for a set of tests, and consist of set-up and tear-down
787functions. 795functions.
788 796
789While fixtures are a useful syntactic simplification in other 797While fixtures are a useful syntactic simplification in other
@@ -829,13 +837,13 @@ separating module namespaces in Emacs Lisp, test selectors already
829solve this by allowing regexp matching on test names; e.g., the 837solve this by allowing regexp matching on test names; e.g., the
830selector "^ert-" selects ERT's self-tests. 838selector "^ert-" selects ERT's self-tests.
831 839
832Other uses include grouping tests by their expected execution time to 840Other uses include grouping tests by their expected execution time,
833run quick tests during interactive development and slow tests less 841e.g. to run quick tests during interactive development and slow tests less
834frequently. This can be achieved with the @code{:tag} argument to 842often. This can be achieved with the @code{:tag} argument to
835@code{ert-deftest} and @code{tag} test selectors. 843@code{ert-deftest} and @code{tag} test selectors.
836 844
837@bye 845@bye
838 846
839@c LocalWords: ERT Hagelberg Ohler JUnit namespace docstring ERT's 847@c LocalWords: ERT JUnit namespace docstring ERT's
840@c LocalWords: backtrace makefiles workflow backtraces API SUnit 848@c LocalWords: backtrace makefiles workflow backtraces API SUnit
841@c LocalWords: subexpressions 849@c LocalWords: subexpressions