Source code for stestr.commands.slowest

# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.

"""Show the longest running tests in the repository."""

import math
from operator import itemgetter
import sys

from stestr import output
from stestr.repository import util


def get_cli_help():
    help_str = """Show the slowest tests from the last test run.

    This command shows a table, with the longest running
    tests at the top.
    """
    return help_str


def set_cli_opts(parser):
    parser.add_argument(
        "--all", action="store_true",
        default=False, help="Show timing for all tests."),


def format_times(times):
    times = list(times)
    precision = 3
    digits_before_point = int(
        math.log10(times[0][1])) + 1
    min_length = digits_before_point + precision + 1

    def format_time(time):
        # Limit the number of digits after the decimal
        # place, and also enforce a minimum width
        # based on the longest duration
        return "%*.*f" % (min_length, precision, time)
    times = [(name, format_time(time)) for name, time in times]
    return times


def run(arguments):
    args = arguments[0]
    return slowest(repo_type=args.repo_type, repo_url=args.repo_url,
                   show_all=args.all)


[docs]def slowest(repo_type='file', repo_url=None, show_all=False, stdout=sys.stdout): """Print the slowest times from the last run in the repository This function will print to STDOUT the 10 slowests tests in the last run. Optionally, using the ``show_all`` argument, it will print all the tests, instead of just 10. sorted by time. :param str repo_type: This is the type of repository to use. Valid choices are 'file' and 'sql'. :param str repo_url: The url of the repository to use. :param bool show_all: Show timing for all tests. :param file stdout: The output file to write all output to. By default this is sys.stdout :return return_code: The exit code for the command. 0 for success and > 0 for failures. :rtype: int """ repo = util.get_repo_open(repo_type, repo_url) try: latest_id = repo.latest_id() except KeyError: return 3 # what happens when there is no timing info? test_times = repo.get_test_times(repo.get_test_ids(latest_id)) known_times = list(test_times['known'].items()) known_times.sort(key=itemgetter(1), reverse=True) if len(known_times) > 0: # By default show 10 rows if not show_all: known_times = known_times[:10] known_times = format_times(known_times) header = ('Test id', 'Runtime (s)') rows = [header] + known_times output.output_table(rows, output=stdout) return 0