2013-10-05 62 views
52

我想在Go中創建一個包,並將包的測試和示例作爲子目錄以保持工作空間清潔。這是可能的,如果是這樣的話?Golang在子目錄中的測試

所有文檔總是將測試代碼放在與其他代碼相同的地方,這是更好的方式還是公約?

謝謝。

+3

注意:'go test。/ ...'將在當前文件夾*和*所有子文件夾上運行測試。請參閱[我的答案](http://stackoverflow.com/a/21725603/6309) – VonC

+0

[如何在我的項目中測試所有測試?](http://stackoverflow.com/問題/ 16353016/how-to-go-test-all-testings-in-my-project) –

+0

我在想同樣的事情。因爲在同一級別上的導演有副目錄,所以在將測試分爲單獨的目錄方面有困難。 –

回答

86

請注意,您可以運行go test「遞歸」:你需要列出所有你想測試包。

如果你是你的圍棋項目的根文件夾,鍵入:

go test ./... 

的 './...' 符號在的 「command go」 一節 「Description of package lists」 描述:

如果導入路徑包含一個或多個「...」通配符,則它們可以匹配任何字符串,包括空字符串和包含斜槓的字符串。

這樣的模式擴展到GOPATH樹中找到的所有包目錄,其名稱與模式匹配。

作爲一個特殊情況,x/...匹配x以及x的子目錄。
例如,net/...擴展爲net並打包在其子目錄中。


如果你把你_test.go文件中的子文件夾,在「go test ./...」命令就可以接他們回家。
但是:

  • 你需要前綴導出的變量和函數(在測試中使用)與您包的名稱,以便測試文件,以便能夠訪問包導出的內容。
  • 您不會訪問未導出的內容。

也就是說,我仍然希望將_test.go文件放在主源文件的旁邊:它更容易找到。

+1

有些人可能會認爲不能訪問私人內容是正常的黑盒測試,而且更好。關於必須符合公共符號的條件,您可以隨時導入_「...」。 – ddevienne

10

將您的測試放在名爲file_test.go的文件的同一目錄中,其中「file」是您正在測試的源代碼文件的名稱。這是慣例,我發現在我自己的經驗中它是最好的。

如果go test工具還不是很夠自動爲你,你可能會考慮GoConvey,其中有一個網絡的用戶界面,會自動更新和運行傳統的圍棋測試以及GoConvey測試(這是基於行爲,並且比傳統的Go測試更加自我記錄)。

+2

GoConvey真棒(我正在等待新的UI期待很高)。例如,我在當前的項目中使用它,例如https://github.com/VonC/asciidocgo/blob/master/abstractNode_test.go)。但是'go test'也可以用於子文件夾。請參閱[我的回答如下](http://stackoverflow.com/a/21725603/6309) – VonC

+0

正確的你。事實上,這個問題可能比我的回答更有意義。 – Matt

+0

這並不重要,GoConvey仍然存在;) – VonC

0

我通常不這樣做的測試,但你可以將你的文件到目錄和使用進口喜歡

import "./models"如果是
import "../models如果超出一個級別,並在

一個級別了一個級別例如,對於:
./models/todo.go
./test/todo_test.go

從測試, 您在todo_test.go進口將

import "../models"

+0

這種導入代碼的方法僅適用於暴露的函數。即使你認爲你明確地將它們放在同一個包中,它的行爲似乎也不像它們在同一個包中。所以這個解決方案並不能真正解決單元測試的問題。 –

0

請嘗試下面的github存儲庫。

https://github.com/appleboy/golang-testing

您也可以下載golang測試腳本。

$ curl -fsSL https://raw.githubusercontent.com/appleboy/golang-testing/master/coverage.sh /usr/local/bin/coverage 
$ chmod +x /usr/local/bin/coverage