Execution time of tests in unit test class via maven surefire-report in a single file in summarized format

前端 未结 3 1554
悲&欢浪女
悲&欢浪女 2021-01-02 16:03

Can anyone let me know how can I get the time taken by each of the unit tests in a unit test class in a single file via maven-surefire? I have seen my tar

相关标签:
3条回答
  • 2021-01-02 16:18

    I wrote a small bash script with Martin Höller's snippet that might help someone:

    #!/bin/bash
    
    # This script goes through tests results in `target/surefire-reports` and sorts the results by the
    # amount of time they took. This is helpful to identify slow tests.
    
    set -e
    
    # Make sure the surefire folder exists
    if [ ! -d "target/surefire-reports" ]; then
        echo "The folder 'target/surefire-reports' doesn't exists. Please run tests before using this script."
        exit 1
    fi
    
    # Go through the surefire test reports and sort tests by time taken. Source for this snippet:
    # https://stackoverflow.com/questions/45854277/execution-time-of-tests-in-unit-test-class-via-maven-surefire-report-in-a-single/45859700#45859700
    grep -h testcase target/surefire-reports/TEST-*.xml |
        awk -F '"' '{print $4 "#" $2 "() - " $6 "ms" }' |
          sort -rn -k 3
    
    0 讨论(0)
  • 2021-01-02 16:29

    The maven-surefire-plugin currently doesn't let you do this. It writes all the results in separate files. You could create a feature-request in its issue tracker, if you feel like this is a missing feature.

    However you can use some Linux commands to convert the output to what you need. Here are some commands that turn the separate XML files into a single file that looks like what you want:

    grep testcase target/surefire-reports/TEST-*.xml |
      sed 's/.* name="\(.*\)" classname="\(.*\)" time="\(.*\)".*/\2#\1() - \3ms/g' |
      sort -n -k 3 > output.txt
    

    Update: Numeric sorting has problems with varying number of fraction digits. Use awk version below to solve this.


    The same thing could be done with awk a bit shorter and less cryptic:

    grep -h testcase target/surefire-reports/TEST-*.xml |
      awk -F '"' '{printf("%s#%s() - %.3fms\n", $4, $2, $6); }' |
      sort -n -k 3 > output.txt
    

    You have to execute these commands from the toplevel directory of your maven project after the surefire-reports were generated.

    If you have multi-module project, use this instead:

    find . -name TEST-*.xml -exec grep -h testcase {} \; |
      awk -F '"' '{printf("%s#%s() - %.3fms\n", $4, $2, $6); }' |
      sort -n -k 3 > output.txt
    

    The resulting file is output.txt and contains lines of the following format:

    <classname>#<methodname>() - <time>ms
    

    The result is sorted by consumed time.

    0 讨论(0)
  • 2021-01-02 16:36

    You can use surefire-report-plugin for aggregation the results (but it still won't been sorted)

    mvn surefire-report:report -DlinkXRef=false -Daggregate=true
    

    or

    mvn surefire-report:report-only -DlinkXRef=false -Daggregate=true
    

    if you've already build the project with surefire plugin.

    This will generate surefire-report.html in your root target directory where you can find time stats for each module and each test suite.

    0 讨论(0)
提交回复
热议问题