From e2d88558c7638ae9f6a6bd716be8be0637fad86b Mon Sep 17 00:00:00 2001 From: Sergey Pokhodenko Date: Thu, 28 Nov 2019 15:04:09 +0300 Subject: [PATCH 1/3] Add CSV support for TestResults --- sdc/tests/tests_perf/test_perf_utils.py | 71 +++++++++++++++++-------- 1 file changed, 49 insertions(+), 22 deletions(-) diff --git a/sdc/tests/tests_perf/test_perf_utils.py b/sdc/tests/tests_perf/test_perf_utils.py index 41a01e2a4..945d68ba7 100644 --- a/sdc/tests/tests_perf/test_perf_utils.py +++ b/sdc/tests/tests_perf/test_perf_utils.py @@ -198,10 +198,18 @@ def get_times(f, *args, iter_number=5): class TestResults: perf_results_xlsx = 'perf_results.xlsx' raw_perf_results_xlsx = 'raw_perf_results.xlsx' + + perf_results_csv = 'perf_results.csv' + raw_perf_results_csv = 'raw_perf_results.csv' + index = ['name', 'N', 'type', 'size'] test_results_data = pandas.DataFrame(index=index) logger = setup_logging() + def __init__(self, use_excel=True, use_csv=False): + self.use_excel = use_excel + self.use_csv = use_csv + @property def grouped_data(self): """ @@ -274,33 +282,52 @@ def dump(self): """ # openpyxl need to be installed - try: - with pandas.ExcelWriter(self.perf_results_xlsx) as writer: - self.grouped_data.to_excel(writer) - except ModuleNotFoundError as e: - msg = 'Could not dump the results to "%s": %s' - self.logger.warning(msg, self.perf_results_xlsx, e) - - try: - with pandas.ExcelWriter(self.raw_perf_results_xlsx) as writer: - self.test_results_data.to_excel(writer, index=False) - except ModuleNotFoundError as e: - msg = 'Could not dump raw results to "%s": %s' - self.logger.warning(msg, self.raw_perf_results_xlsx, e) + if self.use_excel: + try: + with pandas.ExcelWriter(self.perf_results_xlsx) as writer: + self.grouped_data.to_excel(writer) + except ModuleNotFoundError as e: + msg = 'Could not dump the results to "%s": %s' + self.logger.warning(msg, self.perf_results_xlsx, e) + + try: + with pandas.ExcelWriter(self.raw_perf_results_xlsx) as writer: + self.test_results_data.to_excel(writer, index=False) + except ModuleNotFoundError as e: + msg = 'Could not dump raw results to "%s": %s' + self.logger.warning(msg, self.raw_perf_results_xlsx, e) + + if self.use_csv: + self.grouped_data.to_csv(self.perf_results_csv) + self.test_results_data.to_csv(self.raw_perf_results_csv) def load(self): """ Load existing performance testing results from excel to global data storage """ - raw_perf_results_xlsx = Path(self.raw_perf_results_xlsx) - if raw_perf_results_xlsx.exists(): - with raw_perf_results_xlsx.open('rb') as fd: - # xlrd need to be installed - try: - self.test_results_data = pandas.read_excel(fd) - except ModuleNotFoundError as e: - msg = 'Could not load previous results from %s: %s' - self.logger.warning(msg, raw_perf_results_xlsx, e) + if self.use_excel: + raw_perf_results_xlsx = Path(self.raw_perf_results_xlsx) + if raw_perf_results_xlsx.exists(): + with raw_perf_results_xlsx.open('rb') as fd: + # xlrd need to be installed + try: + self.test_results_data = pandas.read_excel(fd) + except ModuleNotFoundError as e: + msg = 'Could not load previous results from %s: %s' + self.logger.warning(msg, raw_perf_results_xlsx, e) + + # Excel loader is default + elif self.use_csv: + raw_perf_results_csv = Path(self.raw_perf_results_csv) + if raw_perf_results_csv.exists(): + with raw_perf_results_csv.open('rb') as fd: + # xlrd need to be installed + try: + self.test_results_data = pandas.read_csv(fd) + except ModuleNotFoundError as e: + msg = 'Could not load previous results from %s: %s' + self.logger.warning(msg, raw_perf_results_csv, e) + class TestResultsStr(TestResults): From b3e2dfd20dd89cd8b90d4b12d63abd581386ce5f Mon Sep 17 00:00:00 2001 From: Sergey Pokhodenko Date: Fri, 29 Nov 2019 14:57:14 +0300 Subject: [PATCH 2/3] Add drivers for Excel and CSV files --- sdc/tests/tests_perf/test_perf_utils.py | 122 ++++++++++++++---------- 1 file changed, 71 insertions(+), 51 deletions(-) diff --git a/sdc/tests/tests_perf/test_perf_utils.py b/sdc/tests/tests_perf/test_perf_utils.py index 945d68ba7..38411e8e0 100644 --- a/sdc/tests/tests_perf/test_perf_utils.py +++ b/sdc/tests/tests_perf/test_perf_utils.py @@ -195,20 +195,77 @@ def get_times(f, *args, iter_number=5): return exec_times, boxing_times -class TestResults: - perf_results_xlsx = 'perf_results.xlsx' - raw_perf_results_xlsx = 'raw_perf_results.xlsx' +class ResultsDriver: + """Base class. Load and dump results.""" + + def __init__(self, file_name, raw_file_name=None, logger=None): + self.file_name = file_name + self.raw_file_name = raw_file_name if raw_file_name else f'raw_{file_name}' + self.logger = logger + + +class ExcelResultsDriver(ResultsDriver): + # openpyxl need to be installed + + def dump_grouped_data(self, grouped_data): + try: + with pandas.ExcelWriter(self.file_name) as writer: + grouped_data.to_excel(writer) + except ModuleNotFoundError as e: + if self.logger: + msg = 'Could not dump the results to "%s": %s' + self.logger.warning(msg, self.file_name, e) + + def dump_test_results_data(self, test_results_data): + try: + with pandas.ExcelWriter(self.raw_file_name) as writer: + test_results_data.to_excel(writer, index=False) + except ModuleNotFoundError as e: + if self.logger: + msg = 'Could not dump raw results to "%s": %s' + self.logger.warning(msg, self.raw_file_name, e) + + def load(self): + raw_perf_results_xlsx = Path(self.raw_file_name) + if raw_perf_results_xlsx.exists(): + with raw_perf_results_xlsx.open('rb') as fd: + # xlrd need to be installed + try: + return pandas.read_excel(fd) + except ModuleNotFoundError as e: + msg = 'Could not load previous results from %s: %s' + self.logger.warning(msg, self.raw_file_name, e) + +class CSVResultsDriver(ResultsDriver): + + def dump_grouped_data(self, grouped_data): + grouped_data.to_csv(self.file_name) - perf_results_csv = 'perf_results.csv' - raw_perf_results_csv = 'raw_perf_results.csv' + def dump_test_results_data(self, test_results_data): + test_results_data.to_csv(self.raw_file_name) + def load(self): + raw_perf_results_csv = Path(self.raw_file_name) + if raw_perf_results_csv.exists(): + with raw_perf_results_csv.open('rb') as fd: + # xlrd need to be installed + try: + return pandas.read_csv(fd) + except ModuleNotFoundError as e: + msg = 'Could not load previous results from %s: %s' + self.logger.warning(msg, self.raw_file_name, e) + + +class TestResults: index = ['name', 'N', 'type', 'size'] test_results_data = pandas.DataFrame(index=index) logger = setup_logging() - def __init__(self, use_excel=True, use_csv=False): - self.use_excel = use_excel - self.use_csv = use_csv + def __init__(self, drivers=None): + if drivers is None: + drivers = [ExcelResultsDriver('perf_results.xlsx', logger=self.logger)] + self.drivers = drivers + self.default_driver = drivers[0] @property def grouped_data(self): @@ -280,54 +337,17 @@ def dump(self): """ Dump performance testing results from global data storage to excel """ - # openpyxl need to be installed - - if self.use_excel: - try: - with pandas.ExcelWriter(self.perf_results_xlsx) as writer: - self.grouped_data.to_excel(writer) - except ModuleNotFoundError as e: - msg = 'Could not dump the results to "%s": %s' - self.logger.warning(msg, self.perf_results_xlsx, e) - - try: - with pandas.ExcelWriter(self.raw_perf_results_xlsx) as writer: - self.test_results_data.to_excel(writer, index=False) - except ModuleNotFoundError as e: - msg = 'Could not dump raw results to "%s": %s' - self.logger.warning(msg, self.raw_perf_results_xlsx, e) - - if self.use_csv: - self.grouped_data.to_csv(self.perf_results_csv) - self.test_results_data.to_csv(self.raw_perf_results_csv) + for d in self.drivers: + d.dump_grouped_data(self.grouped_data) + d.dump_test_results_data(self.test_results_data) def load(self): """ Load existing performance testing results from excel to global data storage """ - if self.use_excel: - raw_perf_results_xlsx = Path(self.raw_perf_results_xlsx) - if raw_perf_results_xlsx.exists(): - with raw_perf_results_xlsx.open('rb') as fd: - # xlrd need to be installed - try: - self.test_results_data = pandas.read_excel(fd) - except ModuleNotFoundError as e: - msg = 'Could not load previous results from %s: %s' - self.logger.warning(msg, raw_perf_results_xlsx, e) - - # Excel loader is default - elif self.use_csv: - raw_perf_results_csv = Path(self.raw_perf_results_csv) - if raw_perf_results_csv.exists(): - with raw_perf_results_csv.open('rb') as fd: - # xlrd need to be installed - try: - self.test_results_data = pandas.read_csv(fd) - except ModuleNotFoundError as e: - msg = 'Could not load previous results from %s: %s' - self.logger.warning(msg, raw_perf_results_csv, e) - + test_results_data = self.default_driver.load() + if test_results_data is not None: + self.test_results_data = test_results_data class TestResultsStr(TestResults): From 2115aa6d7ec799d90a9d094147fd693fab0ca2dd Mon Sep 17 00:00:00 2001 From: Sergey Pokhodenko Date: Fri, 29 Nov 2019 15:35:55 +0300 Subject: [PATCH 3/3] Use env vars and pass logger in methods. --- sdc/tests/tests_perf/test_perf_base.py | 9 ++++- sdc/tests/tests_perf/test_perf_utils.py | 49 +++++++++++++------------ 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/sdc/tests/tests_perf/test_perf_base.py b/sdc/tests/tests_perf/test_perf_base.py index 5b9e4fa58..3ea5fc3aa 100644 --- a/sdc/tests/tests_perf/test_perf_base.py +++ b/sdc/tests/tests_perf/test_perf_base.py @@ -9,7 +9,14 @@ class TestBase(unittest.TestCase): @classmethod def setUpClass(cls): - cls.test_results = TestResults() + drivers = [] + if is_true(os.environ.get('SDC_TEST_PERF_EXCEL', True)): + drivers.append(ExcelResultsDriver('perf_results.xlsx')) + if is_true(os.environ.get('SDC_TEST_PERF_CSV', False)): + drivers.append(CSVResultsDriver('perf_results.csv')) + + cls.test_results = TestResults(drivers) + if is_true(os.environ.get('LOAD_PREV_RESULTS')): cls.test_results.load() diff --git a/sdc/tests/tests_perf/test_perf_utils.py b/sdc/tests/tests_perf/test_perf_utils.py index 38411e8e0..c72867602 100644 --- a/sdc/tests/tests_perf/test_perf_utils.py +++ b/sdc/tests/tests_perf/test_perf_utils.py @@ -198,34 +198,33 @@ def get_times(f, *args, iter_number=5): class ResultsDriver: """Base class. Load and dump results.""" - def __init__(self, file_name, raw_file_name=None, logger=None): + def __init__(self, file_name, raw_file_name=None): self.file_name = file_name self.raw_file_name = raw_file_name if raw_file_name else f'raw_{file_name}' - self.logger = logger class ExcelResultsDriver(ResultsDriver): # openpyxl need to be installed - def dump_grouped_data(self, grouped_data): + def dump_grouped_data(self, grouped_data, logger=None): try: with pandas.ExcelWriter(self.file_name) as writer: grouped_data.to_excel(writer) except ModuleNotFoundError as e: - if self.logger: + if logger: msg = 'Could not dump the results to "%s": %s' - self.logger.warning(msg, self.file_name, e) + logger.warning(msg, self.file_name, e) - def dump_test_results_data(self, test_results_data): + def dump_test_results_data(self, test_results_data, logger=None): try: with pandas.ExcelWriter(self.raw_file_name) as writer: test_results_data.to_excel(writer, index=False) except ModuleNotFoundError as e: - if self.logger: + if logger: msg = 'Could not dump raw results to "%s": %s' - self.logger.warning(msg, self.raw_file_name, e) + logger.warning(msg, self.raw_file_name, e) - def load(self): + def load(self, logger=None): raw_perf_results_xlsx = Path(self.raw_file_name) if raw_perf_results_xlsx.exists(): with raw_perf_results_xlsx.open('rb') as fd: @@ -233,18 +232,20 @@ def load(self): try: return pandas.read_excel(fd) except ModuleNotFoundError as e: - msg = 'Could not load previous results from %s: %s' - self.logger.warning(msg, self.raw_file_name, e) + if logger: + msg = 'Could not load previous results from %s: %s' + logger.warning(msg, self.raw_file_name, e) + class CSVResultsDriver(ResultsDriver): - def dump_grouped_data(self, grouped_data): + def dump_grouped_data(self, grouped_data, logger=None): grouped_data.to_csv(self.file_name) - def dump_test_results_data(self, test_results_data): + def dump_test_results_data(self, test_results_data, logger=None): test_results_data.to_csv(self.raw_file_name) - def load(self): + def load(self, logger=None): raw_perf_results_csv = Path(self.raw_file_name) if raw_perf_results_csv.exists(): with raw_perf_results_csv.open('rb') as fd: @@ -252,8 +253,9 @@ def load(self): try: return pandas.read_csv(fd) except ModuleNotFoundError as e: - msg = 'Could not load previous results from %s: %s' - self.logger.warning(msg, self.raw_file_name, e) + if logger: + msg = 'Could not load previous results from %s: %s' + logger.warning(msg, self.raw_file_name, e) class TestResults: @@ -262,10 +264,8 @@ class TestResults: logger = setup_logging() def __init__(self, drivers=None): - if drivers is None: - drivers = [ExcelResultsDriver('perf_results.xlsx', logger=self.logger)] self.drivers = drivers - self.default_driver = drivers[0] + self.default_driver = drivers[0] if drivers else None @property def grouped_data(self): @@ -338,16 +338,17 @@ def dump(self): Dump performance testing results from global data storage to excel """ for d in self.drivers: - d.dump_grouped_data(self.grouped_data) - d.dump_test_results_data(self.test_results_data) + d.dump_grouped_data(self.grouped_data, self.logger) + d.dump_test_results_data(self.test_results_data, self.logger) def load(self): """ Load existing performance testing results from excel to global data storage """ - test_results_data = self.default_driver.load() - if test_results_data is not None: - self.test_results_data = test_results_data + if self.default_driver: + test_results_data = self.default_driver.load(self.logger) + if test_results_data is not None: + self.test_results_data = test_results_data class TestResultsStr(TestResults):