我正在学习python,我正在尝试运行一些简单的单元测试。我正在使用nosetests
运行一些手动编写的测试,并且我已经使用Travis Continuous Integration设置了我的github存储库,以进行一些CI练习。我注意到python 3.x的所有构建都失败了,但是为2.x传递了任何内容。
首先,这是我的两个文件。
fib.py
#! /usr/bin/python3
#fib.py
import sys
def fib(n):
if (n == 0):
return 0
if (n == 1):
return 1
return fib(n -1) + fib(n - 2)
def main():
if (len(sys.argv) == 2):
print(fib(sys.argv[1]))
else:
print("Usage: ", sys.argv[0], " [number]")
if __name__ == "__main__":
main()
test_fib.py
#! /usr/bin/python3
#testfib.py
import unittest
from fib import fib
class TestFib(unittest.TestCase):
def test_fib_0(self):
self.assertEqual(fib(0), 0)
def test_fib_1(self):
self.assertEqual(fib(1), 1)
def test_fib_2(self):
self.assertEqual(fib(2), 1)
def test_fib_range(self):
for x in range(2,13):
self.assertEqual(fib(x), fib(x - 1) + fib(x - 2))
if __name__ == "__main__":
unittest.main()
正在运行python test_fib.py
:
....
----------------------------------------------------------------------
Ran 4 tests in 0.018s
OK
正在运行nosetests
....
----------------------------------------------------------------------
Ran 4 tests in 0.053s
OK
pi@kepler:~/dev/Projects/Numbers/fib$
但是,当我部署到Travis CI并使用python3.x运行nosetests
,或者在我的计算机上运行nosetests3
时,我看到了:
EEEE
======================================================================
ERROR: test_fib_0 (fib.test_fib.TestFib)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/pi/dev/Projects/Numbers/fib/test_fib.py", line 9, in test_fib_0
self.assertEqual(fib(0), 0)
TypeError: 'module' object is not callable
======================================================================
ERROR: test_fib_1 (fib.test_fib.TestFib)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/pi/dev/Projects/Numbers/fib/test_fib.py", line 12, in test_fib_1
self.assertEqual(fib(1), 1)
TypeError: 'module' object is not callable
======================================================================
ERROR: test_fib_2 (fib.test_fib.TestFib)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/pi/dev/Projects/Numbers/fib/test_fib.py", line 15, in test_fib_2
self.assertEqual(fib(2), 1)
TypeError: 'module' object is not callable
======================================================================
ERROR: test_fib_range (fib.test_fib.TestFib)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/pi/dev/Projects/Numbers/fib/test_fib.py", line 19, in test_fib_range
self.assertEqual(fib(x), fib(x - 1) + fib(x - 2))
TypeError: 'module' object is not callable
----------------------------------------------------------------------
Ran 4 tests in 0.034s
FAILED (errors=4)
我对python很新,所以我不确定我的问题是我的代码还是我的鼻子问题。关于我做错了什么想法?
以下是我正在运行的所有内容的版本:
$ python -V
Python 2.7.3
$ python3 -V
Python 3.2.3
$ nosetests -V
nosetests version 1.3.0
$ nosetests3 -V
nosetests3 version 1.1.2
$ cat /etc/*-release
PRETTY_NAME="Debian GNU/Linux 7 (wheezy)"
NAME="Debian GNU/Linux"
VERSION_ID="7"
VERSION="7 (wheezy)"
ID=debian
ANSI_COLOR="1;31"
HOME_URL="http://www.debian.org/"
SUPPORT_URL="http://www.debian.org/support/"
BUG_REPORT_URL="http://bugs.debian.org/"
答案 0 :(得分:0)
确保您没有遗留一些旧文件,例如fib/fib.pyc
或__pycache__
下的某些内容,因为对我来说,一切都可以在Python 3.3.2下正确使用nosetests没有:
(python3.3.2)~/code/python/stackoverflow$ nosetests test_fib.py
....
----------------------------------------------------------------------
Ran 4 tests in 0.001s
OK
例如,在该目录中运行python
(或ipython
)并执行:
>>> from fib import fib
>>> fib
???
并查看报告的内容:如果报告fib
为<function ...>
,则一切都应该正确;如果<module ...>
,您必须调查原因。>>> from fib import fib
>>> fib
<function fib at 0x10cb7d9e0>
例如,这就是我得到的:
from __future__ import absolute_import
您还可以尝试添加fib
,然后了解Python 2.x的行为方式;如果同样的问题开始发生,则表明你有一个顶级包test_fib
默认情况下Python 3.x导入但在Python 2.x中被sibling包覆盖(即包中与__future__
)相同的文件夹,使用absolute_import
导入更改为Python 3.x行为。有关未来导入的更多信息,请参阅Future statement definitions;关于{{1}},请参阅PEP 328 -- Imports: Multi-Line and Absolute/Relative。