"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como testar servidores HTTP com solicitações ativas no Go?

Como testar servidores HTTP com solicitações ativas no Go?

Publicado em 2024-11-09
Navegar:603

How to Test HTTP Servers with Live Requests in Go?

Testando servidores HTTP com solicitações ao vivo no Go

Manipuladores de teste de unidade isoladamente são essenciais, mas podem ignorar os efeitos do roteamento e de outros middlewares . Para um teste abrangente, considere usar uma abordagem de "servidor ativo". teste do servidor. Ele cria um servidor usando o manipulador fornecido (neste caso, um roteador Gorilla mux). Aqui está um exemplo:

func TestIndex(t *testing.T) { // Cria o servidor usando o roteador inicializado em outro lugar. ts := httptest.NewServer(roteador) adiar ts.Close() newreq := func(método, string de URL, corpo io.Reader) *http.Request { r, err := http.NewRequest(método, url, corpo) se errar! = nulo { t.Fatal(erro) } retornar } testes := []estrutura { sequência de nome r *http.Solicitação }{ //Teste solicitações GET e POST. {nome: "1: testando get", r: newreq("GET", ts.URL "/", nil)}, {nome: "2: postagem de teste", r: newreq("POST", ts.URL "/", nil)}, // argumento do leitor necessário para POST } for _, tt := testes de intervalo { t.Run(tt.nome, func(t *testing.T) { resp, err := http.DefaultClient.Do(tt.r) adiar resp.Body.Close() se errar! = nulo { t.Fatal(erro) } // verifica a resposta esperada aqui. }) } }

Observe que httptest.Server pode ser usado para testar qualquer manipulador que satisfaça a interface http.Handler, não apenas Gorilla mux.

func TestIndex(t *testing.T) {
  // Create server using the router initialized elsewhere.
  ts := httptest.NewServer(router)
  defer ts.Close()

  newreq := func(method, url string, body io.Reader) *http.Request {
    r, err := http.NewRequest(method, url, body)
    if err != nil {
        t.Fatal(err)
    }
    return r
  }

  tests := []struct {
    name string
    r    *http.Request
  }{
    // Test GET and POST requests.
    {name: "1: testing get", r: newreq("GET", ts.URL "/", nil)},
    {name: "2: testing post", r: newreq("POST", ts.URL "/", nil)}, // reader argument required for POST
  }
  for _, tt := range tests {
    t.Run(tt.name, func(t *testing.T) {
        resp, err := http.DefaultClient.Do(tt.r)
        defer resp.Body.Close()
        if err != nil {
            t.Fatal(err)
        }
        // check for expected response here.
    })
  }
}

Embora o teste de servidor ativo forneça um teste mais realista, ele também pode ser mais lento e consumir mais recursos do que o teste de unidade. Considere uma combinação de testes unitários e de integração para uma estratégia de testes abrangente.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3