def run_electronics_test(serialno, devicetype, projectfolder, incremental=True, stale=5, offline=False): if offline is True: incremental = False suites = [] for suite in get_electronics_test_suites(serialno, devicetype, projectfolder, offline=False): if incremental is True: latest = controller.get_latest_test_suite( serialno=serialno, suite_class=repr(suite.__class__), descr=suite.desc ) if latest and latest.passed and (arrow.utcnow() - latest.created_at).days < stale: suite_needs_be_run = False suite.destroy() else: suite_needs_be_run = True else: suite_needs_be_run = True if suite_needs_be_run is True: suite.run_test() suite.ts = arrow.utcnow() if not offline: commit_test_results(suite) suite.finish() suites.append(suite) # TODO Provide some option to dump raw test data, unrelated to online status # if offline is True: # from tendril.dox import testing # testing.gen_local_test_results(serialno, devicetype, suites) return suites
def run_electronics_test(serialno, devicetype, projectfolder, incremental=True, stale=5, offline=False): if offline is True: incremental = False suites = [] for suite in get_electronics_test_suites(serialno, devicetype, projectfolder, offline=False): if incremental is True: latest = controller.get_latest_test_suite(serialno=serialno, suite_class=repr( suite.__class__), descr=suite.desc) if latest and latest.passed and \ (arrow.utcnow() - latest.created_at).days < stale: suite_needs_be_run = False suite.destroy() else: suite_needs_be_run = True else: suite_needs_be_run = True if suite_needs_be_run is True: suite.run_test() suite.ts = arrow.utcnow() if not offline: commit_test_results(suite) suite.finish() suites.append(suite) # TODO Provide some option to dump raw test data, unrelated to online status # if offline is True: # from tendril.dox import testing # testing.gen_local_test_results(serialno, devicetype, suites) return suites
def get_test_suite_objects(serialno=None, order_by='FILE_ORDER', session=None): # This reconstructs the test objects from the database. Using SQLAlchemy # as the ORM that it is, and letting it handle the object creation would # be infinitely better. It isn't done here since the models are separate # from the actual test objects, which in turn have other dependencies. # Integrating the models with the classes should be considered in the # future when there is time. # suite_names = controller.get_test_suite_names(serialno=serialno, # session=session) suite_descs = controller.get_test_suite_descs(serialno=serialno, session=session) devicetype = serialnos.get_serialno_efield(sno=serialno, session=session) projectfolder = projects.cards[devicetype] bomobj = import_pcb(cardfolder=projectfolder) # Perhaps this bomobject should not be recreated on the fly. bomobj.configure_motifs(devicetype) if order_by == 'FILE_ORDER': logger.info("Creating dummy test suites for file ordering") dummy_suites = get_electronics_test_suites(None, devicetype, projectfolder, offline=True) ldummy_suites = [] for suite in dummy_suites: suite.dummy = True ldummy_suites.append(suite) file_order = [(x.desc, [(y.desc, y.passfailonly) for y in x.tests]) for x in ldummy_suites] suite_order = [x[0] for x in file_order] test_order = {x[0]: x[1] for x in file_order} elif order_by == 'DONT_CARE': suite_order = [] test_order = {} else: raise ValueError('Unknown order_by heuristic : ' + order_by) suites = [] suite_descs = sort_by_order(suite_descs, suite_order) # for suite_name in suite_names: for desc, name in suite_descs: suite_db_obj = controller.get_latest_test_suite(serialno=serialno, suite_class=name, descr=desc, session=session) if suite_db_obj.suite_class == \ "<class 'tendril.testing.testbase.TestSuiteBase'>": suite_obj = TestSuiteBase() else: raise ValueError("Unrecognized suite_class : " + suite_db_obj.suite_class) suite_obj.desc = suite_db_obj.desc suite_obj.title = suite_db_obj.title suite_obj.ts = suite_db_obj.created_at suite_obj.serialno = serialno if order_by == 'FILE_ORDER': test_display_params = { x[0]: x[1] for x in test_order[suite_obj.desc] } for test_db_obj in suite_db_obj.tests: class_name = rex_class.match(test_db_obj.test_class).group('cl') test_obj = get_test_object(class_name, offline=True) test_obj.desc = test_db_obj.desc test_obj.title = test_db_obj.title test_obj.ts = test_db_obj.created_at test_obj.use_bom(bomobj) test_obj.load_result_from_obj(test_db_obj.result) if order_by == 'FILE_ORDER': test_obj.passfailonly = test_display_params[test_obj.desc] suite_obj.add_test(test_obj) # Crosscheck test passed? # Crosscheck suite passed? suites.append(suite_obj) return suites
def get_test_suite_objects(serialno=None, order_by='FILE_ORDER', session=None): # This reconstructs the test objects from the database. Using SQLAlchemy # as the ORM that it is, and letting it handle the object creation would # be infinitely better. It isn't done here since the models are separate # from the actual test objects, which in turn have other dependencies. # Integrating the models with the classes should be considered in the # future when there is time. # suite_names = controller.get_test_suite_names(serialno=serialno, # session=session) suite_descs = controller.get_test_suite_descs(serialno=serialno, session=session) devicetype = serialnos.get_serialno_efield(sno=serialno, session=session) projectfolder = projects.cards[devicetype] bomobj = import_pcb(cardfolder=projectfolder) # Perhaps this bomobject should not be recreated on the fly. bomobj.configure_motifs(devicetype) if order_by == 'FILE_ORDER': logger.info("Creating dummy test suites for file ordering") dummy_suites = get_electronics_test_suites(None, devicetype, projectfolder, offline=True) ldummy_suites = [] for suite in dummy_suites: suite.dummy = True ldummy_suites.append(suite) file_order = [(x.desc, [(y.desc, y.passfailonly) for y in x.tests]) for x in ldummy_suites] suite_order = [x[0] for x in file_order] test_order = {x[0]: x[1] for x in file_order} elif order_by == 'DONT_CARE': suite_order = [] test_order = {} else: raise ValueError('Unknown order_by heuristic : ' + order_by) suites = [] suite_descs = sort_by_order(suite_descs, suite_order) # for suite_name in suite_names: for desc, name in suite_descs: suite_db_obj = controller.get_latest_test_suite( serialno=serialno, suite_class=name, descr=desc, session=session ) if suite_db_obj.suite_class == \ "<class 'tendril.testing.testbase.TestSuiteBase'>": suite_obj = TestSuiteBase() else: raise ValueError("Unrecognized suite_class : " + suite_db_obj.suite_class) suite_obj.desc = suite_db_obj.desc suite_obj.title = suite_db_obj.title suite_obj.ts = suite_db_obj.created_at suite_obj.serialno = serialno if order_by == 'FILE_ORDER': test_display_params = {x[0]: x[1] for x in test_order[suite_obj.desc]} for test_db_obj in suite_db_obj.tests: class_name = rex_class.match(test_db_obj.test_class).group('cl') test_obj = get_test_object(class_name, offline=True) test_obj.desc = test_db_obj.desc test_obj.title = test_db_obj.title test_obj.ts = test_db_obj.created_at test_obj.use_bom(bomobj) test_obj.load_result_from_obj(test_db_obj.result) if order_by == 'FILE_ORDER': test_obj.passfailonly = test_display_params[test_obj.desc] suite_obj.add_test(test_obj) # Crosscheck test passed? # Crosscheck suite passed? suites.append(suite_obj) return suites