diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 96a1057..01bc3ab 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -16,7 +16,7 @@ jobs: - uses: actions/checkout@v2 - name: Run Tests run: | - pip install pytest pytest-cov coveralls Pillow + pip install pytest pytest-cov coveralls Pillow pytest-rerunfailures py.test --cov ./pytest_html_reporter/ tests/unit/ coveralls --service=github bash <(curl -s https://codecov.io/bash) \ No newline at end of file diff --git a/README.rst b/README.rst index 95a427d..16b9515 100644 --- a/README.rst +++ b/README.rst @@ -72,6 +72,11 @@ Add ``--title`` tag followed by the report title:: $ pytest tests/ --html-report=./report --title='PYTEST REPORT' +Add ``--archive-count`` tag followed by an integer to limit showing the number of builds in the ``Archives`` section:: + + $ pytest tests/ --archive-count 7 + $ pytest tests/ --html-report=./report --archive-count 7 + .. pytest.ini diff --git a/pytest_html_reporter/html_reporter.py b/pytest_html_reporter/html_reporter.py index 7f9c0ea..cc519e4 100644 --- a/pytest_html_reporter/html_reporter.py +++ b/pytest_html_reporter/html_reporter.py @@ -2,6 +2,7 @@ import json import os import time +import shutil from datetime import date, datetime from os.path import isfile, join @@ -18,10 +19,12 @@ from pytest_html_reporter.time_converter import time_converter from pytest_html_reporter.const_vars import ConfigVars + class HTMLReporter(object): - def __init__(self, path, config): + def __init__(self, path, archive_count, config): self.json_data = {'content': {'suites': {0: {'status': {}, 'tests': {0: {}}, }, }}} self.path = path + self.archive_count = archive_count self.config = config has_rerun = config.pluginmanager.hasplugin("rerunfailures") self.rerun = 0 if has_rerun else None @@ -37,7 +40,6 @@ def pytest_runtest_teardown(self, item, nextitem): self.append_test_metrics_row() def previous_test_name(self, _test_name): - if ConfigVars._previous_test_name == _test_name: self.rerun += 1 else: @@ -49,11 +51,9 @@ def pytest_runtest_setup(item): ConfigVars._start_execution_time = time.time() def pytest_sessionfinish(self, session): - if ConfigVars._suite_name is not None: self.append_suite_metrics_row(ConfigVars._suite_name) def archive_data(self, base, filename): - path = os.path.join(base, filename) if os.path.isfile(path) is True: @@ -78,6 +78,22 @@ def report_path(self): HTMLReporter.base_path = os.path.abspath(logfile) return os.path.abspath(logfile), 'pytest_html_report.html' + def remove_old_archives(self): + archive_dir = os.path.abspath(os.path.expanduser(os.path.expandvars(self.path))) + '/archive' + + if self.archive_count != '': + if int(self.archive_count) == 0: + if os.path.isdir(archive_dir): + shutil.rmtree(archive_dir) + return + + archive_count = int(self.archive_count) - 1 + if os.path.isdir(archive_dir): + archives = os.listdir(archive_dir) + archives.sort(key=lambda f: os.path.getmtime(os.path.join(archive_dir, f))) + for i in range(0, len(archives) - archive_count): + os.remove(os.path.join(archive_dir, archives[i])) + @pytest.hookimpl(hookwrapper=True) def pytest_terminal_summary(self, terminalreporter, exitstatus, config): @@ -104,7 +120,8 @@ def pytest_terminal_summary(self, terminalreporter, exitstatus, config): self.update_trends(base) # generate archive template - self.update_archives_template(base) + self.remove_old_archives() + self.update_archives_template(base) if self.archive_count != '0' else None # generate suite highlights generate_suite_highlights() @@ -537,7 +554,6 @@ def generate_json_data(self, base): json.dump(self.json_data, outfile) def update_archives_template(self, base): - f = glob.glob(base + '/archive/*.json') cf = glob.glob(base + '/output.json') if len(f) > 0: @@ -551,7 +567,6 @@ def update_archives_template(self, base): self.load_archive(cf, value='current') def load_archive(self, f, value): - def state(data): if data == 'fail': return 'times', '#fc6766' diff --git a/pytest_html_reporter/plugin.py b/pytest_html_reporter/plugin.py index bc64d61..a4d25ed 100644 --- a/pytest_html_reporter/plugin.py +++ b/pytest_html_reporter/plugin.py @@ -21,6 +21,14 @@ def pytest_addoption(parser): help="customize report title", ) + group.addoption( + "--archive-count", + action="store", + dest="archive_count", + default="", + help="set maximum build count to display in the archives section", + ) + def pytest_configure(config): path = config.getoption("path") @@ -28,8 +36,10 @@ def pytest_configure(config): title = config.getoption("title") custom_title(title) + + archive_count = config.getoption("archive_count") - config._html = HTMLReporter(path, config) + config._html = HTMLReporter(path, archive_count, config) config.pluginmanager.register(config._html) diff --git a/pytest_html_reporter/util.py b/pytest_html_reporter/util.py index 2b68d43..11e0cce 100644 --- a/pytest_html_reporter/util.py +++ b/pytest_html_reporter/util.py @@ -7,8 +7,8 @@ from pytest_html_reporter.const_vars import ConfigVars -def suite_highlights(data): +def suite_highlights(data): for i in data['content']['suites']: if data['content']['suites'][i]['status']['total_fail'] == 0: l = data['content']['suites'][i]['suite_name'] @@ -26,7 +26,6 @@ def suite_highlights(data): def generate_suite_highlights(): - if ConfigVars.highlights == {}: ConfigVars.max_failure_suite_name_final = 'No failures in History' ConfigVars.max_failure_suite_count = 0 @@ -78,4 +77,4 @@ def clean_screenshots(path): def custom_title(title): - ConfigVars._title = title[:26] + '...' if title.__len__() > 29 else title \ No newline at end of file + ConfigVars._title = title[:26] + '...' if title.__len__() > 29 else title diff --git a/requirements.txt b/requirements.txt index 79a677e..ef33a5f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,4 +3,5 @@ pytest-cov coveralls selenium twine -pytest-xdist \ No newline at end of file +pytest-xdist +pytest-rerunfailures \ No newline at end of file diff --git a/setup.py b/setup.py index 4bf3d5b..17f6151 100644 --- a/setup.py +++ b/setup.py @@ -13,7 +13,7 @@ def read(fname): setup( name="pytest-html-reporter", - version="0.3", + version="0.3.0", author="Prashanth Sams", author_email="sams.prashanth@gmail.com", maintainer="Prashanth Sams", diff --git a/tests/unit/test_100.py b/tests/unit/test_100.py deleted file mode 100644 index 1385f8a..0000000 --- a/tests/unit/test_100.py +++ /dev/null @@ -1,600 +0,0 @@ -import sys -import os - -myPath = os.path.dirname(os.path.abspath(__file__)) -sys.path.insert(0, myPath + '/../../') -from pytest_html_reporter.time_converter import * -import datetime - - -def test_time_converter_1(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_2(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_3(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_4(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_5(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_6(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_7(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_8(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_9(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_10(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_11(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_12(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_13(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_14(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_15(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_16(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_17(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_18(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_19(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_20(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_21(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_22(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_23(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_24(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_25(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_26(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_27(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_28(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_29(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_30(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_31(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_32(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_33(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_34(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_35(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_36(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_37(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_38(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_39(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_40(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_41(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_42(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_43(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_44(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_45(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_46(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_47(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_48(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_49(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_50(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_51(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_52(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_53(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_54(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_55(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_56(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_57(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_58(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_59(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_60(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_61(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") -def test_time_converter_62(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") -def test_time_converter_63(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") -def test_time_converter_64(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") -def test_time_converter_65(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") -def test_time_converter_66(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") -def test_time_converter_67(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") -def test_time_converter_68(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") -def test_time_converter_69(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_70(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_71(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_72(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_73(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_74(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_75(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_76(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_77(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_78(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_79(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_80(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_81(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_82(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_83(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_84(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_85(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_86(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_87(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_88(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_89(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_90(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_91(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_92(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_93(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_94(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_95(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_96(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_97(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_98(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_99(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") - -def test_time_converter_100(): - if time_converter("18:31") == '6:31 pm': - pass - else: - raise Exception("invalid method: time_converter") diff --git a/tests/unit/test_plugin.py b/tests/unit/test_plugin.py index 3452230..347e415 100644 --- a/tests/unit/test_plugin.py +++ b/tests/unit/test_plugin.py @@ -3,7 +3,6 @@ myPath = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, myPath + '/../../') -from pytest_html_reporter.util import max_rerun from pytest_html_reporter.html_reporter import HTMLReporter @@ -15,7 +14,3 @@ def test_report_path(): HTMLReporter.path = "./report/test.html" assert len(HTMLReporter.report_path.__get__(HTMLReporter)[0]) >= 5 assert HTMLReporter.report_path.__get__(HTMLReporter)[1] == "test.html" - - -def test_max_rerun(): - assert max_rerun() is None diff --git a/tests/unit/test_util.py b/tests/unit/test_util.py new file mode 100644 index 0000000..418011d --- /dev/null +++ b/tests/unit/test_util.py @@ -0,0 +1,5 @@ +from pytest_html_reporter.util import max_rerun + + +def test_max_rerun_none(): + assert max_rerun() is None