Primeros pasos con Allure OkHttp
Enriquece tus reportes de prueba de Allure Report con información detallada sobre las solicitudes HTTP realizadas mediante OkHttp.
Esta página describe Allure OkHttp 3.0.0 y versiones posteriores, que requieren Java 17 o posterior. Funciona con OkHttp 3, 4 y 5.
Allure OkHttp es compatible con todas las integraciones de Allure basadas en JVM, incluyendo Allure JUnit Jupiter, Allure TestNG, Allure Cucumber-JVM y más.
Para habilitar la integración en tu proyecto:
Asegúrate de tener habilitada la integración de Allure Report para el framework de pruebas que utilizas.
Consulta las instrucciones en la documentación de la integración en Frameworks.
Agrega la integración de Allure OkHttp a las dependencias de tu proyecto.
xml<!-- Define la versión de Allure que deseas usar mediante la propiedad allure.version --> <properties> <allure.version>VERSION</allure.version> </properties> <!-- Agrega allure-bom a la gestión de dependencias para asegurar que se usen las versiones correctas de todas las dependencias --> <dependencyManagement> <dependencies> <dependency> <groupId>io.qameta.allure</groupId> <artifactId>allure-bom</artifactId> <version>${allure.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>io.qameta.allure</groupId> <artifactId>allure-okhttp3</artifactId> <scope>test</scope> </dependency> </dependencies>ktsval allureVersion = "VERSION" dependencies { testImplementation(platform("io.qameta.allure:allure-bom:$allureVersion")) testImplementation("io.qameta.allure:allure-okhttp3") }groovydef allureVersion = "VERSION" dependencies { testImplementation platform("io.qameta.allure:allure-bom:$allureVersion") testImplementation "io.qameta.allure:allure-okhttp3" }Registra una instancia de
AllureOkHttp3como interceptor del cliente OkHttp que usan tus pruebas.El ejemplo siguiente muestra el uso de Allure OkHttp en una prueba de JUnit Jupiter.
javaimport io.qameta.allure.okhttp3.AllureOkHttp3; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; class TestMyWebsite { static OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(new AllureOkHttp3()) .build(); @Test void testSomeRequest() throws Exception { Request request = new Request.Builder() .url("https://jsonplaceholder.typicode.com/todos/1") .build(); try (Response response = client.newCall(request).execute()) { assertEquals(200, response.code()); } } }Ejecuta tus pruebas y genera un reporte de prueba de la forma habitual.
Qué muestra el reporte
Cada solicitud realizada durante una prueba o un fixture, incluidas las realizadas con enqueue(), se agrega a los resultados de prueba como un único adjunto de intercambio HTTP llamado “HTTP exchange”. Contiene:
- el método, la URL, los encabezados y el cuerpo de la solicitud;
- el estado, los encabezados y el cuerpo de la respuesta;
- la hora de inicio y fin de la solicitud;
- los detalles del error, si la solicitud falla, por ejemplo, porque no se puede alcanzar el servidor.
Las solicitudes realizadas mientras no se está ejecutando ninguna prueba o fixture no se agregan al reporte.
En Allure OkHttp 2.x, la solicitud y la respuesta se agregan como dos adjuntos HTML separados.
Eventos enviados por el servidor
Para trabajar con eventos enviados por el servidor, OkHttp proporciona la biblioteca okhttp-sse. Su listener de origen de eventos se ejecuta en los propios hilos de OkHttp, que no saben qué prueba se está ejecutando. Así que, si tu listener agrega pasos o adjuntos, por ejemplo, para cada evento recibido, estos se pierden o pueden terminar en una prueba distinta.
Para mantenerlos en la prueba que abre el origen del evento, crea la fábrica de origen de eventos mediante AllureEventSources.createFactory() en lugar de EventSources.createFactory(). AllureEventSources requiere OkHttp 5 o posterior.
import io.qameta.allure.Allure;
import io.qameta.allure.okhttp3.AllureEventSources;
import io.qameta.allure.okhttp3.AllureOkHttp3;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.sse.EventSource;
import okhttp3.sse.EventSourceListener;
import org.junit.jupiter.api.Test;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
class TestOrderEvents {
static OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new AllureOkHttp3())
.build();
static EventSource.Factory eventSourceFactory = AllureEventSources.createFactory(client);
@Test
void testOrderEvents() throws Exception {
CountDownLatch closed = new CountDownLatch(1);
EventSource eventSource = eventSourceFactory.newEventSource(
new Request.Builder().url("https://example.com/orders/events").build(),
new EventSourceListener() {
@Override
public void onEvent(EventSource source, String id, String type, String data) {
Allure.step("Evento recibido " + type);
Allure.attachment("Evento " + id, data);
}
@Override
public void onClosed(EventSource source) {
closed.countDown();
}
});
closed.await(10, TimeUnit.SECONDS);
eventSource.cancel();
}
}La fábrica recuerda la prueba o fixture en ejecución cada vez que se llama a newEventSource(). Esto significa que puedes crear el cliente y la fábrica una sola vez y compartirlos entre pruebas, como se muestra en el ejemplo anterior.
El adjunto de intercambio HTTP de un origen de eventos contiene los encabezados de la solicitud y la respuesta, pero no los eventos en sí. Para ver los eventos en el reporte, agrégalos desde tu listener, como se muestra arriba.
Configuración
Configurar el adjunto de intercambio HTTP
configureHttpExchange(Consumer<HttpExchange.Builder> exchangeCustomizer)
Usa configureHttpExchange() para controlar qué contiene el adjunto de intercambio HTTP. El método devuelve el interceptor, por lo que puedes llamarlo justo después de new AllureOkHttp3(). Si lo llamas de nuevo, la nueva configuración reemplaza a la anterior.
Los siguientes métodos están disponibles en el builder:
redactHeader(String name)- reemplaza el valor del encabezado de solicitud o respuesta dado con un marcador de posición. El nombre no distingue mayúsculas y minúsculas.redactCookie(String name)- reemplaza el valor de la cookie dada con un marcador de posición. Allure muestra las cookies de los encabezadosCookieySet-Cookiepor separado de los demás encabezados.setMaxBodySize(long maxBodySize)- el número máximo de bytes de un cuerpo de solicitud o respuesta que se conserva. Los cuerpos más largos se truncan y se marcan como truncados en el reporte. El valor predeterminado es 1 MiB.
De forma predeterminada, los valores de los encabezados Authorization y Proxy-Authorization se reemplazan con un marcador de posición.
import io.qameta.allure.okhttp3.AllureOkHttp3;
import okhttp3.OkHttpClient;
static OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new AllureOkHttp3()
.configureHttpExchange(exchange -> exchange
.redactHeader("X-Api-Key")
.redactCookie("SESSION")
.setMaxBodySize(64 * 1024)))
.build();