Call a python unittest from another script and export all the error messages
python, unit-testing
Solution
You need to use a `test runner`
test runner A test runner is a component which orchestrates the execution of tests and provides the outcome to the user. The runner may use a graphical interface, a textual interface, or return a special value to indicate the results of executing the tests.
from unittest.case import TestCase
import unittest
from StringIO import StringIO
class MyTestCase(TestCase):
def testTrue(self):
'''
Always true
'''
assert True
def testFail(self):
'''
Always fails
'''
assert False
from pprint import pprint
stream = StringIO()
runner = unittest.TextTestRunner(stream=stream)
result = runner.run(unittest.makeSuite(MyTestCase))
print 'Tests run ', result.testsRun
print 'Errors ', result.errors
pprint(result.failures)
stream.seek(0)
print 'Test output\n', stream.read()
>>> Output:
>>> Tests run 2
>>> Errors []
>>> [(<__main__.MyTestCase testMethod=testFail>,
>>> 'Traceback (most recent call last):\n File "leanwx/test.py", line 15, in testFail\n assert False\nAssertionError\n')]
>>> Test output
>>> F.
>>> ======================================================================
>>> FAIL: testFail (__main__.MyTestCase)
>>> ----------------------------------------------------------------------
>>> Traceback (most recent call last):
>>> File "leanwx/test.py", line 15, in testFail
>>> assert False
>>> AssertionError
>>>
>>>----------------------------------------------------------------------
>>>Ran 2 tests in 0.001s
>>>
>>>FAILED (failures=1)
Problem
Sorry for the basic question. I have used unittest method to check my models in one script. Now, my question is how do I call this script from another file and save testing results. Below is my code sample: ``` **model_test.py** import unittest import model_eq #script has models class modelOutputTest(unittest.TestCase): def setUp(self): #####Pre-defined inputs######## self.dsed_in=[1,2] #####Pre-defined outputs######## self.msed_out=[6,24] #####TestCase run variables######## self.tot_iter=len(self.a_in) def testMsed(self): for i in range(self.tot_iter): fun = model_eq.msed(self.dsed_in[i],self.a_in[i],self.pb_in[i]) value = self.msed_out[i] testFailureMessage = "Test of function name: %s iteration: %i expected: %i != calculated: %i" % ("msed",i,value,fun) self.assertEqual(round(fun,3),round(self.msed_out[i],3),testFailureMessage) if __name__ == '__main__': unittest.main() ``` The next step I want is to create another script called test_page.py, which runs the unit test script and save results to a variable (I need to post results to a webpage). ``` test_page.py from model_test.py import * a=modelOutputTest.testMsed() ``` However, I got the following errors. ``` Traceback (most recent call last): File "D:\Dropbox\AppPest\rice\Rice_unittest.py", line 16, in <module> a= RiceOutputTest.testMsed() TypeError: unbound method testMsed() must be called with RiceOutputTest instance as first argument (got nothing instead) ``` Can anyone give me some suggestions? Thanks! Thanks for the help from Nix! My next question is: I need to test the function with two given cases in a loop. It is posted here.