Revel提供了一個(gè)測(cè)試框架,可以很容易地編寫和運(yùn)行針對(duì)您的應(yīng)用程序的功能測(cè)試。
應(yīng)用程序帶有一個(gè)簡單的測(cè)試骨架以便快速上手測(cè)試。
測(cè)試代碼保存在測(cè)試目錄中:
corp/myapp
app/
conf/
public/
tests/ <----
一個(gè)簡單的測(cè)試如下所示:
type AppTest struct {
revel.TestSuite
}
func (t *AppTest) Before() {
println("Set up")
}
func (t *AppTest) TestThatIndexPageWorks() {
t.Get("/")
t.AssertOk()
t.AssertContentType("text/html")
}
func (t *AppTest) After() {
println("Tear down")
}
上面的例子中展示了:
revel.TestSuite
的一個(gè)structBefore()
、 After()
在每個(gè)測(cè)試方法之前和之后被調(diào)用,如果有的話。revel.TestSuite
幫助發(fā)出請(qǐng)求到你的應(yīng)用程序,和對(duì)響應(yīng)的斷言。你可以用兩種方式運(yùn)行這個(gè)測(cè)試:
要?jiǎng)?chuàng)建自己的測(cè)試套件,需要定義一個(gè)嵌入了revel.TestSuite
類型的struct, 它提供了一個(gè)HTTP客戶端和一些輔助方法發(fā)出請(qǐng)求到應(yīng)用程序。
type TestSuite struct {
Client *http.Client
Response *http.Response
ResponseBody []byte
}
// 一些請(qǐng)求方法
func (t *TestSuite) Get(path string)
func (t *TestSuite) Post(path string, contentType string, reader io.Reader)
func (t *TestSuite) PostForm(path string, data url.Values)
func (t *TestSuite) MakeRequest(req *http.Request)
// 一些斷言方法
func (t *TestSuite) AssertOk()
func (t *TestSuite) AssertContentType(contentType string)
func (t *TestSuite) Assert(exp bool)
func (t *TestSuite) Assertf(exp bool, formatStr string, args ...interface{})
所有的請(qǐng)求方法類似:
/users/
)Response
中的成員ResponseBody
成員中如果開發(fā)人員希望使用一個(gè)定制的HTTP客戶端,而不是默認(rèn)的http.DefaultClient,應(yīng)當(dāng)在Before()
方法之前替換它。
斷言失敗后,會(huì)拋出恐慌并被測(cè)試工具捕獲,并將錯(cuò)誤列出。
為了運(yùn)行測(cè)試,testrunner
模塊必須被激活。需要在 app.conf
文件中配置:
module.testrunner = github.com/revel/revel/modules/testrunner
您還必須導(dǎo)入測(cè)試模塊的路由,在你的 routes
文件中加入下面的內(nèi)容:
module:testrunner
配置完后,測(cè)試就可以交互或非交互方式運(yùn)行。
要利用 Revel 的熱編譯功能,交互式測(cè)試運(yùn)行提供了快速編輯刷新周期。
例如,開發(fā)人員從瀏覽器中訪問 /@tests
:
然后,增加一個(gè)測(cè)試方法:
func (t AppTest) TestSomethingImportant() {
t.Get("/")
t.AssertOk()
t.AssertContentType("text/xml")
}
然后,刷新瀏覽器,看看新的測(cè)試:
運(yùn)行測(cè)試:
嗯哼,,,行不通哦,,,修改代碼使用“text/html” 替換 “text/xml”類型。
t.AssertContentType("text/html")
然后,重新運(yùn)行測(cè)試:
成功啦!
Revel 命令行工具 提供了一個(gè) test
命令,允許在命令行中運(yùn)行測(cè)試。
下面是一個(gè)示例會(huì)話:
$ revel test github.com/revel/revel/samples/booking dev
~
~ revel! http://revel.github.com/revel
~
INFO 2012/11/09 19:21:02 revel.go:237: Loaded module testrunner
Open DB
Listening on port 9000...
INFO 2012/11/09 19:21:06 test.go:95: Testing Booking example (github.com/revel/revel/samples/booking) in dev mode
Go to /@tests to run the tests.
1 test suite to run.
AppTest PASSED 0s
All Tests Passed.
您還可以運(yùn)行單個(gè)測(cè)試套件,或套件內(nèi)的方法,用句點(diǎn)分隔參數(shù):
$ revel test github.com/revel/revel/samples/booking dev ApplicationTest
$ revel test github.com/revel/revel/samples/booking dev ApplicationTest.TestThatIndexPageWorks
在控制臺(tái)測(cè)試套件只有一個(gè)簡單的合格/不合格顯示。更詳細(xì)的結(jié)果寫入到文件系統(tǒng):
$ cd src/github.com/revel/revel/samples/booking
$ find test-results
test-results
test-results/app.log
test-results/AppTest.passed.html
test-results/result.passed
它寫三點(diǎn)不同:
app.log
result.passed
或 result.failed
被寫入, 這取決于整體的成功。對(duì)于整合持續(xù)構(gòu)建測(cè)試,有兩點(diǎn)建議:
result.success
, 或禁止 result.failed
存在。Revel 做了什么:
revel.TestSuites
類型的變量設(shè)置一個(gè)列表當(dāng) testrunner
模塊激活后,測(cè)試代碼才會(huì)被構(gòu)建。
改進(jìn)測(cè)試框架:
test-results/app.log
更多建議: