Overriding Python Unit Test module for custom output? [code updated] -
edit: solved!
will update shortly solution.
aim:
i want rewrite python's unittest
module when call following json output within stdout
stream. example:
{ "errors":0, "failures":1, "ran":3, "skipped":0, "successful":2, "test_data":[ { "index":0, "result":1 }, { "index":1, "result":1 }, { "index":2, "result":-1 } ] }
problem:
i've written code generate these test results, i'm facing problems writing code test_data
attribute of json array. i've overwritten testcase
, texttestresult
, texttestrunner
classes can't seem figure out how result gettestsreport()
:
#!/usr/bin/python import unittest import sys, os import json class dataholder(object): x = none class mytestrunner(unittest.texttestrunner): def _makeresult(self): obj = mytestresult(self.stream, self.descriptions, self.verbosity) dataholder.x = obj.gettestsreport() return obj class mytestresult(unittest._texttestresult): """ holder test result information. test results automatically managed testcase , testsuite classes, , not need explicitly manipulated writers of tests. each instance holds total number of tests run, , collections of failures , errors occurred among test runs. collections contain tuples of (testcase, exceptioninfo), exceptioninfo formatted traceback of error occurred. """ _previoustestclass = none _testrunentered = false _modulesetupfailed = false def __init__(self, stream=none, descriptions=none, verbosity=none): self.failfast = false self.failures = [] self.errors = [] self.testsrun = 0 self.skipped = [] self.expectedfailures = [] self.unexpectedsuccesses = [] self.shouldstop = false self.buffer = false self._stdout_buffer = none self._stderr_buffer = none self._original_stdout = sys.stdout self._original_stderr = sys.stderr self._mirroroutput = false # list containing run tests, index , result. new line of code. self.tests_run = [] def gettestsreport(self): """returns run tests list of form [test_description, test_index, result]""" return self.tests_run ### ### modified functions add test case tests run list. ### -1 means failure. 0 means error. 1 means success. ### def adderror(self, test, err): """ called when error has occurred. 'err' tuple of values returned sys.exc_info(). """ self.errors.append((test, self._exc_info_to_string(err, test))) self._mirroroutput = true self.tests_run.append([test.shortdescription(), self.testsrun, 0]) testresult.adderror(self, test, err) def addfailure(self, test, err): """ called when error has occurred. 'err' tuple of values returned sys.exc_info(). """ self.failures.append((test, self._exc_info_to_string(err, test))) self._mirroroutput = true self.tests_run.append([test.shortdescription(), self.testsrun, -1]) testresult.addfailure(self, test, err) def addsuccess(self, test): "called when test has completed successfully" self.tests_run.append([test.shortdescription(), self.testsrun, 1]) testresult.addsuccess(self, test) class mytest(unittest.testcase): currentresult = none # holds last result object passed run method results = [] # holds results can report ccc backend @classmethod def setresult(cls, amount, errors, failures, skipped): cls.amount, cls.errors, cls.failures, cls.skipped = \ amount, errors, failures, skipped def teardown(self): amount = self.currentresult.testsrun errors = self.currentresult.errors failures = self.currentresult.failures skipped = self.currentresult.skipped self.setresult(amount, errors, failures, skipped) @classmethod def teardownclass(cls): print json.dumps( { 'ran': cls.amount, 'errors': len(cls.errors), 'failures': len(cls.failures), 'succeeded': cls.amount - len(cls.errors) - len(cls.failures), 'skipped': len(cls.skipped), 'test_data' : dataholder.x }, sort_keys=true, indent=4, separators=(',', ': ') ) return def run(self, result=none): self.currentresult = result # remember result use in teardown unittest.testcase.run(self, result) # call superclass's run() method # tests defined below. def test_something(self): self.assertequal(1, 2) if __name__ == '__main__': mytestrunner( stream=none, descriptions=0, verbosity=0 ) unittest.main(exit=false)
why isn't value of x
updating after calling gettestsreport()
?
edit:
okay, think unittest.main(exit=false)
calling wrong function! i'm trying rewrite code in main, still facing bunch of issues:
#!/usr/bin/python import unittest import sys, os import json import string class mytestrunner(unittest.texttestrunner): def _makeresult(self): return mytestresult(self.stream, self.descriptions, self.verbosity) class mytestresult(unittest._texttestresult): """ holder test result information. test results automatically managed testcase , testsuite classes, , not need explicitly manipulated writers of tests. each instance holds total number of tests run, , collections of failures , errors occurred among test runs. collections contain tuples of (testcase, exceptioninfo), exceptioninfo formatted traceback of error occurred. """ _previoustestclass = none _testrunentered = false _modulesetupfailed = false def __init__(self, stream=none, descriptions=none, verbosity=none): self.failfast = false self.failures = [] self.errors = [] self.testsrun = 0 self.skipped = [] self.expectedfailures = [] self.unexpectedsuccesses = [] self.shouldstop = false self.buffer = false self._stdout_buffer = none self._stderr_buffer = none self._original_stdout = sys.stdout self._original_stderr = sys.stderr self._mirroroutput = false # list containing run tests, index , result. new line of code. self.tests_run = [] def gettestsreport(self): """returns run tests list of form [test_description, test_index, result]""" return self.tests_run ### ### modified functions add test case tests run list. ### -1 means failure. 0 means error. 1 means success. ### def adderror(self, test, err): """ called when error has occurred. 'err' tuple of values returned sys.exc_info(). """ self.errors.append((test, self._exc_info_to_string(err, test))) self._mirroroutput = true self.tests_run.append([test.shortdescription(), self.testsrun, 0]) testresult.adderror(self, test, err) def addfailure(self, test, err): """ called when error has occurred. 'err' tuple of values returned sys.exc_info(). """ self.failures.append((test, self._exc_info_to_string(err, test))) self._mirroroutput = true self.tests_run.append([test.shortdescription(), self.testsrun, -1]) testresult.addfailure(self, test, err) def addsuccess(self, test): "called when test has completed successfully" self.tests_run.append([test.shortdescription(), self.testsrun, 1]) testresult.addsuccess(self, test) class mytest(unittest.testcase): currentresult = none # holds last result object passed run method results = [] # holds results can report ccc backend @classmethod def setresult(cls, amount, errors, failures, skipped): cls.amount, cls.errors, cls.failures, cls.skipped = \ amount, errors, failures, skipped def teardown(self): amount = self.currentresult.testsrun errors = self.currentresult.errors failures = self.currentresult.failures skipped = self.currentresult.skipped self.setresult(amount, errors, failures, skipped) @classmethod def teardownclass(cls): print json.dumps( { 'ran': cls.amount, 'errors': len(cls.errors), 'failures': len(cls.failures), 'succeeded': cls.amount - len(cls.errors) - len(cls.failures), 'skipped': len(cls.skipped), 'test_data' : dataholder.x }, sort_keys=true, indent=4, separators=(',', ': ') ) return def run(self, result=none): self.currentresult = result # remember result use in teardown unittest.testcase.run(self, result) # call superclass's run() method # tests defined below. def test_something(self): self.assertequal(1, 2) if __name__ == '__main__': module = __import__('__main__') testrunner = mytestrunner(verbosity=0) test = unittest.defaulttestloader.loadtestsfrommodule(module) print test test2 = unittest.defaulttestloader.loadtestsfromnames(test, module) result = unittest.testrunner.run(test2)
can me out here? i'm stuck :(
Comments
Post a Comment