diff options
author | Michael Albinus <michael.albinus@gmx.de> | 2021-12-17 20:02:21 +0100 |
---|---|---|
committer | Michael Albinus <michael.albinus@gmx.de> | 2021-12-17 20:02:21 +0100 |
commit | 041fff3d3dda2914f40b590a5e6a9f791a5a7fd0 (patch) | |
tree | 6206988014868b20429a96837ee5ede57b10cbf0 /lisp | |
parent | cf33ece31016828ceeeee1154a4fc057957eefbc (diff) | |
download | emacs-041fff3d3dda2914f40b590a5e6a9f791a5a7fd0.tar.gz emacs-041fff3d3dda2914f40b590a5e6a9f791a5a7fd0.tar.bz2 emacs-041fff3d3dda2914f40b590a5e6a9f791a5a7fd0.zip |
Handle missing JUnit test reports
* lisp/emacs-lisp/ert.el (ert-write-junit-test-report)
(ert-write-junit-test-summary-report): Handle missing JUnit test reports.
Diffstat (limited to 'lisp')
-rw-r--r-- | lisp/emacs-lisp/ert.el | 232 |
1 files changed, 118 insertions, 114 deletions
diff --git a/lisp/emacs-lisp/ert.el b/lisp/emacs-lisp/ert.el index 597044cf21c..019916e6172 100644 --- a/lisp/emacs-lisp/ert.el +++ b/lisp/emacs-lisp/ert.el @@ -1531,102 +1531,100 @@ the tests)." "Write a JUnit test report, generated from STATS." ;; https://www.ibm.com/docs/en/developer-for-zos/14.1.0?topic=formats-junit-xml-format ;; https://llg.cubic.org/docs/junit/ - (unless (zerop (length (ert--stats-tests stats))) - (when-let ((test-file - (symbol-file - (ert-test-name (aref (ert--stats-tests stats) 0)) 'ert--test)) - (test-report (file-name-with-extension test-file "xml"))) - (with-temp-file test-report - (insert "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n") - (insert (format "<testsuites name=\"%s\" tests=\"%s\" errors=\"%s\" failures=\"%s\" skipped=\"%s\" time=\"%s\">\n" - (file-name-nondirectory test-report) - (ert-stats-total stats) - (if (ert--stats-aborted-p stats) 1 0) - (ert-stats-completed-unexpected stats) - (ert-stats-skipped stats) - (float-time - (time-subtract - (ert--stats-end-time stats) - (ert--stats-start-time stats))))) - (insert (format " <testsuite id=\"0\" name=\"%s\" tests=\"%s\" errors=\"%s\" failures=\"%s\" skipped=\"%s\" time=\"%s\" timestamp=\"%s\">\n" - (file-name-nondirectory test-report) - (ert-stats-total stats) - (if (ert--stats-aborted-p stats) 1 0) - (ert-stats-completed-unexpected stats) - (ert-stats-skipped stats) - (float-time - (time-subtract - (ert--stats-end-time stats) - (ert--stats-start-time stats))) - (ert--format-time-iso8601 (ert--stats-end-time stats)))) - (insert " <properties>\n" - (format " <property name=\"selector\" value=\"%s\"/>\n" - (ert--stats-selector stats)) - " </properties>\n") - (cl-loop for test across (ert--stats-tests stats) - for result = (ert-test-most-recent-result test) do - (insert (format " <testcase name=\"%s\" status=\"%s\" time=\"%s\"" - (xml-escape-string - (symbol-name (ert-test-name test))) - (ert-string-for-test-result - result - (ert-test-result-expected-p test result)) - (ert-test-result-duration result))) - (if (and (ert-test-result-expected-p test result) - (not (ert-test-aborted-with-non-local-exit-p result)) - (not (ert-test-skipped-p result)) - (zerop (length (ert-test-result-messages result)))) - (insert "/>\n") - (insert ">\n") - (cond - ((ert-test-skipped-p result) - (insert (format " <skipped message=\"%s\" type=\"%s\">\n" - (xml-escape-string - (string-trim - (ert-reason-for-test-result result))) - (ert-string-for-test-result - result - (ert-test-result-expected-p - test result))) - (xml-escape-string - (string-trim - (ert-reason-for-test-result result))) - "\n" - " </skipped>\n")) - ((ert-test-aborted-with-non-local-exit-p result) - (insert (format " <error message=\"%s\" type=\"%s\">\n" - (file-name-nondirectory test-report) - (ert-string-for-test-result - result - (ert-test-result-expected-p - test result))) - (format "Test %s aborted with non-local exit\n" - (xml-escape-string - (symbol-name (ert-test-name test)))) - " </error>\n")) - ((not (ert-test-result-type-p - result (ert-test-expected-result-type test))) - (insert (format " <failure message=\"%s\" type=\"%s\">\n" - (xml-escape-string - (string-trim - (ert-reason-for-test-result result))) - (ert-string-for-test-result - result - (ert-test-result-expected-p - test result))) - (xml-escape-string - (string-trim - (ert-reason-for-test-result result))) - "\n" - " </failure>\n"))) - (unless (zerop (length (ert-test-result-messages result))) - (insert " <system-out>\n" - (xml-escape-string - (ert-test-result-messages result)) - " </system-out>\n")) - (insert " </testcase>\n"))) - (insert " </testsuite>\n") - (insert "</testsuites>\n"))))) + (when-let ((symbol (car (apropos-internal "" #'ert-test-boundp))) + (test-file (symbol-file symbol 'ert--test)) + (test-report (file-name-with-extension test-file "xml"))) + (with-temp-file test-report + (insert "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n") + (insert (format "<testsuites name=\"%s\" tests=\"%s\" errors=\"%s\" failures=\"%s\" skipped=\"%s\" time=\"%s\">\n" + (file-name-nondirectory test-report) + (ert-stats-total stats) + (if (ert--stats-aborted-p stats) 1 0) + (ert-stats-completed-unexpected stats) + (ert-stats-skipped stats) + (float-time + (time-subtract + (ert--stats-end-time stats) + (ert--stats-start-time stats))))) + (insert (format " <testsuite id=\"0\" name=\"%s\" tests=\"%s\" errors=\"%s\" failures=\"%s\" skipped=\"%s\" time=\"%s\" timestamp=\"%s\">\n" + (file-name-nondirectory test-report) + (ert-stats-total stats) + (if (ert--stats-aborted-p stats) 1 0) + (ert-stats-completed-unexpected stats) + (ert-stats-skipped stats) + (float-time + (time-subtract + (ert--stats-end-time stats) + (ert--stats-start-time stats))) + (ert--format-time-iso8601 (ert--stats-end-time stats)))) + (insert " <properties>\n" + (format " <property name=\"selector\" value=\"%s\"/>\n" + (ert--stats-selector stats)) + " </properties>\n") + (cl-loop for test across (ert--stats-tests stats) + for result = (ert-test-most-recent-result test) do + (insert (format " <testcase name=\"%s\" status=\"%s\" time=\"%s\"" + (xml-escape-string + (symbol-name (ert-test-name test))) + (ert-string-for-test-result + result + (ert-test-result-expected-p test result)) + (ert-test-result-duration result))) + (if (and (ert-test-result-expected-p test result) + (not (ert-test-aborted-with-non-local-exit-p result)) + (not (ert-test-skipped-p result)) + (zerop (length (ert-test-result-messages result)))) + (insert "/>\n") + (insert ">\n") + (cond + ((ert-test-skipped-p result) + (insert (format " <skipped message=\"%s\" type=\"%s\">\n" + (xml-escape-string + (string-trim + (ert-reason-for-test-result result))) + (ert-string-for-test-result + result + (ert-test-result-expected-p + test result))) + (xml-escape-string + (string-trim + (ert-reason-for-test-result result))) + "\n" + " </skipped>\n")) + ((ert-test-aborted-with-non-local-exit-p result) + (insert (format " <error message=\"%s\" type=\"%s\">\n" + (file-name-nondirectory test-report) + (ert-string-for-test-result + result + (ert-test-result-expected-p + test result))) + (format "Test %s aborted with non-local exit\n" + (xml-escape-string + (symbol-name (ert-test-name test)))) + " </error>\n")) + ((not (ert-test-result-type-p + result (ert-test-expected-result-type test))) + (insert (format " <failure message=\"%s\" type=\"%s\">\n" + (xml-escape-string + (string-trim + (ert-reason-for-test-result result))) + (ert-string-for-test-result + result + (ert-test-result-expected-p + test result))) + (xml-escape-string + (string-trim + (ert-reason-for-test-result result))) + "\n" + " </failure>\n"))) + (unless (zerop (length (ert-test-result-messages result))) + (insert " <system-out>\n" + (xml-escape-string + (ert-test-result-messages result)) + " </system-out>\n")) + (insert " </testcase>\n"))) + (insert " </testsuite>\n") + (insert "</testsuites>\n")))) (defun ert-write-junit-test-summary-report (&rest logfiles) "Write a JUnit summary test report, generated from LOGFILES." @@ -1637,24 +1635,30 @@ the tests)." (dolist (logfile logfiles) (let ((test-report (file-name-with-extension logfile "xml"))) (if (not (file-readable-p test-report)) - (let ((logfile (file-name-with-extension logfile "log"))) - (insert (format " <testsuite id=\"%s\" name=\"%s\" tests=\"1\" errors=\"1\" failures=\"0\" skipped=\"0\" time=\"0\" timestamp=\"%s\">\n" - id test-report - (ert--format-time-iso8601 (current-time)))) - (insert (format " <testcase name=\"Test report missing %s\" status=\"error\" time=\"0\">\n" - (file-name-nondirectory test-report))) - (insert (format " <error message=\"Test report missing %s\" type=\"error\">\n" - (file-name-nondirectory test-report))) - (when (file-readable-p logfile) - (insert (xml-escape-string - (with-temp-buffer - (insert-file-contents-literally logfile) - (buffer-string))))) - (insert " </error>\n" - " </testcase>\n" - " </testsuite>\n") - (cl-incf errors 1) - (cl-incf id 1)) + (let* ((logfile (file-name-with-extension logfile "log")) + (logfile-contents + (when (file-readable-p logfile) + (with-temp-buffer + (insert-file-contents-literally logfile) + (buffer-string))))) + (unless + ;; No defined tests, perhaps a helper file. + (and logfile-contents + (string-match-p "^Running 0 tests" logfile-contents)) + (insert (format " <testsuite id=\"%s\" name=\"%s\" tests=\"1\" errors=\"1\" failures=\"0\" skipped=\"0\" time=\"0\" timestamp=\"%s\">\n" + id test-report + (ert--format-time-iso8601 (current-time)))) + (insert (format " <testcase name=\"Test report missing %s\" status=\"error\" time=\"0\">\n" + (file-name-nondirectory test-report))) + (insert (format " <error message=\"Test report missing %s\" type=\"error\">\n" + (file-name-nondirectory test-report))) + (when logfile-contents + (insert (xml-escape-string logfile-contents))) + (insert " </error>\n" + " </testcase>\n" + " </testsuite>\n") + (cl-incf errors 1) + (cl-incf id 1))) (insert-file-contents-literally test-report) (when (looking-at-p |