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.
If you're using the PyCharm IDE, you can run unittest or pytest by following these steps: In the Project tool window, select the tests directory. On the context menu, choose the run command for unittest . For example, choose Run 'Unittests in my Tests…'.
There are two ways you can use assertRaises: using keyword arguments. Just pass the exception, the callable function and the parameters of the callable function as keyword arguments that will elicit the exception. Make a function call that should raise the exception with a context.
Unittest requires developers to create classes derived from the TestCase module and then define the test cases as methods in the class. Pytest, on the other hand, only requires you to define a function with “test_” prepended and use the assert conditions inside them.
setUp() and tearDown() methods to define instructions that will be executed before and after each test method.
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)
Assuming you have your unit tests located in the "test" directory:
# Tested in Python 3.8
# https://docs.python.org/3/library/unittest.html#module-unittest
from unittest import TestLoader, TestResult
from pathlib import Path
def run_tests():
test_loader = TestLoader()
test_result = TestResult()
# Use resolve() to get an absolute path
# https://docs.python.org/3/library/pathlib.html#pathlib.Path.resolve
test_directory = str(Path(__file__).resolve().parent / 'test')
test_suite = test_loader.discover(test_directory, pattern='test_*.py')
test_suite.run(result=test_result)
# See the docs for details on the TestResult object
# https://docs.python.org/3/library/unittest.html#unittest.TestResult
if test_result.wasSuccessful():
exit(0)
else:
# Here you can either print or log your test errors and failures
# test_result.errors or test_result.failures
exit(-1)
if __name__ == '__main__':
run_tests()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With