REST API testing framework inspired by frisby-js, written in Go
I'm starting to work on frisby again with the following ideas:
- Read specification files
- pyresttest
- frisby.js
- swagger spec
- other?
- Use as a load tester
- like Locust.io
- distributed
- UI
- Dashboard
- Analytics
- Reports
- Manage multiple instances
- Backend
- master/minions
- db for analytics
- api for UI / clients Goa
- federation of minion groups?
Please comment on any issues or PRs related to these proposals. If you don't see an issue, PR, or idea; definitely add it!
go get -u github.com/verdverm/frisbyFirst create a Frisby object:
// create an object with a given name (used in the report)F:=frisby.Create("Test successful user login"). Get("https://golang.org")Add any pre-flight data
F.SetHeader("Content-Type": "application/json"). SetHeader("Accept", "application/json, text/plain, */*"). SetJson([]string{"item1", "item2", "item3"})There is also a Global object for setting repeated Pre-flight options.
frisby.Global.BasicAuth("username", "password"). SetHeader("Authorization", "Bearer "+TOKEN)Next send the request:
F.Send()Then assert and inspect the response:
F.ExpectStatus(200). ExpectJson("nested.path.to.value", "sometext"). ExpectJson("nested.path.to.object", golangObject). ExpectJson("nested.array.7.id", 23). ExpectJsonLength("nested.array", 8). AfterJson(func(F*frisby.Frisby, json*simplejson.Json, errerror){val, _:=json.Get("proxy").String() frisby.Global.SetProxy(val) })Finally, print out a report of the tests
frisby.Global.PrintReport()Check any error(s), however the global report prints any that occured as well
err := F.Error()
errs:=F.Errors() for_,e:=rangeerrs{fmt.Println("Error: ", e) }Your basic HTTP verbs:
- Get(url string)
- Post(url string)
- Put(url string)
- Patch(url string)
- Delete(url string)
- Head(url string)
- Options(url string)
Functions called before Send()
You can also set theses on the frisby.Global object for persisting state over multiple requests.
( Most of these come from github.com/mozillazg/request)
- BasicAuth(username,password string)
- Proxy(url string)
- SetHeader(key,value string)
- SetHeaders(map[string]string)
- SetCookies(key,value string)
- SetCookiess(map[string]string)
- SetDate(key,value string)
- SetDates(map[string]string)
- SetParam(key,value string)
- SetParams(map[string]string)
- SetJson(interface{})
- SetFile(filename string)
Functions called after Send()
- ExpectStatus(code int)
- ExpectHeader(key, value string)
- ExpectContent(content string)
- ExpectJson(path string, value interface{})
- ExpectJsonLength(path string, length int)
- ExpectJsonType(path string, value_type reflect.Kind)
- AfterContent( func(Frisby,[]byte,error) )
- AfterText( func(Frisby,string,error) )
- AfterJson( func(Frisby,simplejson.Json,error) )
- PauseTest(t time.Duration)
- PrintBody()
- PrintReport()
- PrintGoTestReport()
You can find a longer example here
package main import ( "fmt""reflect""github.com/bitly/go-simplejson""github.com/verdverm/frisby" ) funcmain(){fmt.Println("Frisby!\n") frisby.Create("Test GET Go homepage"). Get("http://golang.org"). Send(). ExpectStatus(200). ExpectContent("The Go Programming Language") frisby.Create("Test GET Go homepage (which fails)"). Get("http://golang.org"). Send(). ExpectStatus(400). ExpectContent("A string which won't be found") frisby.Create("Test POST"). Post("http://httpbin.org/post"). SetData("test_key", "test_value"). Send(). ExpectStatus(200) frisby.Create("Test ExpectJsonType"). Post("http://httpbin.org/post"). Send(). ExpectStatus(200). ExpectJsonType("url", reflect.String) frisby.Create("Test ExpectJson"). Post("http://httpbin.org/post"). Send(). ExpectStatus(200). ExpectJson("url", "http://httpbin.org/post"). ExpectJson("headers.Accept", "*/*") frisby.Create("Test ExpectJsonLength (which fails)"). Post("http://httpbin.org/post"). SetJson([]string{"item1", "item2", "item3"}). Send(). ExpectStatus(200). ExpectJsonLength("json", 4) frisby.Create("Test AfterJson"). Post("http://httpbin.org/post"). Send(). ExpectStatus(200). AfterJson(func(F*frisby.Frisby, json*simplejson.Json, errerror){val, _:=json.Get("url").String() frisby.Global.SetProxy(val) }) frisby.Global.PrintReport() }Sample Output
Frisby! ....... For 7 requests made FAILED [3/13] [Test ExpectJsonLength] - Expect length to be 4, but got 3 [Test GET Go homepage (which fails)] - Expected Status 400, but got 200: "200 OK" - Expected Body to contain "A string which won't be found", but it was missing 