ValueError: no such test method in : runTest

后端 未结 6 1109
时光取名叫无心
时光取名叫无心 2020-12-03 03:10

I have a test case:

class LoginTestCase(unittest.TestCase):
    ...

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

class Edi         


        
6条回答
  •  余生分开走
    2020-12-03 04:00

    @dmvianna's answer got me very close to being able to run unittest in a jupyter (ipython) notebook, but I had to do a bit more. If I wrote just the following:

    class TestStringMethods(unittest.TestCase):
    
        def test_upper(self):
            self.assertEqual('foo'.upper(), 'FOO')
    
        def test_isupper(self):
            self.assertTrue('FOO'.isupper())
            self.assertFalse('Foo'.isupper())
    
        def test_split(self):
            s = 'hello world'
            self.assertEqual(s.split(), ['hello', 'world'])
            # check that s.split fails when the separator is not a string
            with self.assertRaises(TypeError):
                s.split(2)
    
    suite = unittest.TestLoader().loadTestsFromModule (TestStringMethods)
    unittest.TextTestRunner().run(suite)
    

    I got


    Ran 0 tests in 0.000s

    OK

    It's not broken, but it doesn't run any tests! If I instantiated the test class

    suite = unittest.TestLoader().loadTestsFromModule (TestStringMethods())
    

    (note the parens at the end of the line; that's the only change) I got


    ValueError Traceback (most recent call last) in () ----> 1 suite = unittest.TestLoader().loadTestsFromModule (TestStringMethods())

    /usr/lib/python2.7/unittest/case.pyc in init(self, methodName) 189 except AttributeError: 190 raise ValueError("no such test method in %s: %s" % --> 191 (self.class, methodName)) 192 self._testMethodDoc = testMethod.doc 193 self._cleanups = []

    ValueError: no such test method in : runTest

    The fix is now reasonably clear: add runTest to the test class:

    class TestStringMethods(unittest.TestCase):
    
        def runTest(self):
            test_upper (self)
            test_isupper (self)
            test_split (self)
    
        def test_upper(self):
            self.assertEqual('foo'.upper(), 'FOO')
    
        def test_isupper(self):
            self.assertTrue('FOO'.isupper())
            self.assertFalse('Foo'.isupper())
    
        def test_split(self):
            s = 'hello world'
            self.assertEqual(s.split(), ['hello', 'world'])
            # check that s.split fails when the separator is not a string
            with self.assertRaises(TypeError):
                s.split(2)
    
    suite = unittest.TestLoader().loadTestsFromModule (TestStringMethods())
    unittest.TextTestRunner().run(suite)
    

    Ran 3 tests in 0.002s

    OK

    It also works correctly (and runs 3 tests) if my runTest just passes, as suggested by @Darren.

    This is a little yucchy, requiring some manual labor on my part, but it's also more explicit, and that's a Python virtue, isn't it?

    I could not get any of the techniques via calling unittest.main with explicit arguments from here or from this related question Unable to run unittest's main function in ipython/jupyter notebook to work inside a jupyter notebook, but I am back on the road with a full tank of gas.

提交回复
热议问题