# Teste A/B

Entregue uma de duas respostas a partir de uma função na rede global da Azion, sorteando o grupo do visitante e registrando a escolha em um cookie. Use esse padrão para executar experimentos randomizados, como comparar duas variantes de página, sem enviar tráfego a uma origem para decidir qual versão exibir.

```js
  function handleRequest(request) {
    const NAME = "TestA/B"
    const TEST_RESPONSE = new Response("Cookie A")
    const CONTROL_RESPONSE = new Response("Cookie B")
  
    const cookie = request.headers.get("cookie")
    if (cookie && cookie.includes(`${NAME}=a`)) {
      return CONTROL_RESPONSE
    }
    else if (cookie && cookie.includes(`${NAME}=b`)) {
      return TEST_RESPONSE
    }
    else {
      const group = Math.random() < 0.5 ? "test" : "control"
      const response = group === "control" ? CONTROL_RESPONSE : TEST_RESPONSE
      response.headers.append("Set-Cookie", `${NAME}=${group}; path=/`)
  
      return response
    }
  }
  
  addEventListener("fetch", event => {
    event.respondWith(handleRequest(event.request))
  })
```

## Como funciona

O handler do evento `fetch` lê o cabeçalho `Cookie` da requisição com `request.headers.get("cookie")`. Quando o cabeçalho contém `TestA/B=a`, a função retorna a resposta de controle e, quando contém `TestA/B=b`, retorna a resposta de teste. Quando nenhum dos dois está presente, `Math.random()` sorteia o grupo de teste ou de controle em aproximadamente 50/50, e `response.headers.append("Set-Cookie", ...)` grava o grupo escolhido no cookie `TestA/B` para que o navegador o envie na requisição seguinte. Em seguida, `event.respondWith()` retorna esse `Response` ao cliente.

## Recursos relacionados

- [Exemplos em JavaScript](/pt-br/documentacao/plataforma/functions/javascript-exemplos.md): Consulte os outros exemplos prontos para uso que você pode copiar para uma função.
- [FetchEvent](/pt-br/documentacao/devtools/runtime/api-reference/fetch-event.md): Referência do evento `fetch` e da requisição que o handler recebe.
- [Response](/pt-br/documentacao/devtools/runtime/api-reference/response.md): Referência do objeto de resposta que este exemplo constrói e no qual define um cookie.
- [Limites de Functions](/pt-br/documentacao/plataforma/functions/limites.md): Os tetos dentro dos quais uma única invocação desta função roda, e os que variam conforme o plano.
- [Primeiros passos](/pt-br/documentacao/plataforma/functions/primeiros-passos.md): O que uma conta precisa antes de uma função rodar, e os passos que colocam uma no caminho de uma requisição.
- [Consulte dados de uso de Functions](/pt-br/documentacao/guias/plataforma/observabilidade/consultar-dados-de-uso-edge-functions-com-graphql.md): Leia de volta o tempo de compute e as invocações que esta função consumiu.
