def get_loader_sorting_by_methods_order(cls): """ Возвращает loader unittest, в котором реализована сортировка тестов в порядке их описания внутри класса. Usage: unittest.main(testLoader=get_loader_sorting_by_methods_order(YourTestClass)) :param cls: класс, которому принадлежат методы :return: лямбда-функция сортировки методов тестов """ loader = TestLoader() method_line_number = lambda method: getattr(cls, method ).__code__.co_firstlineno loader.sortTestMethodsUsing = lambda a, b: method_line_number( a) - method_line_number(b) return loader
# Ideally this would be in a common helper library shared between the tests def terminate_server_process(process): if os.name == "nt": process.kill() else: os.killpg(os.getpgid(process.pid), signal.SIGTERM) # Send the signal to all the process groups if __name__ == "__main__": cwd = dirname(realpath(__file__)) print("Current directory is: " + cwd) server = start_server_process() try: runner = TextTestRunner(verbosity=2) test_loader = TestLoader() test_loader.sortTestMethodsUsing = sort_test suite = test_loader.discover(cwd, pattern="*_tests.py") result = runner.run(suite) if not result.wasSuccessful(): sys.exit(1) finally: print("Killing server") terminate_server_process(server) print("Done killing server")
# Never write output back to the console self._mirrorOutput = False unittest.TestResult.stopTest(self, test) def getResults(self): return self.results if __name__ == '__main__': try: from test import Test # Run the tests with our custom setup loader = TestLoader() # Maintain the ordering that tests appear in the source code loader.sortTestMethodsUsing = lambda x, y: -1 tests = loader.loadTestsFromTestCase(Test) suite = TestSuite([tests]) runner = PrairieTestRunner() results = runner.run(suite).getResults() # Compile total number of points max_points = sum([test['max_points'] for test in results]) earned_points = sum([test['points'] for test in results]) # Assemble final grading results grading_result = {} grading_result['tests'] = results grading_result['score'] = float(earned_points) / float(max_points) grading_result['succeeded'] = True print(json.dumps(grading_result, allow_nan=False))
return subprocess.Popen(cmd, shell=True, preexec_fn=os.setsid) #On linux, have to set shell=True #Ideally this would be in a common helper library shared between the tests def terminate_server_process(process): if os.name == 'nt': process.kill() else: os.killpg(os.getpgid(process.pid), signal.SIGTERM) # Send the signal to all the process groups if __name__ == '__main__': cwd = dirname(realpath(__file__)) server = start_server_process() try: runner = TextTestRunner(verbosity=2) test_loader = TestLoader() test_loader.sortTestMethodsUsing = sort_test suite = test_loader.discover(cwd, pattern="*_tests.py") result = runner.run(suite) if not result.wasSuccessful(): sys.exit(1) finally: print("Killing server") terminate_server_process(server) print("Done killing server")