The test suite is designed to ensure stability of Org mode code base as it evolves, being modified by numerous contributors. The tests are usually designed aiming to ensure the expected Org mode behavior. Thus, we should not add the tests that just mechanically check what the current implementation does. In particular, we should avoid (or, at least, explicitly mark) the tests that simply check for some arbitrary behavior related to the details of the implementation; not to the original design goals. The only exception is when users get used to certain ways the code behaves by muscle memory.
The only dependency is ERT the Emacs testing library which ships with Emacs24. If you are running an older version of Emacs and don’t already have ERT installed it can be installed from its old git repository.
The simplest way to run the Org mode test suite is from the command line with the following invocation. Note that the paths below are relative to the base of the Org mode directory.
Also note that many of the current tests uses babel evaluation…
# For Emacs earlier than 24, add -L /path/to/ert
emacs -Q --batch \
-L lisp/ -L testing/ -L testing/lisp -l lisp/org.el \
-l lisp/org-id.el -l testing/org-test.el \
--eval "(progn (org-reload) (setq org-confirm-babel-evaluate nil) \
(org-babel-do-load-languages 'org-babel-load-languages \
'((emacs-lisp . t) (shell . t) (org . t))))" \
-f org-test-run-batch-testsThe options in the above command are explained below.
| -Q | ignores any personal configuration ensuring a vanilla Emacs instance is used |
| –batch | runs Emacs in “batch” mode with no gui and termination after execution |
| -l | loads Org mode and the Org mode test suite defined in testing/org-test.el |
| –eval | reloads Org mode and allows evaluation of code blocks by the tests |
| -f | actually runs the tests using the `org-test-run-batch-tests’ function |
Target test can be used to trigger a test run. The tests start
after cleaning up and recompilation.
make testSee ../mk/default.mk for details.
The ‘dirty’ targets are for recompiling without cleaning and rebuilding everything. This usually speeds up the recompilation considerably. Note that this speed up comes to the price of possibly weird errors due to the unclean build.
The dirty target for testing is called test-dirty.
make test-dirtyVariable BTEST_RE can be set to limit the tests which are performed.
BTEST_RE is interpreted as regexp.
Example:
make BTEST_RE='test-.*-inlinetask' test-dirtyyields
... selected tests: test-.*-inlinetask Running 2 tests (2017-12-28 15:04:45+0100) passed 1/2 test-org-export/handle-inlinetasks passed 2/2 test-org-inlinetask/goto-end Ran 2 tests, 2 results as expected (2017-12-28 15:04:45+0100) ...
Set the TEST_NO_AUTOCLEAN variable to leave the test directory
around for inspection.
make TEST_NO_AUTOCLEAN=1 test-dirtyTo run the Org mode test suite from a current Emacs instance simply load and run the test suite with the following commands.
- First load the test suite.
(add-to-list 'load-path (file-name-directory here)) (require 'org-test)
- Load required Babel languages
(org-babel-do-load-languages 'org-babel-load-languages (and (mapc (lambda (lang) (add-to-list 'org-babel-load-languages (cons lang t))) '(emacs-lisp shell org)) org-babel-load-languages))
- Then run the test suite. Babel evaluation confirmation is disabled
and
C-c C-cis enabled while running the tests.(let (org-babel-no-eval-on-ctrl-c-ctrl-c org-confirm-babel-evaluate) (org-test-run-all-tests))When a test fails, run it interactively and investigate the problem in the ERT results buffer.
To run one test: Use this as a demo example of a failing test
(ert-deftest test-demo/example-of-a-failing-test () (should (string= "AB" (concat "A" "B"))) (should (string= "CD" (concat "C" "C" "D"))))
or evaluate the
ert-deftestform of the test you want to run. ThenM-x ert RET test-demo/example-of-a-failing-test RET. When not visible yet switch to the ERT results buffer named*ert*. When a test failed the ERT results buffer shows the details of the firstshouldthat failed. See <a href=”info:ert::Running Tests Interactively”>info:ert::Running Tests Interactively for how to re-run, start the debugger etc.To run several tests:
M-x ert RET "<your regexp here>" RET.To run all tests of a single test file:
M-x ert-delete-all-tests RETand confirm.M-x load-file RET testing/lisp/<file>.el RET M-x ert RET t RET.Consider to set
(setq pp-escape-newlines nil)
before running the test when looking at
shouldin the ERT results buffer. Especially when usinglto look at passed test results and possibly missing an appropriate setting ofpp-escape-newlinesmade only temporarily for the running time of the test as e. g. tests usingorg-test-table-target-expect-tblfmdo.
- If the variable
org-babel-no-eval-on-ctrl-c-ctrl-cis non-nil then it will result in some test failure, as there are tests which rely on this behavior.