From 04e64b04ab8df7bff4a9fa0c49138355a474de79 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 3 Jul 2025 13:08:53 -0500 Subject: [PATCH] test output updates: - by default, make tests put all their output into files (under target/surefire-reports/) - with system property -DtestOutputToFile=false to get all output on console; - have circleci store that output as artifacts; - run mvn in 'batch mode' in circleci, for quieter output (no download progress, no color codes) --- .circleci/config.yml | 53 ++++++++++++++++++++++++++++++++++++++++---- README.md | 14 ++++++++++++ pom.xml | 8 ++++--- 3 files changed, 68 insertions(+), 7 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c2e70028..83312064 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -28,10 +28,55 @@ commands: - run: name: Run Maven Verify command: | - mvn -s .circleci/mvn-settings.xml -T4 verify + mvn -s .circleci/mvn-settings.xml -T4 --batch-mode verify - store_artifacts: path: "*/target/site/jacoco/" when: always + - store_artifacts: + path: "*/target/test-logs/" + when: always + - run: + name: Concatenate test output files + command: | + # Create artifacts directory + mkdir -p ~/test-output-artifacts/ + + # Find all module directories that have target/surefire-reports + for module_dir in */; do + if [ -d "${module_dir}target/surefire-reports" ]; then + module_name=$(basename "${module_dir%/}") + output_file="~/test-output-artifacts/${module_name}-test-output.txt" + + echo "Processing module: ${module_name}" + echo "Output file: ${output_file}" + + # Concatenate all .txt files in the surefire-reports directory + if [ -n "$(find "${module_dir}target/surefire-reports" -name "*.txt" -type f)" ]; then + echo "=== Test Output for ${module_name} ===" > "${output_file}" + echo "Generated at: $(date)" >> "${output_file}" + echo "==========================================" >> "${output_file}" + echo "" >> "${output_file}" + + # Sort files to ensure consistent ordering + find "${module_dir}target/surefire-reports" -name "*.txt" -type f | sort | while read -r txt_file; do + echo "--- File: $(basename "${txt_file}") ---" >> "${output_file}" + cat "${txt_file}" >> "${output_file}" + echo "" >> "${output_file}" + echo "--- End of $(basename "${txt_file}") ---" >> "${output_file}" + echo "" >> "${output_file}" + done + + echo "Concatenated test output for ${module_name} to ${output_file}" + else + echo "No .txt files found in ${module_dir}target/surefire-reports" + fi + fi + done + when: always + - store_artifacts: + path: ~/test-output-artifacts + destination: test-output + when: always - run: name: Save test results command: | @@ -54,8 +99,8 @@ commands: - run: name: Build and Run ValidateApiVersions command: | - mvn -s .circleci/mvn-settings.xml -T4 install -DskipTests - mvn -s .circleci/mvn-settings.xml -pl qqq-middleware-javalin package appassembler:assemble -DskipTests + mvn -s .circleci/mvn-settings.xml -T4 --batch-mode install -DskipTests + mvn -s .circleci/mvn-settings.xml -T4 --batch-mode -pl qqq-middleware-javalin package appassembler:assemble -DskipTests qqq-middleware-javalin/target/appassembler/bin/ValidateApiVersions -r $(pwd) mvn_jar_deploy: @@ -71,7 +116,7 @@ commands: - run: name: Run Maven Jar Deploy command: | - mvn -s .circleci/mvn-settings.xml -T4 flatten:flatten jar:jar deploy:deploy + mvn -s .circleci/mvn-settings.xml -T4 --batch-mode flatten:flatten jar:jar deploy:deploy - save_cache: paths: - ~/.m2 diff --git a/README.md b/README.md index 797f0e0b..8a810ee7 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,20 @@ There are a few useful IntelliJ settings files, under `qqq-dev-tools/intellij`: One will likely also want the [Kingsrook Commentator Plugin](https://plugins.jetbrains.com/plugin/19325-kingsrook-commentator). +## Test Logging +By default, when ran from the command line, mvn surefire will make each test's +output (e.g., System.out, err, printStackTrace, and all logger calls) go into a +file under target/surefire-reports/${className}.txt. + +The system property `-DtestOutputToFile=false` can be given on the command line +to get all of this output on the console. + +In the IDE (e.g,. IntelliJ), output goes to the Console. + +In CircleCI, output goes to files, and those files are concatenated together and +stored as artifacts. + + ## License QQQ - Low-code Application Framework for Engineers. \ Copyright (C) 2020-2024. Kingsrook, LLC \ diff --git a/pom.xml b/pom.xml index a69a3ce8..291e05db 100644 --- a/pom.xml +++ b/pom.xml @@ -59,6 +59,7 @@ 0.80 0.95 none + true @@ -141,6 +142,8 @@ @{jaCoCoArgLine} + + ${testOutputToFile} @@ -249,10 +252,9 @@ echo " See also target/site/jacoco/index.html" echo " and https://www.jacoco.org/jacoco/trunk/doc/counters.html" echo "------------------------------------------------------------" -# Parse Jacoco HTML coverage summary using grep and sed +# Parse Jacoco HTML coverage summary if [ -f target/site/jacoco/index.html ]; then - echo -e "Instructions Missed\nInstruction Coverage\nBranches Missed\nBranch Coverage\nComplexity Missed\nComplexity Hit\nLines Missed\nLines Hit\nMethods Missed\nMethods Hit\nClasses Missed\nClasses Hit\n" > /tmp/$$headers - # Extract values from the footer row of the coverage table + echo -e "Instructions Missed\nInstruction Coverage\nBranches Missed\nBranch Coverage\nComplexity Missed\nComplexity Hit\nLines Missed\nLines Hit\nMethods Missed\nMethods Hit\nClasses Missed\nClasses Hit\n" > /tmp/$$.headers sed 's/<\/\w\+>/&\n/g' target/site/jacoco/index.html | grep -A 12 '' | grep '\([^<]*\)<\/td>/\1/' | grep -v Total > /tmp/$$.values paste /tmp/$$.headers /tmp/$$.values | tail +2 | awk -v FS='\t' '{printf("%-20s %s\n",$1,$2)}' rm /tmp/$$.headers /tmp/$$.values