def main( testGroup: t.Sequence[str] = ('test', ), restoreEnvironmentDefaults=False, limit=None, verbosity=2, show: bool = True, ): ''' Run all tests. Group can be 'test' and/or 'external'. External will not run doctests. ''' for group in testGroup: if group not in ('test', 'external'): raise ValueError( f"Valid test groups are 'test' and 'external'; got {group}") commonTest.testImports() s1 = commonTest.defaultDoctestSuite(__name__) modGather = commonTest.ModuleGather() modules = modGather.load(restoreEnvironmentDefaults) environLocal.printDebug('looking for Test classes...\n') # look over each module and gather doc tests and unittests totalModules = 0 sortMods = common.misc.sortModules(modules) # print(dir(sortMods[0])) for moduleObject in sortMods: unitTestCases = [] if limit is not None: if totalModules > limit: break totalModules += 1 # get Test classes in module if not hasattr(moduleObject, 'Test'): environLocal.printDebug(f'{moduleObject} has no Test class') else: if 'test' in testGroup: unitTestCases.append(moduleObject.Test) # type: ignore if not hasattr(moduleObject, 'TestExternal'): pass # environLocal.printDebug(f'{module} has no TestExternal class\n') else: if 'external' in testGroup: if not show: moduleObject.TestExternal.show = False # type: ignore unitTestCases.append(moduleObject.TestExternal) # type: ignore # for each Test class, load this into a suite for testCase in unitTestCases: s2 = unittest.defaultTestLoader.loadTestsFromTestCase(testCase) s1.addTests(s2) if testGroup == ('external', ): # don't load doctests for runs consisting solely of TestExternal continue try: s3 = commonTest.defaultDoctestSuite(moduleObject) s1.addTests(s3) except ValueError: environLocal.printDebug(f'{moduleObject} cannot load Doctests') continue allLocals = [getattr(moduleObject, x) for x in dir(moduleObject)] globs = __import__('music21').__dict__.copy() docTestOptions = (doctest.ELLIPSIS | doctest.NORMALIZE_WHITESPACE) testRunner.addDocAttrTestsToSuite( s1, allLocals, outerFilename=moduleObject.__file__, # type: ignore globs=globs, optionflags=docTestOptions, # no checker here ) testRunner.fixDoctests(s1) environLocal.printDebug('running Tests...\n') with warnings.catch_warnings(): warnings.simplefilter('once', RuntimeWarning) # import modules... warnings.simplefilter('ignore', FutureWarning) # a lot of these scipy->numpy runner = unittest.TextTestRunner(verbosity=verbosity) finalTestResults = runner.run(s1) coverageM21.stopCoverage(cov) if (finalTestResults.errors or finalTestResults.failures or finalTestResults.unexpectedSuccesses): returnCode = 1 else: returnCode = 0 return returnCode
def mainPoolRunner( testGroup=('test', ), restoreEnvironmentDefaults=False, leaveOut=1): ''' Run all tests. Group can be test and/or external ''' commonTest.testImports() normalStdError = sys.stderr timeStart = time.time() poolSize = common.cpus() print( f'Creating {poolSize} processes for multiprocessing (omitting {leaveOut} processors)' ) modGather = commonTest.ModuleGather(useExtended=True) maxTimeout = 200 pathsToRun = modGather.modulePaths # [30:60] # pylint: disable=not-callable with multiprocessing.Pool(processes=poolSize) as pool: # imap returns the results as they are completed. # Since the number of files is small, the overhead of returning is # outweighed by the positive aspect of getting results immediately # unordered says that results can RETURN in any order; not that # they'd be pooled out in any order. res = pool.imap_unordered(runOneModuleWithoutImp, ((modGather, fp) for fp in pathsToRun)) continueIt = True timeouts = 0 eventsProcessed = 0 summaryOutput = [] while continueIt is True: try: newResult = res.next(timeout=1) if timeouts >= 5: print('') if newResult is not None: if newResult.moduleName is not None: mn = newResult.moduleName mn = mn.replace('___init__', '') mn = mn.replace('_', '.') else: mn = '' rt = newResult.runTime if rt is not None: rt = round(newResult.runTime * 10) / 10.0 if not newResult.errors and not newResult.failures: print( f'\t\t\t\t{mn}: {newResult.testsRun} tests in {rt} secs' ) else: numErr = len(newResult.errors) numFail = len(newResult.failures) print( f'\t\t\t\t{mn}: {newResult.testsRun} tests, ' f'{numErr} errors {numFail} failures in {rt} secs' ) timeouts = 0 eventsProcessed += 1 summaryOutput.append(newResult) except multiprocessing.TimeoutError: timeouts += 1 if timeouts == 5 and eventsProcessed > 0: print('Delay in processing, seconds: ', end='') elif timeouts == 5: print('Starting first modules, should take 5-10 seconds: ', end='') if timeouts % 5 == 0: print(str(timeouts) + ' ', end='', flush=True) if timeouts > maxTimeout and eventsProcessed > 0: print('\nToo many delays, giving up...', flush=True) continueIt = False printSummary(summaryOutput, timeStart, pathsToRun) pool.close() sys.exit() except StopIteration: continueIt = False pool.close() pool.join() except Exception as excp: # pylint: disable=broad-except eventsProcessed += 1 exceptionLog = ModuleResponse(returnCode='UntrappedException', moduleName=str(excp)) summaryOutput.append(exceptionLog) sys.stderr = normalStdError printSummary(summaryOutput, timeStart, pathsToRun)
def main(testGroup=('test', ), restoreEnvironmentDefaults=False, limit=None, verbosity=2): ''' Run all tests. Group can be test and external >>> print(None) None ''' commonTest.testImports() s1 = commonTest.defaultDoctestSuite(__name__) modGather = commonTest.ModuleGather() modules = modGather.load(restoreEnvironmentDefaults) environLocal.printDebug('looking for Test classes...\n') # look over each module and gather doc tests and unittests totalModules = 0 sortMods = common.misc.sortModules(modules) # print(dir(sortMods[0])) for moduleObject in sortMods: unitTestCases = [] if limit is not None: if totalModules > limit: break totalModules += 1 # get Test classes in module if not hasattr(moduleObject, 'Test'): environLocal.printDebug('%s has no Test class' % moduleObject) else: if 'test' in testGroup: unitTestCases.append(moduleObject.Test) if not hasattr(moduleObject, 'TestExternal'): pass # environLocal.printDebug('%s has no TestExternal class\n' % module) else: if 'external' in testGroup or 'testExternal' in testGroup: unitTestCases.append(moduleObject.TestExternal) # for each Test class, load this into a suite for testCase in unitTestCases: s2 = unittest.defaultTestLoader.loadTestsFromTestCase(testCase) s1.addTests(s2) try: s3 = commonTest.defaultDoctestSuite(moduleObject) s1.addTests(s3) except ValueError: environLocal.printDebug('%s cannot load Doctests' % moduleObject) continue allLocals = [getattr(moduleObject, x) for x in dir(moduleObject)] globs = __import__('music21').__dict__.copy() docTestOptions = (doctest.ELLIPSIS | doctest.NORMALIZE_WHITESPACE) testRunner.addDocAttrTestsToSuite( s1, allLocals, outerFilename=moduleObject.__file__, globs=globs, optionflags=docTestOptions, # no checker here ) testRunner.fixDoctests(s1) environLocal.printDebug('running Tests...\n') with warnings.catch_warnings(): warnings.simplefilter('once', RuntimeWarning) # import modules... warnings.simplefilter('ignore', FutureWarning) # a lot of these scipy->numpy runner = unittest.TextTestRunner(verbosity=verbosity) finalTestResults = runner.run(s1) coverageM21.stopCoverage(cov) if (finalTestResults.errors or finalTestResults.failures or finalTestResults.unexpectedSuccesses): returnCode = 1 else: returnCode = 0 return returnCode