HTTP Testlari
Kirish
Veb-ilovalarni yaratishda, siz tez-tez HTTP so'rovlaringiz boshidan oxirigacha to'g'ri ishlayotganligini sinab ko'rishingiz kerak bo'ladi. Goravelning test vositalari buni oddiy qiladi - siz murakkab test muhitlarini sozlashsiz so'rovlarni simulyatsiya qilishingiz va javoblarni tekshirishingiz mumkin.
So'rovlar berish
Goravel-da HTTP nuqtalarini test qilish oddiy naqshdan foydalanadi. O'zingizning TestCase dan Http usuli bilan boshlang, u tasdiqlashlar uchun *testing.T parametrini talab qiladi. Bu sizga Get, Post va Put kabi barcha umumiy HTTP fe'llarini boshqaradigan so'rov ob'ektini (framework/contracts/testing.TestRequest) beradi.
Haqiqiy HTTP chaqiruvlarini amalga oshirish o'rniga, bu usullar ilovangizning so'rov tsikli ichki simulyatsiyasini amalga oshiradi. Har bir so'rov natijalarni tekshirish uchun usullarga ega bo'lgan javob ob'ektini (framework/contracts/testing.TestResponse) qaytaradi.
Bu yerda oddiy misol:
func (s *ExampleTestSuite) TestIndex() {
response, err := s.Http(s.T()).Get("/users/1")
s.Nil(err)
response.AssertStatus(200)
}So'rov sarlavhalarini sozlash
So'rov sarlavhalarini sozlash uchun bitta sarlavha uchun WithHeader yoki bir nechta sarlavhalar uchun WithHeaders dan foydalanishingiz mumkin:
func (s *ExampleTestSuite) TestIndex() {
// Bitta sarlavha
response, err := s.Http(s.T()).WithHeader("X-Custom-Header", "Value").Get("/users/1")
// Bir nechta sarlavhalar
response, err := s.Http(s.T()).WithHeaders(map[string]string{
"X-Custom-Header": "Value",
"Accept": "application/json",
}).Get("/users/1")
}Cookie
So'rov berishdan oldin cookie qiymatlarini o'rnatish uchun WithCookie yoki WithCookies usulidan foydalanishingiz mumkin.
import "github.com/goravel/framework/testing/http"
func (s *ExampleTestSuite) TestIndex() {
response, err := s.Http(s.T()).WithCookie(http.Cookie("name", "krishan")).Get("/users/1")
// yoki bir nechta Cookie lar uchun WithCookies dan foydalaning
response, err := s.Http(s.T()).WithCookies(http.Cookies(map[string]string{
"name": "krishan",
"lang": "en",
})).Get("/users/1")
}WithSession
Ma'lumotlarni sessiyaga WithSession usuli yordamida o'rnatishingiz mumkin:
func (s *ExampleTestSuite) TestIndex() {
response, err := s.Http(s.T()).WithSession(map[string]any{"role": "admin"}).Get("/users/1")
}Javoblarni tuzatish
So'rov berilgandan so'ng, so'rovdan qaytarilgan ma'lumotlarni tekshirish uchun Session, Headers, Content, Cookies yoki Json usulidan foydalanishingiz mumkin.
func (s *ExampleTestSuite) TestIndex() {
response, err := s.Http(s.T()).WithSession(map[string]any{"role": "admin"}).Get("/users/1")
content, err := response.Content()
cookies := response.Cookies()
headers := response.Headers()
json, err := response.Json() // javob tanasi json (map[string]any) sifatida tahlil qilinadi
session, err := response.Session() // joriy so'rov sessiyasida saqlangan barcha qiymatlarni qaytaradi
}Tana qurish
Post, Put, Delete va hokazo usullar uchun. Goravel io.Reader ni ikkinchi argument sifatida qabul qiladi. Yuklamalarni qurishni soddalashtirish uchun tizim so'rov tanalarini qurish uchun foydali usullarni taqdim etadi.
import "github.com/goravel/framework/support/http"
func (s *ExampleTestSuite) TestIndex() {
builder := http.NewBody().SetField("name", "krishan")
body, err := builder.Build()
response, err := s.Http(s.T()).WithHeader("Content-Type", body.ContentType()).Post("/users", body)
}JSON API larini test qilish
Goravel JSON API javoblarini samarali test qilish uchun bir nechta yordamchilarni taqdim etadi. U javob tanasini Go map[string]any ga o'tkazishga harakat qiladi. Agar o'tkazish muvaffaqiyatsiz bo'lsa, bog'liq tasdiqlar ham muvaffaqiyatsiz bo'ladi.
func (s *ExampleTestSuite) TestIndex() {
response, err := s.Http(s.T()).WithHeader("Content-Type", body.ContentType()).Post("/users", nil)
s.Nil(err)
response.AssertStatus(201).
AssertJson(map[string]any{
"created": true,
})
}O'tkazilgan JSON ga to'g'ridan-to'g'ri kirish uchun TestResponse dagi Json usulidan foydalaning. Bu sizga javob tanasining alohida elementlarini tekshirish imkonini beradi.
json, err := response.Json()
s.Nil(err)
s.True(json["created"])TIP
AssertJson usuli javobda qo'shimcha maydonlar bo'lsa ham, javobda ko'rsatilgan barcha qiymatlar mavjudligini tekshiradi. AssertExactJson dan foydalanmaguningizcha, u aniq mos kelishni talab qilmaydi.
Aniq JSON mosliklarini tasdiqlash
Agar javobingiz kutilgan JSON bilan aniq mos kelishini (qo'shimcha yoki etishmayotgan maydonlarsiz) tekshirish kerak bo'lsa, AssertExactJson usulidan foydalaning.
func (s *ExampleTestSuite) TestIndex() {
response, err := s.Http(s.T()).WithHeader("Content-Type", body.ContentType()).Post("/users", nil)
s.Nil(err)
response.AssertStatus(201).
AssertExactJson(map[string]any{
"created": true,
})
}Oqimli JSON test qilish
Goravel JSON javoblarida oqimli tasdiqlarni amalga oshirishni osonlashtiradi. AssertFluentJson usulidan foydalangan holda, siz framework/contracts/testing.AssertableJSON ning namunasi bilan ta'minlaydigan yopilishni o'tkazishingiz mumkin. Bu namun sizga so'rovingiz tomonidan qaytarilgan JSON javobidagi aniq qiymatlar yoki shartlarni tekshirish imkonini beradi.
Masalan, JSON javobida ma'lum bir qiymat mavjudligini tasdiqlash uchun Where usulidan, va atribut mavjud emasligiga ishonch hosil qilish uchun Missing usulidan foydalanishingiz mumkin.
import contractstesting "github.com/goravel/framework/contracts/testing"
func (s *ExampleTestSuite) TestIndex() {
response, err := s.Http(s.T()).Get("/users/1")
s.Nil(err)
response.AssertStatus(201).
AssertFluentJson(func (json contractstesting.AssertableJSON) {
json.Where("id", float64(1)).
Where("name", "bowen").
WhereNot("lang", "en").
Missing("password")
})
}Atribut mavjudligi / yo'qligini tasdiqlash
Agar atribut mavjud yoki yo'qligini tekshirishni istasangiz, Goravel buni Has va Missing usullari bilan soddalashtiradi.
response.AssertStatus(201).
AssertFluentJson(func (json contractstesting.AssertableJSON) {
json.Has("username").
Missing("password")
})Shuningdek, bir vaqtning o'zida bir nechta atributlarning mavjudligi yoki yo'qligini HasAll va MissingAll yordamida tasdiqlashingiz mumkin.
response.AssertStatus(201).
AssertFluentJson(func (json contractstesting.AssertableJSON) {
json.Has([]string{"username", "email"}).
MissingAll([]string{"verified", "password"})
})Agar sizga ro'yxatdan kamida bitta atributning mavjudligini tekshirish kerak bo'lsa, HasAny usulidan foydalaning.
response.AssertStatus(201).
AssertFluentJson(func (json contractstesting.AssertableJSON) {
json.HasAny([]string{"username", "email"})
})JSON kollektsiyasi tasdiqlarini qamrab olish
Javobda nomlangan kalit ostida ob'ektlar to'plami mavjud bo'lsa, uning tuzilishi va tarkibini tasdiqlash uchun turli usullardan foydalanishingiz mumkin.
type Item struct {
ID int `json:"id"`
}
facades.Route().Get("/", func(ctx http.Context) http.Response {
items := []Item{
{ID: 1},
{ID: 2},
}
return ctx.Response().Json(200, map[string]{
"items": items,
})
}Kolleksiyadagi elementlar sonini tekshirish uchun Count usulidan foydalanishingiz mumkin. Birinchi elementning xususiyatlarini tasdiqlash uchun AssertableJson namunasi bilan ta'minlaydigan First usulidan foydalaning. Xuddi shunday, Each usuli sizga barcha elementlar ustida aylanish va ularning xususiyatlarini alohida tasdiqlash imkonini beradi. Boshqa tomondan, HasWithScope usuli First va Count funksionalligini birlashtiradi, bu sizga birinchi elementni va uning tarkibini tasdiqlash imkonini beradi, shu bilan birga qamrovli tasdiqlar uchun AssertableJson namunasi bilan ta'minlaydi.
// Count va First
response.AssertStatus(200).
AssertFluentJson(func(json contractstesting.AssertableJSON) {
json.Count("items", 2).
First("items", func(json contractstesting.AssertableJSON) {
json.Where("id", 1)
})
})
// Each
response.AssertStatus(200).
AssertFluentJson(func(json contractstesting.AssertableJSON) {
json.Count("items", 2).
Each("items", func(json contractstesting.AssertableJSON) {
json.Has("id")
})
})
// HasWithScope
response.AssertStatus(200).
AssertFluentJson(func(json contractstesting.AssertableJSON) {
json.HasWithScope("items", 2, func(json contractstesting.AssertableJSON) {
json.Where("id", 1)
})
})Mavjud tasdiqlar
Javob tasdiqlari
AssertAccepted
Javobning 202 Qabul qilindi HTTP holat kodiga ega ekanligini tasdiqlaydi:
response.AssertAccepted()AssertBadRequest
Javobning 400 Noto‘g‘ri so‘rov HTTP holat kodiga ega ekanligini tasdiqlaydi:
response.AssertBadRequest()AssertConflict
Javobning 409 Ziddiyat HTTP holat kodiga ega ekanligini tasdiqlaydi:
response.AssertConflict()AssertCookie
Javobda belgilangan nom va qiymatga ega cookie borligini tasdiqlaydi:
response.AssertCookie("name", "value")AssertCookieExpired
Belgilangan cookie muddati o‘tganligini tasdiqlaydi:
response.AssertCookieExpired("name")AssertCookieMissing
Javobda belgilangan nomga ega cookie yo‘qligini tasdiqlaydi:
response.AssertCookieMissing("name")AssertCookieNotExpired
Belgilangan cookie muddati o‘tmaganligini tasdiqlaydi:
response.AssertCookieNotExpired("name")AssertCreated
Javobning 201 Yaratildi HTTP holat kodiga ega ekanligini tasdiqlaydi:
response.AssertCreated()AssertDontSee
Javobda belgilangan qiymatlar yo‘qligini tasdiqlaydi. Ikkinchi parametr (ixtiyoriy) qiymatlardagi maxsus belgilarni tekshirishdan oldin ekranlash kerakligini aniqlaydi. Agar ko‘rsatilmagan bo‘lsa, standart holatda true ga o‘rnatiladi.
response.AssertDontSee([]string{"<div>"}, false) // Maxsus belgilarni ekranlamangAssertExactJson
Javob JSONi taqdim etilgan map[string]any bilan aniq mos kelishini tasdiqlaydi:
response.AssertExactJson(map[string]any{"created": true})AssertFluentJson
Javob JSONini oqim interfeysi yordamida tasdiqlaydi:
import contractstesting "github.com/goravel/framework/contracts/testing"
response.AssertFluentJson(func(json contractstesting.AssertableJSON) {
json.Where("created", true)
})AssertForbidden
Javobning 403 Taqiqlangan HTTP holat kodiga ega ekanligini tasdiqlaydi:
response.AssertForbidden()AssertFound
Javobning 302 Topildi HTTP holat kodiga ega ekanligini tasdiqlaydi:
response.AssertFound()AssertGone
Javobning 410 Yo‘qolgan HTTP holat kodiga ega ekanligini tasdiqlaydi:
response.AssertGone()AssertHeader
Javobda belgilangan sarlavha berilgan qiymat bilan borligini tasdiqlaydi:
response.AssertHeader("Content-Type", "application/json")AssertHeaderMissing
Javobda belgilangan sarlavha yo‘qligini tasdiqlaydi:
response.AssertHeaderMissing("X-Custom-Header")AssertInternalServerError
Javobning 500 Ichki server xatosi HTTP holat kodiga ega ekanligini tasdiqlaydi:
response.AssertInternalServerError()AssertJson
Javob JSONida taqdim etilgan fragment borligini tasdiqlaydi:
response.AssertJson(map[string]any{"created": true})AssertJsonMissing
Javob JSONida belgilangan kalitlar yoki qiymatlar yo'qligini tasdiqlaydi:
response.AssertJsonMissing(map[string]any{"created": false})AssertMethodNotAllowed
Javobning 405 Method Not Allowed HTTP holat kodiga ega ekanligini tasdiqlaydi:
response.AssertMethodNotAllowed()AssertMovedPermanently
Javobning 301 Moved Permanently HTTP holat kodiga ega ekanligini tasdiqlaydi:
response.AssertMovedPermanently()AssertNoContent
Javobning 204 No Content HTTP holat kodiga ega ekanligini tasdiqlaydi:
response.AssertNoContent()AssertNotAcceptable
Javobning 406 Not Acceptable HTTP holat kodiga ega ekanligini tasdiqlaydi:
response.AssertNotAcceptable()AssertNotFound
Javobning 404 Not Found HTTP holat kodiga ega ekanligini tasdiqlaydi:
response.AssertNotFound()AssertNotModified
Javobning 304 Not Modified HTTP holat kodiga ega ekanligini tasdiqlaydi:
response.AssertNotModified()AssertOk
Javobning 200 OK HTTP holat kodiga ega ekanligini tasdiqlaydi:
response.AssertOk()AssertPartialContent
Javobning 206 Partial Content HTTP holat kodiga ega ekanligini tasdiqlaydi:
response.AssertPartialContent()AssertPaymentRequired
Javobning 402 Payment Required HTTP holat kodiga ega ekanligini tasdiqlaydi:
response.AssertPaymentRequired()AssertRequestTimeout
Javobning 408 Request Timeout HTTP holat kodiga ega ekanligini tasdiqlaydi:
response.AssertRequestTimeout()AssertSee
Javobda belgilangan qiymatlar mavjudligini tasdiqlaydi. Ikkinchi parametr (ixtiyoriy) tekshirishdan oldin qiymatlardagi maxsus belgilarni ekranlash kerakligini aniqlaydi. Agar ko'rsatilmagan bo'lsa, standart holatda true ga o'rnatiladi.
response.AssertSee([]string{"<div>"}, false) // Maxsus belgilarni ekranlamangAssertSeeInOrder
Javobda belgilangan qiymatlar berilgan tartibda mavjudligini tasdiqlaydi. Ikkinchi parametr (ixtiyoriy) tekshirishdan oldin qiymatlardagi maxsus belgilarni ekranlash kerakligini aniqlaydi. Agar ko'rsatilmagan bo'lsa, standart holatda true ga o'rnatiladi.
response.AssertSeeInOrder([]string{"First", "Second"}, false) // Maxsus belgilarni ekranlamangAssertServerError
Javobning server xatosi (>= 500 , < 600) HTTP holat kodiga ega ekanligini tasdiqlaydi:
response.AssertServerError()AssertServiceUnavailable
Javobning 503 Service Unavailable HTTP holat kodiga ega ekanligini tasdiqlaydi:
response.AssertServiceUnavailable()AssertStatus
Javobning belgilangan HTTP holat kodiga ega ekanligini tasdiqlaydi:
response.AssertStatus(200)AssertSuccessful
Javobning muvaffaqiyatli HTTP holat kodiga (2xx) ega ekanligini tasdiqlaydi:
response.AssertSuccessful()AssertTemporaryRedirect
Javobning 307 Temporary Redirect HTTP holat kodiga ega ekanligini tasdiqlaydi:
response.AssertTemporaryRedirect()AssertTooManyRequests
Javobning 429 Too Many Requests HTTP holat kodiga ega ekanligini tasdiqlaydi:
response.AssertTooManyRequests()AssertUnauthorized
Javobning 401 Unauthorized HTTP holat kodiga ega ekanligini tasdiqlaydi:
response.AssertUnauthorized()AssertUnprocessableEntity
Javobning 422 Unprocessable Entity HTTP holat kodiga ega ekanligini tasdiqlaydi:
response.AssertUnprocessableEntity()