Source code for openquake.baselib.runtests

# -*- coding: utf-8 -*-
# vim: tabstop=4 shiftwidth=4 softtabstop=4

# Copyright (C) 2015-2023 GEM Foundation

# OpenQuake is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# OpenQuake is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU Affero General Public License
# along with OpenQuake.  If not, see <http://www.gnu.org/licenses/>.

import time
import operator
import unittest
from setuptools.command.test import ScanningLoader


[docs]class TestLoader(object):
[docs] def loadTestsFromNames(self, suitename, module=None): names = suitename[0].split(',') return ScanningLoader().loadTestsFromNames(names, module)
[docs]class TestResult(unittest.TextTestResult): timedict = {}
[docs] def startTest(self, test): tname = getattr(test, '_testMethodName', None) self.testname = '%s:%s' % (test.__module__, tname) self.timedict[self.testname] = time.time() unittest.TextTestResult.startTest(self, test)
[docs] def stopTest(self, test): unittest.TextTestResult.stopTest(self, test) self.timedict[self.testname] = ( time.time() - self.timedict[self.testname])
[docs] def save_times(self, fname): items = sorted(self.timedict.items(), key=operator.itemgetter(1), reverse=True) with open(fname, 'w') as f: for name, value in items: f.write('%s %s\n' % (name, value)) print(''.join(open(fname).readlines()[:20])) print('Saved times in ' + fname) if self.errors or self.failures: raise SystemExit(len(self.errors) + len(self.failures))
unittest.TextTestRunner.resultclass = TestResult # hack to make unittest to understand the attributes added by nose # this is used only to skip the slow tests
[docs]def addTest(self, test): tname = getattr(test, '_testMethodName', None) if tname: attrs = vars(getattr(test, tname)) if 'slow' in attrs: return self._tests.append(test)
unittest.BaseTestSuite.addTest = addTest if __name__ == '__main__': import sys pkgnames = sys.argv[1] # comma separated package names suite = TestLoader().loadTestsFromNames([pkgnames]) runner = unittest.TextTestRunner(verbosity=2, failfast=True) runner.run(suite).save_times(pkgnames)