2013-10-04 53 views
2

我正在學習python,我試圖運行一些簡單的單元測試有一些麻煩。我使用nosetests來運行一些手動編寫的測試,並且我已經使用Travis持續集成爲我的github存儲庫設置了一些CI實踐。我注意到它沒有爲python 3.x構建所有的版本,但是爲2.x傳遞任何東西。簡單的類失敗nosetests3

首先,這裏是我的兩個文件。

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 
[email protected]:~/dev/Projects/Numbers/fib$ 

然而,當我部署到特拉維斯CI和運行nosetests與python3.x,或者我在我的機器上運行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 -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

fib.py和test_fib.py在同一個目錄下嗎? –

+0

是的,連同一個空的\ _ \ _ init \ _ \ _。py,nosetests顯然無法正常工作。 – sjotterman

+0

如果您在py3上安裝了另一個fib軟件包,則可能需要'from .fib import fib'。 – kalhartt

回答

0

確保你沒有一些舊文件奠定左右,如__pycache__也許下fib/fib.pyc什麼的,因爲對我來說,一切與nosetests的Python 3.3.2下正常工作以及無:

(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,看到的Python 2.x的那麼的行爲;如果同一問題開始發生,則表示您有一個頂級包fib,默認情況下,Python 3.x會導入某個位置,但在Python 2.x中會被兄弟包忽略(即與test_fib位於同一文件夾中的包),其導入的__future__已更改爲Python 3.x行爲。有關未來進口的更多信息,請參閱Future statement definitions;約absolute_import,見PEP 328 -- Imports: Multi-Line and Absolute/Relative

+0

'from __future__ import absolute_import'並將我的函數調用從'fib(0)'改爲'fib.fib(0)'修復了一切。謝謝! – sjotterman