From 8be9d4a1568c34aed753b085d5d33daef5dfa797 Mon Sep 17 00:00:00 2001 From: Julian Scheid Date: Tue, 15 Jun 2021 17:01:49 +0200 Subject: [PATCH] Allow ERT tests to output the failure reasons, too * lisp/emacs-lisp/ert.el (ert-reason-for-test-result): New function. (ert-run-tests-batch): Output failure or skip reason (bug#47071). --- doc/misc/ert.texi | 4 ++++ etc/NEWS | 7 +++++++ lisp/emacs-lisp/ert.el | 31 +++++++++++++++++++++++++++---- 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/doc/misc/ert.texi b/doc/misc/ert.texi index a4e2cb506a3..fafdb8c4eb4 100644 --- a/doc/misc/ert.texi +++ b/doc/misc/ert.texi @@ -347,6 +347,10 @@ emacs -batch -l ert -l my-tests.el \ -eval '(ert-run-tests-batch-and-exit "to-match")' @end example +By default, ERT test failure summaries are quite brief in batch +mode--only the names of the failed tests are listed. If the +EMACS_TEST_VERBOSE environment variable is set, the failure summaries +will also include the data from the failing test. @node Test Selectors @section Test Selectors diff --git a/etc/NEWS b/etc/NEWS index 60f3172041a..30114cab2fd 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -2090,6 +2090,13 @@ This allows mode-specific alterations to how 'thing-at-point' works. This is so 'C-a' works as in other modes, and in particular holding Shift while typing 'C-a', i.e. 'C-S-a', will now highlight the text. +** ERT + ++++ +*** ERT can now output more verbose test failure reports. +If the EMACS_TEST_VERBOSE environment variable is set, failure +summaries will include the failing condition. + ** Miscellaneous +++ diff --git a/lisp/emacs-lisp/ert.el b/lisp/emacs-lisp/ert.el index e91ec0af443..6793b374eea 100644 --- a/lisp/emacs-lisp/ert.el +++ b/lisp/emacs-lisp/ert.el @@ -1279,6 +1279,23 @@ EXPECTEDP specifies whether the result was expected." (ert-test-quit '("quit" "QUIT"))))) (elt s (if expectedp 0 1)))) +(defun ert-reason-for-test-result (result) + "Return the reason given for RESULT, as a string. + +The reason is the argument given when invoking `ert-fail' or `ert-skip'. +It is output using `prin1' prefixed by two spaces. + +If no reason was given, or for a successful RESULT, return the +empty string." + (let ((reason + (and + (ert-test-result-with-condition-p result) + (cadr (ert-test-result-with-condition-condition result)))) + (print-escape-newlines t) + (print-level 6) + (print-length 10)) + (if reason (format " %S" reason) ""))) + (defun ert--pp-with-indentation-and-newline (object) "Pretty-print OBJECT, indenting it to the current column of point. Ensures a final newline is inserted." @@ -1369,18 +1386,24 @@ Returns the stats object." (cl-loop for test across (ert--stats-tests stats) for result = (ert-test-most-recent-result test) do (when (not (ert-test-result-expected-p test result)) - (message "%9s %S" + (message "%9s %S%s" (ert-string-for-test-result result nil) - (ert-test-name test)))) + (ert-test-name test) + (if (getenv "EMACS_TEST_VERBOSE") + (ert-reason-for-test-result result) + "")))) (message "%s" "")) (unless (zerop skipped) (message "%s skipped results:" skipped) (cl-loop for test across (ert--stats-tests stats) for result = (ert-test-most-recent-result test) do (when (ert-test-result-type-p result :skipped) - (message "%9s %S" + (message "%9s %S%s" (ert-string-for-test-result result nil) - (ert-test-name test)))) + (ert-test-name test) + (if (getenv "EMACS_TEST_VERBOSE") + (ert-reason-for-test-result result) + "")))) (message "%s" ""))))) (test-started ) -- 2.39.5