nose-devs / nose

nose is nicer testing for python
http://readthedocs.org/docs/nose/en/latest/
1.36k stars 395 forks source link

Nose doesn't run in python3.9 alpha version #1099

Open fruch opened 4 years ago

fruch commented 4 years ago
Traceback (most recent call last):                                                                                                                                     
  File "/usr/lib/python3.9/runpy.py", line 193, in _run_module_as_main                                                                                                  
    return _run_code(code, main_globals, None,                                                                                                                          
  File "/usr/lib/python3.9/runpy.py", line 86, in _run_code                                                                                                             
    exec(code, run_globals)                                                                                                                                             
  File "/home/fruch/Projects/scylla-dtest/.venv39/lib/python3.9/site-packages/nose/__main__.py", line 8, in <module>                                                    
    run_exit()                                                                                                                                                         
  File "/home/fruch/Projects/scylla-dtest/.venv39/lib/python3.9/site-packages/nose/core.py", line 118, in __init__                                                     
    unittest.TestProgram.__init__(              
  File "/usr/lib/python3.9/unittest/main.py", line 100, in __init__                                                                                  
    self.parseArgs(argv)                              
  File "/home/fruch/Projects/scylla-dtest/.venv39/lib/python3.9/site-packages/nose/core.py", line 179, in parseArgs                          
    self.createTests()                                 
  File "/home/fruch/Projects/scylla-dtest/.venv39/lib/python3.9/site-packages/nose/core.py", line 193, in createTests                                                   
    self.test = self.testLoader.loadTestsFromNames(self.testNames)                                                                                                        File "/home/fruch/Projects/scylla-dtest/.venv39/lib/python3.9/site-packages/nose/loader.py", line 481, in loadTestsFromNames                                          
    return unittest.TestLoader.loadTestsFromNames(self, names, module)                                                                                                 
  File "/usr/lib/python3.9/unittest/loader.py", line 220, in loadTestsFromNames                                                                                        
    suites = [self.loadTestsFromName(name, module) for name in names]                                       
  File "/usr/lib/python3.9/unittest/loader.py", line 220, in <listcomp>                                                                                                
    suites = [self.loadTestsFromName(name, module) for name in names]                                                                        
  File "/home/fruch/Projects/scylla-dtest/.venv39/lib/python3.9/site-packages/nose/loader.py", line 454, in loadTestsFromName                                          
    return LazySuite(                                                                                                                                                  
  File "/home/fruch/Projects/scylla-dtest/.venv39/lib/python3.9/site-packages/nose/suite.py", line 53, in __init__                                                     
    super(LazySuite, self).__init__()                                                                                                        
  File "/usr/lib/python3.9/unittest/suite.py", line 22, in __init__                                                                                                         self._tests = []                                                                                                                        
  File "/home/fruch/Projects/scylla-dtest/.venv39/lib/python3.9/site-packages/nose/suite.py", line 106, in _set_tests                                    
    if isinstance(tests, collections.Callable) and not is_suite:                                                                                       
AttributeError: module 'collections' has no attribute 'Callable'   
jszakmeister commented 4 years ago

FYI: nose is no longer maintained. You should look to migrate to nose2, though it's a different paradigm than the original nose.

fruch commented 4 years ago

nice, more reason to move to pytest. @roydahan FYI

tdhopper commented 4 years ago

Where is if isinstance(tests, collections.Callable) and not is_suite: coming from? I don't see it in suite.py.

ngoldbaum commented 4 years ago

I believe that's coming from a transformation that's being applied by an old version of 2to3, see e.g. https://docs.python.org/3.4/library/2to3.html#2to3fixer-callable. I guess the python3 wheel for nose on pypi was generated using python3.4 or older. The transformation applied by 2to3 was updated in python3.5.

ngoldbaum commented 4 years ago

I suspect that if you tried building a nose wheel from the sdist tarball using a recent python3 version and installed the resulting wheel that would work. Haven't tried it. However pip install nose will be broken forever unless someone does a release since pip will always try to grab the python3 wheel that's on pypi for the last release.

hugovk commented 4 years ago

Good find! This works for me on Python 3.9, to prevent installation from wheel:

pip install -U nose --no-binary :all:

Full example:

$ pip install -U nose
Collecting nose
  Using cached nose-1.3.7-py3-none-any.whl (154 kB)
Installing collected packages: nose
Successfully installed nose-1.3.7
$ cat test.py
def test():
    assert True
$ nosetests
Traceback (most recent call last):
  File "/Users/hugo/.pyenv/versions/3.9-dev/bin/nosetests", line 8, in <module>
    sys.exit(run_exit())
  File "/Users/hugo/.pyenv/versions/3.9-dev/lib/python3.9/site-packages/nose/core.py", line 118, in __init__
    unittest.TestProgram.__init__(
  File "/Users/hugo/.pyenv/versions/3.9-dev/lib/python3.9/unittest/main.py", line 100, in __init__
    self.parseArgs(argv)
  File "/Users/hugo/.pyenv/versions/3.9-dev/lib/python3.9/site-packages/nose/core.py", line 179, in parseArgs
    self.createTests()
  File "/Users/hugo/.pyenv/versions/3.9-dev/lib/python3.9/site-packages/nose/core.py", line 193, in createTests
    self.test = self.testLoader.loadTestsFromNames(self.testNames)
  File "/Users/hugo/.pyenv/versions/3.9-dev/lib/python3.9/site-packages/nose/loader.py", line 481, in loadTestsFromNames
    return unittest.TestLoader.loadTestsFromNames(self, names, module)
  File "/Users/hugo/.pyenv/versions/3.9-dev/lib/python3.9/unittest/loader.py", line 220, in loadTestsFromNames
    suites = [self.loadTestsFromName(name, module) for name in names]
  File "/Users/hugo/.pyenv/versions/3.9-dev/lib/python3.9/unittest/loader.py", line 220, in <listcomp>
    suites = [self.loadTestsFromName(name, module) for name in names]
  File "/Users/hugo/.pyenv/versions/3.9-dev/lib/python3.9/site-packages/nose/loader.py", line 454, in loadTestsFromName
    return LazySuite(
  File "/Users/hugo/.pyenv/versions/3.9-dev/lib/python3.9/site-packages/nose/suite.py", line 53, in __init__
    super(LazySuite, self).__init__()
  File "/Users/hugo/.pyenv/versions/3.9-dev/lib/python3.9/unittest/suite.py", line 22, in __init__
    self._tests = []
  File "/Users/hugo/.pyenv/versions/3.9-dev/lib/python3.9/site-packages/nose/suite.py", line 106, in _set_tests
    if isinstance(tests, collections.Callable) and not is_suite:
AttributeError: module 'collections' has no attribute 'Callable'
$ pip uninstall -y nose
Found existing installation: nose 1.3.7
Uninstalling nose-1.3.7:
  Successfully uninstalled nose-1.3.7
$ pip install -U nose --no-binary :all:
Collecting nose
  Using cached nose-1.3.7.tar.gz (280 kB)
Skipping wheel build for nose, due to binaries being disabled for it.
Installing collected packages: nose
    Running setup.py install for nose ... done
Successfully installed nose-1.3.7
$ nosetests
.
----------------------------------------------------------------------
Ran 1 test in 0.013s

OK
$

I'd still recommend migrating to pytest, but this is a quick fix.

fruch commented 4 years ago

thanks @hugovk, this anyhow would be a good incentive to move to pytest...

atsb commented 4 years ago

@fruch or alternatively do pip install nose-py3

tudu123 commented 2 years ago

Good find! This works for me on Python 3.9, to prevent installation from wheel:

pip install -U nose --no-binary :all:

Full example:

$ pip install -U nose
Collecting nose
  Using cached nose-1.3.7-py3-none-any.whl (154 kB)
Installing collected packages: nose
Successfully installed nose-1.3.7
$ cat test.py
def test():
    assert True
$ nosetests
Traceback (most recent call last):
  File "/Users/hugo/.pyenv/versions/3.9-dev/bin/nosetests", line 8, in <module>
    sys.exit(run_exit())
  File "/Users/hugo/.pyenv/versions/3.9-dev/lib/python3.9/site-packages/nose/core.py", line 118, in __init__
    unittest.TestProgram.__init__(
  File "/Users/hugo/.pyenv/versions/3.9-dev/lib/python3.9/unittest/main.py", line 100, in __init__
    self.parseArgs(argv)
  File "/Users/hugo/.pyenv/versions/3.9-dev/lib/python3.9/site-packages/nose/core.py", line 179, in parseArgs
    self.createTests()
  File "/Users/hugo/.pyenv/versions/3.9-dev/lib/python3.9/site-packages/nose/core.py", line 193, in createTests
    self.test = self.testLoader.loadTestsFromNames(self.testNames)
  File "/Users/hugo/.pyenv/versions/3.9-dev/lib/python3.9/site-packages/nose/loader.py", line 481, in loadTestsFromNames
    return unittest.TestLoader.loadTestsFromNames(self, names, module)
  File "/Users/hugo/.pyenv/versions/3.9-dev/lib/python3.9/unittest/loader.py", line 220, in loadTestsFromNames
    suites = [self.loadTestsFromName(name, module) for name in names]
  File "/Users/hugo/.pyenv/versions/3.9-dev/lib/python3.9/unittest/loader.py", line 220, in <listcomp>
    suites = [self.loadTestsFromName(name, module) for name in names]
  File "/Users/hugo/.pyenv/versions/3.9-dev/lib/python3.9/site-packages/nose/loader.py", line 454, in loadTestsFromName
    return LazySuite(
  File "/Users/hugo/.pyenv/versions/3.9-dev/lib/python3.9/site-packages/nose/suite.py", line 53, in __init__
    super(LazySuite, self).__init__()
  File "/Users/hugo/.pyenv/versions/3.9-dev/lib/python3.9/unittest/suite.py", line 22, in __init__
    self._tests = []
  File "/Users/hugo/.pyenv/versions/3.9-dev/lib/python3.9/site-packages/nose/suite.py", line 106, in _set_tests
    if isinstance(tests, collections.Callable) and not is_suite:
AttributeError: module 'collections' has no attribute 'Callable'
$ pip uninstall -y nose
Found existing installation: nose 1.3.7
Uninstalling nose-1.3.7:
  Successfully uninstalled nose-1.3.7
$ pip install -U nose --no-binary :all:
Collecting nose
  Using cached nose-1.3.7.tar.gz (280 kB)
Skipping wheel build for nose, due to binaries being disabled for it.
Installing collected packages: nose
    Running setup.py install for nose ... done
Successfully installed nose-1.3.7
$ nosetests
.
----------------------------------------------------------------------
Ran 1 test in 0.013s

OK
$

I'd still recommend migrating to pytest, but this is a quick fix.

The Do not use binary packages workaround doesn't work in windows, nosetests executable can be found, Is there other workaround? C:>nosetests 'nosetests' is not recognized as an internal or external command, operable program or batch file.

hugovk commented 2 years ago

You could try downloading nose-1.3.7.tar.gz from https://pypi.org/project/nose/#files and then pip install nose-1.3.7.tar.gz, or try https://pypi.org/project/nose-py3/, but it's definitely time to migrate to pytest.

gogo2464 commented 2 years ago

@hugovk I got the same issue today. I found the answer alone. Just replace

nosetests --with-doctest .\tests\doctests.py --verbose

with

python -m pytest --doctest-modules -v .\folder_that_contain_your_code

Where .\folder_that_contain_your_code is your clone. Not your doctest.py

Best reguards.

dirkf commented 2 years ago

Fixed in master, but otherwise:

import collections
try:
    collections.Callable
except AttributeError:
    import collections.abc
    collections.Callable = collections.abc.Callable
collimarco commented 1 year ago

On my MacOS + Homebrew the problem was present because I was calling python3 setup.py test instead of python3.9 setup.py test (which works).

Sgrgeto commented 1 year ago

You should do this, the problem is that the module collections doesnt have the attribute Callable, to call Callable you should before this line collections.abc.Callable. The important thing is that are three or two lines that you should do this modificaction on the nose.py file so you need to go to this path AppData/Local/Programs/Python/Python311/Lib/site-packages/nose Change the permission of the file to exectuable then change the lines of code 541 and 458 the lines are if isinstance(tests, collections.Callable) or isinstance(tests, unittest.TestSuite): instead to run the program correctly write this line if isinstance(tests, collections.abc.Callable) or isinstance(tests, unittest.TestSuite):

atsb commented 1 year ago

Just use nose-py3 instead

dirkf commented 1 year ago

Or: https://github.com/nose-devs/nose/issues/1099#issuecomment-1257294641