2016-12-05 99 views
1

我知道py.test如何發現要運行的測試,但我不知道如何使測試引用包含要測試的代碼的文件。pytest如何查找要測試的文件?

我的項目是這樣的:

arith.py 
tests/ 
    test_airth.py 

在我的項目的根目錄下,我有一個文件arith.py

def plus(x, y): 
    return x + y 

tests/test_arith.py我有一個文件

import arith 
def test_plus(): 
    assert arith.plus(3, 5) == 8 

當我在項目的根目錄下運行,

pytest 

它發現我的測試文件,因爲我遵循測試發現規則。但是pytest與

導入錯誤答覆,同時導入測試模塊的測試/ test_arith.py」

我跑從項目的根pytest,那麼爲什麼它不喜歡我的進口?它想要在tests目錄中找到我正在測試的文件!

如何正確設置導入,使我的測試文件在tests/目錄下,可以看到項目根目錄下的測試文件? (pytest文檔中的示例似乎沒有做任何特別的事情......也許測試與被測文件位於同一目錄中?它們很詳細地描述了測試發現,但是我一定錯過了如何設置測試,以便它們可以看到他們正在測試的代碼)

回答

2

假設你有一個這樣的佈局(這是我做的)。

. 
├── myprogram 
│   ├── __init__.py 
│   ├── core.py 
│   └── db.py 
├── setup.py 
└── tests 
    ├── test_core.py 
    └── test_db.py 

你應該調用pytest像這樣:

py.test tests 

我確信這是測試目錄的絕對/相對路徑。這也假定你已經在你的根目錄中做了類似python -m pip install -e .的事情。你也有一個.git.hg文件夾:)

這有點奇怪,所以需要這麼多。當然有更好的方法?

其實最好的方法。我不認爲宣佈分發Python應用程序的最佳方式是Python包,最好是wheel,這是有爭議的。要做到這一點,你可能需要一個setup.py

通過安裝您的軟件包(最好在venv/virtualenv沙箱中),您可以確保知道需要哪些軟件包來安裝/運行。如果您的軟件包已安裝,則意味着使用import myprogram(使用我的示例佈局)的任何腳本都將能夠導入您的軟件包。這就是你在測試套件中要做的事情。

然後你的測試發現就像告訴pytest在哪裏找到它一樣簡單。

+0

不錯。有趣的是,我試圖分發的是一個單獨的文件,客戶通過簡單地說'import thething'來使用它。我已經構建了大型多文件應用程序,其中'pytest'是一個部分,並且測試目錄是'main','models','views',當然還有'env'的兄弟。以這種方式打包時,客戶會說「從模型導入任何」或「導入模型」。爲了得到我想要的東西,我想我不得不'只有'thething.py',而是將'something /''tests'的兄弟放在'something/__ init __。py'中。它只有幾百行...... –

+1

如果你想提供你想要人們導入的東西,那麼你*確實*想創建一個包 - 即使它只是一個文件。你仍然可以用'setup.py'來做到這一點。如果你採取這種方法,你可以在同一個文件夾中有'something.py'和'tests /'。 –