def call_for_statistics(test_function): result = [None] def callback(statistics): result[0] = statistics with collector.with_value(callback): try: test_function() except Exception: traceback.print_exc() assert result[0] is not None return result[0]
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)
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): lines = [item.nodeid + ":", ""] + stats.get_description() + [""] gathered_statistics[item.nodeid] = lines item.hypothesis_statistics = lines with collector.with_value(note_statistics): with with_reporter(store): yield if store.results: item.hypothesis_report_information = list(store.results)
def pytest_runtest_call(item): if not hasattr(item, "obj"): yield elif not is_hypothesis_test(item.obj): # If @given was not applied, check whether other hypothesis # decorators were applied, and raise an error if they were. if getattr(item.obj, "is_hypothesis_strategy_function", False): raise InvalidArgument( "%s is a function that returns a Hypothesis strategy, but pytest " "has collected it as a test function. This is useless as the " "function body will never be executed. To define a test " "function, use @given instead of @composite." % (item.nodeid, )) message = "Using `@%s` on a test without `@given` is completely pointless." for name, attribute in [ ("example", "hypothesis_explicit_examples"), ("seed", "_hypothesis_internal_use_seed"), ("settings", "_hypothesis_internal_settings_applied"), ("reproduce_example", "_hypothesis_internal_use_reproduce_failure"), ]: if hasattr(item.obj, attribute): raise InvalidArgument(message % (name, )) yield else: # Warn about function-scoped fixtures, excluding autouse fixtures because # the advice is probably not actionable and the status quo seems OK... # See https://github.com/HypothesisWorks/hypothesis/issues/377 for detail. msg = ( "%s uses the %r fixture, which is reset between function calls but not " "between test cases generated by `@given(...)`. You can change it to " "a module- or session-scoped fixture if it is safe to reuse; if not " "we recommend using a context manager inside your test function. See " "https://docs.pytest.org/en/latest/fixture.html#sharing-test-data " "for details on fixture scope.") argnames = None for fx_defs in item._request._fixturemanager.getfixtureinfo( node=item, func=item.function, cls=None).name2fixturedefs.values(): if argnames is None: argnames = frozenset(signature(item.function).parameters) for fx in fx_defs: if fx.argname in argnames: active_fx = item._request._get_active_fixturedef( fx.argname) if active_fx.scope == "function": note_deprecation(msg % (item.nodeid, fx.argname), since="2020-02-29") if item.get_closest_marker("parametrize") is not None: # Give every parametrized test invocation a unique database key key = item.nodeid.encode("utf-8") item.obj.hypothesis.inner_test._hypothesis_internal_add_digest = key store = StoringReporter(item.config) def note_statistics(stats): stats["nodeid"] = item.nodeid item.hypothesis_statistics = describe_statistics(stats) with collector.with_value(note_statistics): with with_reporter(store): yield if store.results: item.hypothesis_report_information = list(store.results)
def pytest_runtest_call(item): if not (hasattr(item, "obj") and "hypothesis" in sys.modules): yield return from hypothesis import core from hypothesis.internal.detection import is_hypothesis_test core.running_under_pytest = True if not is_hypothesis_test(item.obj): # If @given was not applied, check whether other hypothesis # decorators were applied, and raise an error if they were. if getattr(item.obj, "is_hypothesis_strategy_function", False): from hypothesis.errors import InvalidArgument raise InvalidArgument( f"{item.nodeid} is a function that returns a Hypothesis strategy, " "but pytest has collected it as a test function. This is useless " "as the function body will never be executed. To define a test " "function, use @given instead of @composite." ) message = "Using `@%s` on a test without `@given` is completely pointless." for name, attribute in [ ("example", "hypothesis_explicit_examples"), ("seed", "_hypothesis_internal_use_seed"), ("settings", "_hypothesis_internal_settings_applied"), ("reproduce_example", "_hypothesis_internal_use_reproduce_failure"), ]: if hasattr(item.obj, attribute): from hypothesis.errors import InvalidArgument raise InvalidArgument(message % (name,)) yield else: from hypothesis import HealthCheck, settings from hypothesis.internal.escalation import current_pytest_item from hypothesis.internal.healthcheck import fail_health_check from hypothesis.reporting import with_reporter from hypothesis.statistics import collector, describe_statistics # Retrieve the settings for this test from the test object, which # is normally a Hypothesis wrapped_test wrapper. If this doesn't # work, the test object is probably something weird # (e.g a stateful test wrapper), so we skip the function-scoped # fixture check. settings = getattr(item.obj, "_hypothesis_internal_use_settings", None) # Check for suspicious use of function-scoped fixtures, but only # if the corresponding health check is not suppressed. if ( settings is not None and HealthCheck.function_scoped_fixture not in settings.suppress_health_check ): # Warn about function-scoped fixtures, excluding autouse fixtures because # the advice is probably not actionable and the status quo seems OK... # See https://github.com/HypothesisWorks/hypothesis/issues/377 for detail. argnames = None for fx_defs in item._request._fixturemanager.getfixtureinfo( node=item, func=item.function, cls=None ).name2fixturedefs.values(): if argnames is None: argnames = frozenset(signature(item.function).parameters) for fx in fx_defs: if fx.argname in argnames: active_fx = item._request._get_active_fixturedef(fx.argname) if active_fx.scope == "function": fail_health_check( settings, _FIXTURE_MSG.format(fx.argname, item.nodeid), HealthCheck.function_scoped_fixture, ) if item.get_closest_marker("parametrize") is not None: # Give every parametrized test invocation a unique database key key = item.nodeid.encode() item.obj.hypothesis.inner_test._hypothesis_internal_add_digest = key store = StoringReporter(item.config) def note_statistics(stats): stats["nodeid"] = item.nodeid item.hypothesis_statistics = describe_statistics(stats) with collector.with_value(note_statistics): with with_reporter(store): with current_pytest_item.with_value(item): yield if store.results: item.hypothesis_report_information = list(store.results)
def pytest_runtest_call(item): if not hasattr(item, "obj"): yield elif not is_hypothesis_test(item.obj): # If @given was not applied, check whether other hypothesis # decorators were applied, and raise an error if they were. if getattr(item.obj, "is_hypothesis_strategy_function", False): raise InvalidArgument( "%s is a function that returns a Hypothesis strategy, but pytest " "has collected it as a test function. This is useless as the " "function body will never be executed. To define a test " "function, use @given instead of @composite." % (item.nodeid, )) message = "Using `@%s` on a test without `@given` is completely pointless." for name, attribute in [ ("example", "hypothesis_explicit_examples"), ("seed", "_hypothesis_internal_use_seed"), ("settings", "_hypothesis_internal_settings_applied"), ("reproduce_example", "_hypothesis_internal_use_reproduce_failure"), ]: if hasattr(item.obj, attribute): raise InvalidArgument(message % (name, )) yield else: # Warn about function-scoped fixtures, excluding autouse fixtures because # the advice is probably not actionable and the status quo seems OK... # See https://github.com/HypothesisWorks/hypothesis/issues/377 for detail. argnames = None for fx_defs in item._request._fixturemanager.getfixtureinfo( node=item, func=item.function, cls=None).name2fixturedefs.values(): if argnames is None: argnames = frozenset(signature(item.function).parameters) for fx in fx_defs: if fx.scope == "function" and fx.argname in argnames: note_deprecation( "%s uses the %r fixture, but function-scoped fixtures " "should not be used with @given(...) tests, because " "fixtures are not reset between generated examples!" % (item.nodeid, fx.argname), since="2020-02-29", ) if item.get_closest_marker("parametrize") is not None: # Give every parametrized test invocation a unique database key key = item.nodeid.encode("utf-8") item.obj.hypothesis.inner_test._hypothesis_internal_add_digest = key store = StoringReporter(item.config) def note_statistics(stats): lines = [item.nodeid + ":", "" ] + stats.get_description() + [""] item.hypothesis_statistics = lines with collector.with_value(note_statistics): with with_reporter(store): yield if store.results: item.hypothesis_report_information = list(store.results)
def pytest_runtest_call(item): if not hasattr(item, "obj"): yield elif not is_hypothesis_test(item.obj): # If @given was not applied, check whether other hypothesis # decorators were applied, and raise an error if they were. if getattr(item.obj, "is_hypothesis_strategy_function", False): raise InvalidArgument( f"{item.nodeid} is a function that returns a Hypothesis strategy, " "but pytest has collected it as a test function. This is useless " "as the function body will never be executed. To define a test " "function, use @given instead of @composite.") message = "Using `@%s` on a test without `@given` is completely pointless." for name, attribute in [ ("example", "hypothesis_explicit_examples"), ("seed", "_hypothesis_internal_use_seed"), ("settings", "_hypothesis_internal_settings_applied"), ("reproduce_example", "_hypothesis_internal_use_reproduce_failure"), ]: if hasattr(item.obj, attribute): raise InvalidArgument(message % (name, )) yield else: # Retrieve the settings for this test from the test object, which # is normally a Hypothesis wrapped_test wrapper. If this doesn't # work, the test object is probably something weird # (e.g a stateful test wrapper), so we skip the function-scoped # fixture check. settings = getattr(item.obj, "_hypothesis_internal_use_settings", None) # Check for suspicious use of function-scoped fixtures, but only # if the corresponding health check is not suppressed. if (settings is not None and HealthCheck.function_scoped_fixture not in settings.suppress_health_check): # Warn about function-scoped fixtures, excluding autouse fixtures because # the advice is probably not actionable and the status quo seems OK... # See https://github.com/HypothesisWorks/hypothesis/issues/377 for detail. msg = ( "%s uses the %r fixture, which is reset between function calls but not " "between test cases generated by `@given(...)`. You can change it to " "a module- or session-scoped fixture if it is safe to reuse; if not " "we recommend using a context manager inside your test function. See " "https://docs.pytest.org/en/latest/how-to/fixtures.html" "#scope-sharing-fixtures-across-classes-modules-packages-or-session " "for details on fixture scope.") argnames = None for fx_defs in item._request._fixturemanager.getfixtureinfo( node=item, func=item.function, cls=None).name2fixturedefs.values(): if argnames is None: argnames = frozenset( signature(item.function).parameters) for fx in fx_defs: if fx.argname in argnames: active_fx = item._request._get_active_fixturedef( fx.argname) if active_fx.scope == "function": fail_health_check( settings, msg % (item.nodeid, fx.argname), HealthCheck.function_scoped_fixture, ) if item.get_closest_marker("parametrize") is not None: # Give every parametrized test invocation a unique database key key = item.nodeid.encode() item.obj.hypothesis.inner_test._hypothesis_internal_add_digest = key store = StoringReporter(item.config) def note_statistics(stats): stats["nodeid"] = item.nodeid item.hypothesis_statistics = base64.b64encode( describe_statistics(stats).encode()).decode() with collector.with_value(note_statistics): with with_reporter(store): yield if store.results: item.hypothesis_report_information = list(store.results)