Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ValueError: no such test method in <class 'myapp.tests.SessionTestCase'>: runTest

I have a test case:

class LoginTestCase(unittest.TestCase):
    ...

I'd like to use it in a different test case:

class EditProfileTestCase(unittest.TestCase):
  def __init__(self):
    self.t = LoginTestCase()
    self.t.login()

This raises:

ValueError: no such test method in <class 'LoginTest: runTest`

I looked at the unittest code where the exception is being called, and it looks like the tests aren't supposed to be written this way. Is there a standard way to write something you'd like tested so that it can be reused by later tests? Or is there a workaround?

I've added an empty runTest method to LoginTest as a dubious workaround for now.

like image 397
Paul Biggar Avatar asked Jan 19 '10 01:01

Paul Biggar


2 Answers

The confusion with "runTest" is mostly based on the fact that this works:

class MyTest(unittest.TestCase):
    def test_001(self):
        print "ok"

if __name__ == "__main__":
    unittest.main()

So there is no "runTest" in that class and all of the test-functions are being called. However if you look at the base class "TestCase" (lib/python/unittest/case.py) then you will find that it has an argument "methodName" that defaults to "runTest" but it does NOT have a default implementation of "def runTest"

class TestCase:
    def __init__(self, methodName='runTest'):

The reason that unittest.main works fine is based on the fact that it does not need "runTest" - you can mimic the behaviour by creating a TestCase-subclass instance for all methods that you have in your subclass - just provide the name as the first argument:

class MyTest(unittest.TestCase):
    def test_001(self):
        print "ok"

if __name__ == "__main__":
    suite = unittest.TestSuite()
    for method in dir(MyTest):
       if method.startswith("test"):
          suite.addTest(MyTest(method))
    unittest.TextTestRunner().run(suite)
like image 119
Guido U. Draheim Avatar answered Sep 18 '22 12:09

Guido U. Draheim


Here's some 'deep black magic':

suite = unittest.TestLoader().loadTestsFromTestCase(Test_MyTests)
unittest.TextTestRunner(verbosity=3).run(suite)

Very handy if you just want to test run your unit tests from a shell (i.e., IPython).

like image 42
dmvianna Avatar answered Sep 20 '22 12:09

dmvianna