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

Popular posts from this blog

asp.net mvc - SSO between MVCForum and Umbraco7 -

Python Tkinter keyboard using bind -

ubuntu - Selenium Node Not Connecting to Hub, Not Opening Port -