From: Michael Albinus Date: Wed, 14 Mar 2018 15:21:06 +0000 (+0100) Subject: Extend ert to print duration of single tests X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=e3338f29335e2e2b73478436266ff0944da7b925;p=emacs.git Extend ert to print duration of single tests * lisp/emacs-lisp/ert.el (ert-test-result): New slot ´duration'. (ert-run-or-rerun-test): Set it. (ert-batch-print-duration): New defvar. (ert-run-tests-batch): Print duration if needed. * test/Makefile.in (TEST_PRINT_TEST_DURATION): New variable. * test/README: Explain TEST_PRINT_TEST_DURATION. --- diff --git a/lisp/emacs-lisp/ert.el b/lisp/emacs-lisp/ert.el index a47108545d1..7d8d0a50e48 100644 --- a/lisp/emacs-lisp/ert.el +++ b/lisp/emacs-lisp/ert.el @@ -676,6 +676,7 @@ and is displayed in front of the value of MESSAGE-FORM." (cl-defstruct ert-test-result (messages nil) (should-forms nil) + (duration 0) ) (cl-defstruct (ert-test-passed (:include ert-test-result))) (cl-defstruct (ert-test-result-with-condition (:include ert-test-result)) @@ -1230,6 +1231,11 @@ SELECTOR is the selector that was used to select TESTS." (ert-run-test test) (setf (aref (ert--stats-test-end-times stats) pos) (current-time)) (let ((result (ert-test-most-recent-result test))) + (setf (ert-test-result-duration result) + (float-time + (time-subtract + (aref (ert--stats-test-end-times stats) pos) + (aref (ert--stats-test-start-times stats) pos)))) (ert--stats-set-test-and-result stats pos test result) (funcall listener 'test-ended stats test result)) (setf (ert--stats-current-test stats) nil)))) @@ -1336,6 +1342,9 @@ RESULT must be an `ert-test-result-with-condition'." (defvar ert-quiet nil "Non-nil makes ERT only print important information in batch mode.") +(defvar ert-batch-print-duration nil + "Non-nil makes ERT print duration time of single tests in batch mode.") + ;;;###autoload (defun ert-run-tests-batch (&optional selector) "Run the tests specified by SELECTOR, printing results to the terminal. @@ -1446,13 +1455,17 @@ Returns the stats object." (let* ((max (prin1-to-string (length (ert--stats-tests stats)))) (format-string (concat "%9s %" (prin1-to-string (length max)) - "s/" max " %S"))) + "s/" max " %S" + (if ert-batch-print-duration + " (%f sec)")))) (message format-string (ert-string-for-test-result result (ert-test-result-expected-p test result)) (1+ (ert--stats-test-pos stats test)) - (ert-test-name test)))))))) + (ert-test-name test) + (if ert-batch-print-duration + (ert-test-result-duration result))))))))) nil)) ;;;###autoload diff --git a/test/Makefile.in b/test/Makefile.in index 42d9880e66a..0b6f8c2eecf 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -99,14 +99,20 @@ TEST_LOCALE = C # If you just want a pass/fail, setting this to no is much faster. TEST_LOAD_EL ?= yes +# Additional settings for ert. +ert_opts = + # Maximum length of lines in ert backtraces; nil for no limit. # (if empty, use the default ert-batch-backtrace-right-margin). TEST_BACKTRACE_LINE_LENGTH = -ifeq (${TEST_BACKTRACE_LINE_LENGTH},) -ert_opts = -else -ert_opts = --eval '(setq ert-batch-backtrace-right-margin ${TEST_BACKTRACE_LINE_LENGTH})' +ifneq (${TEST_BACKTRACE_LINE_LENGTH},) +ert_opts += --eval '(setq ert-batch-backtrace-right-margin ${TEST_BACKTRACE_LINE_LENGTH})' +endif + +# Whether the tests shall also report their duration. +ifdef TEST_PRINT_TEST_DURATION +ert_opts += --eval '(setq ert-batch-print-duration t)' endif ifeq (@HAVE_MODULES@, yes) diff --git a/test/README b/test/README index 1cd9db3bb88..11a25fb524b 100644 --- a/test/README +++ b/test/README @@ -50,6 +50,11 @@ nicer backtraces. To run the compiled version of a test use make TEST_LOAD_EL=no ... +Sometimes, it is ncessary to trace the duration time for single tests. +This is controlled by the environment variable TEST_PRINT_TEST_DURATION + + make TEST_PRINT_TEST_DURATION=1 ... + (Also, see etc/compilation.txt for compilation mode font lock tests.)