Qaf: Automação de API usando QAF

Criado em 29 mar. 2017  ·  7Comentários  ·  Fonte: qmetry/qaf

Oi equipe,

Estamos tentando implementar a automação da API usando QAF.

Alguém pode sugerir nas perguntas abaixo?

  1. Sintaxe ou método para método GET em QAF? Não temos certeza de qual método selecionar na lista de opções GET. Em anexo está a imagem.

Atingido em -> new RestTestBase (). GetWebResource (getBundle (). GetString ("ws.endurl", url), "/application.json"). * * -> qual método GET usar?

  1. Assim que recebemos a resposta, como extrair o conteúdo da resposta JSON e validar o mesmo usando QAF?

Desde já, obrigado!!

Cumprimentos,
Prem
capture_webserviceget

help wanted webservice

Comentários muito úteis

Olá @APrem

Parece que o cliente HTTP não está confiando no certificado.

Para isso - você deve estender o RestClientFactory com o trecho de código a partir daqui:
https://gist.github.com/outbounder/1069465

então sua classe estendida terá a aparência abaixo e você pode colocá-la dentro de qualquer um de seu pacote java:
`pacote;

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;

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

public class ClientHelper extends 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());
}

} `

Depois de fazer isso, você deve registrar esta classe dentro das propriedades do aplicativo:
rest.client.impl=<Your Package Name>.ClientHelper

Todos 7 comentários

Se você está esperando qualquer POJO, pode fornecer essa classe ou uma String.class ou uma resposta genérica ClientResponse.class

Você pode usar ws-support para as etapas prontas para uso.

Obrigado pela resposta!

Esperar que a parte do código abaixo seja útil.
params

O que é ----> recurso String
O que é ----> Mapaparams

private static void requestFor (recurso String, Mapparams) {

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


    • for (String key: params.keySet ()) {

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

Tentamos com a parte do código abaixo e estamos obtendo uma exceção conforme mostrado abaixo.

Script experimentado:

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

Erro:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: Falha na construção do caminho PKIX:
sun.security.provider.certpath.SunCertPathBuilderException: não foi possível encontrar o caminho de certificação válido para o destino solicitado

Olá @APrem

Parece que o cliente HTTP não está confiando no certificado.

Para isso - você deve estender o RestClientFactory com o trecho de código a partir daqui:
https://gist.github.com/outbounder/1069465

então sua classe estendida terá a aparência abaixo e você pode colocá-la dentro de qualquer um de seu pacote java:
`pacote;

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;

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

public class ClientHelper extends 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());
}

} `

Depois de fazer isso, você deve registrar esta classe dentro das propriedades do aplicativo:
rest.client.impl=<Your Package Name>.ClientHelper

Oi Prem,
Espero que o comentário acima ajude você a resolver o seu problema.

Gostaria de solicitar que você mova a questão para o fórum de suporte da comunidade, como stackoverflow com tag QAF ou link em grupo . Quando você está perguntando no stackoverflow, adicione a tag qaf para obter uma resposta rápida.

Obrigado,
Chirag

Obrigado pela resposta.

Adicionada a classe ClientHelper e agora podemos ver a resposta.
Mas a URL é fornecida dentro de .getWebResource (getBundle (). GetString ("ws.endurl", url)); é ter a chave da API. Portanto, o símbolo de ponto de interrogação "?" está lá no URL. Este pedaço de código está levando o "?" como "% 3F" e imprimindo a saída do console como abaixo.

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

Por causa dessa conversão, obtemos erro na saída.

Saída do console:
1 * Solicitação de saída do cliente
1 >> GET https://sample.url.com/xxxxxxxxxxxxx%3Fapikey=l7xxfc8df89f313944a89e280481e09bb411
1 * Receber Início: 87
1 * Recebido: delta: 87 bytes: 87
Concluído1 * Concluído
1 * Resposta de entrada do cliente
1 << 401
1 << Servidor: Apache-Coyote / 1.1
1 << Comprimento do conteúdo: 87
1 << Data: Sex, 31 de março de 2017 14:39:19 GMT
1 << Tipo de conteúdo: texto / simples; conjunto de caracteres = UTF-8
1 <<
{
"erros": [
{
"message": "Apikey inválido",
"código": 4010
}
]
}

Eu passei na apikey com o objeto Header conforme abaixo e sou capaz de obter uma resposta.

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

Obrigada!

Obrigado @cjayswal @thetechnocrat pelo apoio !!

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

raviguptasmarsh picture raviguptasmarsh  ·  8Comentários

cjayswal picture cjayswal  ·  17Comentários

Nandesh7 picture Nandesh7  ·  8Comentários

Rupak-66 picture Rupak-66  ·  12Comentários

BChitrakannan picture BChitrakannan  ·  9Comentários