1

我有一個項目的結構是這樣的:蟒蛇單元測試導入類子目錄

|tools/ 
|-- test/ 
| |-- __init__.py 
| |-- test_class1.py 
| |-- test_class2.py 
| 
|-- tools/ 
|-- __init__.py 
| |-- class1.py 
| |-- class2.py 
| 
|-- test_runner (Python script that calls unittest.TestLoader().discover('test')) 
|-- README.md 

我想運行test_runner並讓它運行在test文件夾中的所有測試。我個人的測試將會有這樣一行:from test_class import TestClass來測試適當的類。

test_runner看起來是這樣的:

#!/usr/bin/env python 

import unittest 
import sys 
import os 
sys.path.append(os.path.realpath(__file__) + '/tools') 

suite = unittest.TestLoader().discover('test') 
results = unittest.TextTestRunner(verbosity=2).run(suite) 
if len(results.errors) > 0 or len(results.failures) > 0: 
    sys.exit(1) 
sys.exit() 

現在這是行不通的,我的測試文件無法導入其相應的課程。我可以讓它工作,如果我export PYTHONPATH=/path/to/file但我想通過腳本得到這個工作。

我也試過sys.path.insert(0, os.path.dirname(__file__) + '/tools')但是,這並不工作,因爲文件,當我使用sys.path.insert沒有返回。

+0

任何不使用「nosetests」的理由? –

+0

這不是太大的項目,所以我不想添加太多的依賴關係。我認爲會有一個更簡單的方法來做到這一點,我錯過了。它看起來像「nosetests」是唯一的選擇嗎? –

+0

這不是唯一的選擇,但我不會考慮測試運行者的依賴。 –

回答

6

只要確定你使用絕對導入,通過指定你的包名稱(在你的情況下的「工具」)。 根本不需要修改系統路徑。

例如,對於這個項目的結構和運行main.py:

project 
    main.py 
    package1 
     __init__.py 
     module1.py 
    package2 
     __init__.py 
     module2.py 

在module1.py,你應該使用

from package2 import module2 

from package2.module2 import myclass 

這是絕對進口。 不需要系統路徑修改

+0

謝謝,這完美的作品! –

+1

如果我想從module1.py導入main.py,會怎麼樣? – dthor

+1

對於最佳做法,我不會推薦這樣做。在我的例子中main.py只是啓動文件。就像Django項目結構中的「manage.py」一樣(以幫助理解...) 如果您在main.py中有一些代碼,請將其移動到module1可以調用的另一個模塊。 – adriencog