Qaf: Automatización de API usando QAF

Creado en 29 mar. 2017  ·  7Comentarios  ·  Fuente: qmetry/qaf

Hola, equipo,

Estamos intentando implementar la automatización de API usando QAF.

¿Alguien puede sugerir sobre las siguientes consultas?

  1. ¿Sintaxis o método para obtener el método en QAF? No estamos seguros de qué método seleccionar de la lista de opciones GET. Se adjunta la captura de pantalla.

Vaya a -> new RestTestBase (). GetWebResource (getBundle (). GetString ("ws.endurl", url), "/application.json"). * * -> ¿Qué método GET usar?

  1. Una vez que recibimos la respuesta, ¿cómo extraer el contenido de la respuesta JSON y validarlo usando QAF?

¡¡Gracias por adelantado!!

Saludos,
Prem
capture_webserviceget

help wanted webservice

Comentario más útil

Hola @APrem

Parece que el cliente HTTP no confía en el certificado.

Para esto, debe extender RestClientFactory con el fragmento de código desde aquí:
https://gist.github.com/outbounder/1069465

por lo que su clase extendida se verá como se muestra a continuación y puede colocar esto dentro de cualquiera de sus paquetes java:
`paquete;

import com.qmetry.qaf.automation.ws.rest.RestClientFactory;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.client.urlconnection.HTTPSProperties;

importar javax.net.ssl. *;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

ClientHelper de clase pública extiende RestClientFactory {

public static ClientConfig configureClient() {
    TrustManager[ ] certs = new TrustManager[ ] {
            new X509TrustManager() {
                <strong i="24">@Override</strong>
                public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }
                <strong i="25">@Override</strong>
                public void checkServerTrusted(X509Certificate[] chain, String authType)
                        throws CertificateException {
                }
                <strong i="26">@Override</strong>
                public void checkClientTrusted(X509Certificate[] chain, String authType)
                        throws CertificateException {
                }
            }
    };
    SSLContext ctx = null;
    try {
        ctx = SSLContext.getInstance("TLS");
        ctx.init(null, certs, new SecureRandom());
    } catch (java.security.GeneralSecurityException ex) {
    }
    HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory());

    ClientConfig config = new DefaultClientConfig();
    try {
        config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, new HTTPSProperties(
                new HostnameVerifier() {
                    <strong i="27">@Override</strong>
                    public boolean verify(String hostname, SSLSession session) {
                        return true;
                    }
                },
                ctx
        ));
    } catch(Exception e) {
    }
    return config;
}

<strong i="28">@Override</strong>
protected  Client createClient() {
    return Client.create(ClientHelper.configureClient());
}

} `

Una vez que hagas esto, debes registrar esta clase dentro de las propiedades de la aplicación:
rest.client.impl=<Your Package Name>.ClientHelper

Todos 7 comentarios

Si está esperando algún POJO, puede proporcionar esa clase o una String.class o una respuesta genérica ClientResponse.class

Puede utilizar ws-support para conocer los pasos listos para usar.

¡Gracias por la respuesta!

Espero que la parte del código a continuación sea útil.
params

¿Qué es ----> Recurso de cadena
¿Qué es ----> Mapaparams

solicitud de vacío estática privada para (recurso de cadena, mapaparams) {

  • WebResource webResource = new RestTestBase (). GetWebResource (
  • getBundle (). getString ("ws.endurl", ApplicationProperties.SELENIUM_BASE_URL.getStringVal ()), recurso);
  • if (null! = params &&! params.isEmpty ()) {
  • Mapa multivalormparams = new MultivaluedMapImpl ();


    • para (clave de cadena: params.keySet ()) {

  • mparams.add (clave, params.get (clave));
  • }
  • webResource = webResource.queryParams (mparams);
  • }
  • webResource.get (ClientResponse.class);
  • }

Intentamos con la parte de código a continuación y obtenemos una excepción como se muestra a continuación.

Probado guión:

    WebResource webResource = new RestTestBase().getWebResource(getBundle().getString("ws.endurl", url));
    webResource.get(ClientResponse.class);

Error:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: Error en la construcción de la ruta PKIX:
sun.security.provider.certpath.SunCertPathBuilderException: no se puede encontrar una ruta de certificación válida para el objetivo solicitado

Hola @APrem

Parece que el cliente HTTP no confía en el certificado.

Para esto, debe extender RestClientFactory con el fragmento de código desde aquí:
https://gist.github.com/outbounder/1069465

por lo que su clase extendida se verá como se muestra a continuación y puede colocar esto dentro de cualquiera de sus paquetes java:
`paquete;

import com.qmetry.qaf.automation.ws.rest.RestClientFactory;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.client.urlconnection.HTTPSProperties;

importar javax.net.ssl. *;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

ClientHelper de clase pública extiende RestClientFactory {

public static ClientConfig configureClient() {
    TrustManager[ ] certs = new TrustManager[ ] {
            new X509TrustManager() {
                <strong i="24">@Override</strong>
                public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }
                <strong i="25">@Override</strong>
                public void checkServerTrusted(X509Certificate[] chain, String authType)
                        throws CertificateException {
                }
                <strong i="26">@Override</strong>
                public void checkClientTrusted(X509Certificate[] chain, String authType)
                        throws CertificateException {
                }
            }
    };
    SSLContext ctx = null;
    try {
        ctx = SSLContext.getInstance("TLS");
        ctx.init(null, certs, new SecureRandom());
    } catch (java.security.GeneralSecurityException ex) {
    }
    HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory());

    ClientConfig config = new DefaultClientConfig();
    try {
        config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, new HTTPSProperties(
                new HostnameVerifier() {
                    <strong i="27">@Override</strong>
                    public boolean verify(String hostname, SSLSession session) {
                        return true;
                    }
                },
                ctx
        ));
    } catch(Exception e) {
    }
    return config;
}

<strong i="28">@Override</strong>
protected  Client createClient() {
    return Client.create(ClientHelper.configureClient());
}

} `

Una vez que hagas esto, debes registrar esta clase dentro de las propiedades de la aplicación:
rest.client.impl=<Your Package Name>.ClientHelper

Hola Prem,
Espero que el comentario anterior te ayude a resolver tu problema.

Me gustaría solicitarle que mueva la pregunta al foro de soporte de la comunidad como stackoverflow con etiqueta QAF o vinculado en grupo . Cuando pregunte en stackoverflow, agregue la etiqueta qaf para obtener una respuesta rápida.

Gracias,
Chirag

Gracias por la respuesta.

Se agregó la clase ClientHelper y ahora pudimos ver la respuesta.
Pero la URL que se da dentro de .getWebResource (getBundle (). GetString ("ws.endurl", url)); está teniendo la clave api. Por lo tanto, el símbolo de signo de interrogación "?" está en la URL. Este fragmento de código está tomando el "?" como "% 3F" e imprimiendo la consola como se muestra a continuación.

Esperado: https://sample.url.com/xxxxxxxxxxxxx?apikey=l7xxfc8df89f313944a89e280481e09bb411
Actual: https://sample.url.com/xxxxxxxxxxxxx%3Fapikey=l7xxfc8df89f313944a89e280481e09bb411

Debido a esta conversión, obtenemos un error en la salida.

Salida de consola:
1 * solicitud de salida del cliente
1 >> OBTENGA https://sample.url.com/xxxxxxxxxxxxx%3Fapikey=l7xxfc8df89f313944a89e280481e09bb411
1 * Inicio de recepción: 87
1 * Recibido: delta: 87 bytes: 87
Terminado1 * Terminado
1 * respuesta del cliente entrante
1 << 401
1 << Servidor: Apache-Coyote / 1.1
1 << Contenido-Longitud: 87
1 << Fecha: vie, 31 de marzo de 2017 14:39:19 GMT
1 << Tipo de contenido: texto / sin formato; juego de caracteres = UTF-8
1 <<
{
"errores": [
{
"message": "Apikey no válido",
"código": 4010
}
]
}

Pasé el apikey con el objeto Header como se muestra a continuación y pude obtener una respuesta.

Constructor constructor = webResource.getRequestBuilder ();
constructor.header (apikey, apiValue);
builder.get (ClientResponse.class);

¡Gracias!

¡Gracias @cjayswal @thetechnocrat por el apoyo!

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

cjayswal picture cjayswal  ·  17Comentarios

raviguptasmarsh picture raviguptasmarsh  ·  8Comentarios

BChitrakannan picture BChitrakannan  ·  9Comentarios

Nandesh7 picture Nandesh7  ·  8Comentarios

Rupak-66 picture Rupak-66  ·  12Comentarios