def pytest_terminal_summary(self, terminalreporter): """ Add a section to terminal summary reporting. * When the `--disable-warnings` flag is active, removes all raised warnings prior to outputting the final console report. * When `--coverage` is active, outputs the result to stdout and saves the final report json. Arguments --------- terminalreporter : `_pytest.terminal.TerminalReporter` The internal terminal reporter object """ if self.config.getoption( "--disable-warnings") and "warnings" in terminalreporter.stats: del terminalreporter.stats["warnings"] if CONFIG.argv["coverage"]: terminalreporter.section("Coverage") # output coverage report to console coverage_eval = coverage.get_merged_coverage_eval() for line in output._build_coverage_output(coverage_eval): terminalreporter.write_line(line) # save coverage report as `reports/coverage.json` output._save_coverage_report( self.project._build, coverage_eval, self.project_path.joinpath(self.project._structure["reports"]), )
def pytest_sessionfinish(self, session): """ Called after whole test run finished, right before returning the exit status to the system. * Aggregates results from `build/tests-{workerid}.json` files and stores them as `build/test.json`. * Generates coverage report and outputs results to console * Closes all active projects """ if session.testscollected == 0: raise pytest.UsageError( "xdist workers failed to collect tests. Ensure all test cases are " "isolated with the module_isolation or fn_isolation fixtures.\n\n" "https://eth-brownie.readthedocs.io/en/stable/tests.html#isolating-tests" ) build_path = self.project._build_path report = {"tests": {}, "contracts": self.contracts, "tx": {}} for path in list(build_path.glob("tests-*.json")): with path.open() as fp: data = json.load(fp) assert data["contracts"] == report["contracts"] report["tests"].update(data["tests"]) report["tx"].update(data["tx"]) path.unlink() with build_path.joinpath("tests.json").open("w") as fp: json.dump(report, fp, indent=2, sort_keys=True, default=sorted) coverage_eval = coverage.get_merged_coverage_eval(report["tx"]) self._sessionfinish_coverage(coverage_eval) for project in get_loaded_projects(): project.close(raises=False)
def test_exclude_coverage(coverage_mode, tester, config): tester.useSafeMath(5, 10) coverage_eval = coverage.get_merged_coverage_eval() report = _build_coverage_output(coverage_eval) assert _build_coverage_output(coverage_eval) == report config.settings["reports"]["exclude_contracts"] = "SafeMath" assert _build_coverage_output(coverage_eval) != report
def _sessionfinish(self, path): txhash = set(x for v in self.tests.values() for x in v["txhash"]) coverage_eval = dict((k, v) for k, v in coverage.get_coverage_eval().items() if k in txhash) report = {"tests": self.tests, "contracts": self.contracts, "tx": coverage_eval} with self.project_path.joinpath(path).open("w") as fp: json.dump(report, fp, indent=2, sort_keys=True, default=sorted) coverage_eval = coverage.get_merged_coverage_eval() self._sessionfinish_coverage(coverage_eval) self.project.close()
def test_exclude_coverage_by_glob(coverage_mode, tester, vypertester, config): tester.useSafeMath(5, 10) vypertester.overflow(1, 2) coverage_eval = coverage.get_merged_coverage_eval() report = _build_coverage_output(coverage_eval) assert _build_coverage_output(coverage_eval) == report config.settings["reports"]["exclude_paths"] = "contracts/*.vy" assert _build_coverage_output(coverage_eval) != report
def pytest_sessionfinish(self, session): if session.testscollected == 0: raise pytest.UsageError( "xdist workers failed to collect tests. Ensure all test cases are " "isolated with the module_isolation or fn_isolation fixtures.\n\n" "https://eth-brownie.readthedocs.io/en/stable/tests.html#isolating-tests" ) report = {"tests": {}, "contracts": self.contracts, "tx": {}} for path in list(self.project_path.glob("build/tests-*.json")): with path.open() as fp: data = json.load(fp) assert data["contracts"] == report["contracts"] report["tests"].update(data["tests"]) report["tx"].update(data["tx"]) path.unlink() with self.project_path.joinpath("build/tests.json").open("w") as fp: json.dump(report, fp, indent=2, sort_keys=True, default=sorted) coverage_eval = coverage.get_merged_coverage_eval(report["tx"]) self._sessionfinish_coverage(coverage_eval) self.project.close()