Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to run unittest's main function in ipython/jupyter notebook

I am giving an example which throws an error in ipython/jupyter notebook, but runs fine as an individual script.

import unittest

class Samples(unittest.TestCase):

    def testToPow(self):
        pow3 = 3**3
        assert pow3==27

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

The error is below:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-7-232db94ae8b2> in <module>()
      8 
      9 if __name__ == '__main__':
---> 10     unittest.main()

/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/main.pyc in __init__(self, module, defaultTest, argv, testRunner, testLoader, exit, verbosity, failfast, catchbreak, buffer)
     92         self.testLoader = testLoader
     93         self.progName = os.path.basename(argv[0])
---> 94         self.parseArgs(argv)
     95         self.runTests()
     96 

/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/main.pyc in parseArgs(self, argv)
    147             else:
    148                 self.testNames = (self.defaultTest,)
--> 149             self.createTests()
    150         except getopt.error, msg:
    151             self.usageExit(msg)

/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/main.pyc in createTests(self)
    156         else:
    157             self.test = self.testLoader.loadTestsFromNames(self.testNames,
--> 158                                                            self.module)
    159 
    160     def _do_discovery(self, argv, Loader=None):

/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/loader.pyc in loadTestsFromNames(self, names, module)
    128         of string specifiers. See 'loadTestsFromName()'.
    129         """
--> 130         suites = [self.loadTestsFromName(name, module) for name in names]
    131         return self.suiteClass(suites)
    132 

/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/loader.pyc in loadTestsFromName(self, name, module)
     98         obj = module
     99         for part in parts:
--> 100             parent, obj = obj, getattr(obj, part)
    101 
    102         if isinstance(obj, types.ModuleType):

AttributeError: 'module' object has no attribute '/Users/root3d/Library/Jupyter/runtime/kernel-c5225ac4-4b0e-4473-ae0a-3e051a704561'

What could be the possible problem? How should I write tests in notebook, then?

like image 660
igauravsehrawat Avatar asked Jun 18 '16 10:06

igauravsehrawat


People also ask

Why the code is not running in Jupyter Notebook?

Jupyter doesn't load or doesn't work in the browserTry disabling any browser extensions and/or any Jupyter extensions you have installed. Some internet security software can interfere with Jupyter. If you have security software, try turning it off temporarily, and look in the settings for a more long-term solution.

How do I run Unittest in Jupyter?

To run the unit tests, you can either just execute the cell, and then the result of the unit test is printed below the cell of the Jupyter Notebook.

How do I run a Jupyter Notebook in IPython?

To launch Jupyter Notebook App: Click on spotlight, type terminal to open a terminal window. Enter the startup folder by typing cd /some_folder_name . Type jupyter notebook to launch the Jupyter Notebook App The notebook interface will appear in a new browser window or tab.

Can you use Unittest in Jupyter Notebook?

Unit testing with unittestWe can basically do the same thing in our Jupyter notebook. We can make a unitest. TestCase class, perform the tests we want, and then just execute the unit tests in any cell.


1 Answers

unittest.main looks at sys.argv by default, which is what started IPython, hence the error about the kernel connection file not being a valid attribute. You can pass an explicit list to main to avoid looking up sys.argv.

In the notebook, you will also want to include exit=False to prevent unittest.main from trying to shutdown the kernel process:

unittest.main(argv=['first-arg-is-ignored'], exit=False)

You can pass further arguments in the argv list, e.g.

unittest.main(argv=['ignored', '-v'], exit=False)
like image 56
minrk Avatar answered Oct 03 '22 18:10

minrk