123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- # coding=utf-8
- #
- # This file is part of Hypothesis, which may be found at
- # https://github.com/HypothesisWorks/hypothesis-python
- #
- # Most of this work is copyright (C) 2013-2018 David R. MacIver
- # (david@drmaciver.com), but it contains contributions by others. See
- # CONTRIBUTING.rst for a full list of people who may hold copyright, and
- # consult the git log if you need to determine who owns an individual
- # contribution.
- #
- # This Source Code Form is subject to the terms of the Mozilla Public License,
- # v. 2.0. If a copy of the MPL was not distributed with this file, You can
- # obtain one at http://mozilla.org/MPL/2.0/.
- #
- # END HEADER
- from __future__ import division, print_function, absolute_import
- import pytest
- import hypothesis.core as core
- from hypothesis.reporting import default as default_reporter
- from hypothesis.reporting import with_reporter
- from hypothesis.statistics import collector
- from hypothesis.internal.compat import OrderedDict, text_type
- from hypothesis.internal.detection import is_hypothesis_test
- LOAD_PROFILE_OPTION = '--hypothesis-profile'
- PRINT_STATISTICS_OPTION = '--hypothesis-show-statistics'
- SEED_OPTION = '--hypothesis-seed'
- class StoringReporter(object):
- def __init__(self, config):
- self.config = config
- self.results = []
- def __call__(self, msg):
- if self.config.getoption('capture', 'fd') == 'no':
- default_reporter(msg)
- if not isinstance(msg, text_type):
- msg = repr(msg)
- self.results.append(msg)
- def pytest_addoption(parser):
- group = parser.getgroup('hypothesis', 'Hypothesis')
- group.addoption(
- LOAD_PROFILE_OPTION,
- action='store',
- help='Load in a registered hypothesis.settings profile'
- )
- group.addoption(
- PRINT_STATISTICS_OPTION,
- action='store_true',
- help='Configure when statistics are printed',
- default=False
- )
- group.addoption(
- SEED_OPTION,
- action='store',
- help='Set a seed to use for all Hypothesis tests'
- )
- def pytest_configure(config):
- core.running_under_pytest = True
- from hypothesis import settings
- profile = config.getoption(LOAD_PROFILE_OPTION)
- if profile:
- settings.load_profile(profile)
- seed = config.getoption(SEED_OPTION)
- if seed is not None:
- try:
- seed = int(seed)
- except ValueError:
- pass
- core.global_force_seed = seed
- config.addinivalue_line(
- 'markers',
- 'hypothesis: Tests which use hypothesis.')
- gathered_statistics = OrderedDict()
- @pytest.mark.hookwrapper
- def pytest_runtest_call(item):
- if not (hasattr(item, 'obj') and is_hypothesis_test(item.obj)):
- yield
- else:
- store = StoringReporter(item.config)
- def note_statistics(stats):
- gathered_statistics[item.nodeid] = stats
- with collector.with_value(note_statistics):
- with with_reporter(store):
- yield
- if store.results:
- item.hypothesis_report_information = list(store.results)
- @pytest.mark.hookwrapper
- def pytest_runtest_makereport(item, call):
- report = (yield).get_result()
- if hasattr(item, 'hypothesis_report_information'):
- report.sections.append((
- 'Hypothesis',
- '\n'.join(item.hypothesis_report_information)
- ))
- def pytest_terminal_summary(terminalreporter):
- if not terminalreporter.config.getoption(PRINT_STATISTICS_OPTION):
- return
- terminalreporter.section('Hypothesis Statistics')
- for name, statistics in gathered_statistics.items():
- terminalreporter.write_line(name + ':')
- terminalreporter.write_line('')
- if not statistics.has_runs:
- terminalreporter.write_line(' - Test was never run')
- continue
- terminalreporter.write_line((
- ' - %d passing examples, %d failing examples,'
- ' %d invalid examples') % (
- statistics.passing_examples, statistics.failing_examples,
- statistics.invalid_examples,
- ))
- terminalreporter.write_line(
- ' - Typical runtimes: %s' % (statistics.runtimes,)
- )
- terminalreporter.write_line(
- ' - Fraction of time spent in data generation: %s' % (
- statistics.draw_time_percentage,))
- terminalreporter.write_line(
- ' - Stopped because %s' % (statistics.exit_reason,)
- )
- if statistics.events:
- terminalreporter.write_line(' - Events:')
- for event in statistics.events:
- terminalreporter.write_line(
- ' * %s' % (event,)
- )
- terminalreporter.write_line('')
- def pytest_collection_modifyitems(items):
- for item in items:
- if not isinstance(item, pytest.Function):
- continue
- if getattr(item.function, 'is_hypothesis_test', False):
- item.add_marker('hypothesis')
- def load():
- pass
|