Qaf: Automatisation des API à l'aide de QAF

Créé le 29 mars 2017  ·  7Commentaires  ·  Source: qmetry/qaf

Bonjour l'équipe,

Nous essayons de mettre en œuvre l'automatisation de l'API à l'aide de QAF.

Quelqu'un peut-il s'il vous plaît suggérer sur les requêtes ci-dessous?

  1. Syntaxe ou méthode pour GET méthode dans QAF ? Nous ne savons pas quelle méthode sélectionner dans la liste des options GET. Ci-joint la capture d'écran.

Frappé à --> nouveau RestTestBase().getWebResource(getBundle().getString("ws.endurl", url), "/application.json"). * * --> quelle méthode GET utiliser ?

  1. Une fois la réponse reçue, comment extraire le contenu de la réponse JSON et la valider à l'aide de QAF ?

Merci d'avance!!

Salutations,
Prem
capture_webserviceget

help wanted webservice

Commentaire le plus utile

Salut @APrem

Il semble que le client HTTP ne fasse pas confiance au certificat.

Pour cela, vous devez étendre la RestClientFactory avec l'extrait de code d'ici :
https://gist.github.com/outbounder/1069465

votre classe étendue ressemblera donc à ce qui suit et vous pouvez la placer dans n'importe quel package Java :
`paquet;

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

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

la classe publique ClientHelper étend 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());
}

}`

Une fois cela fait, vous devez enregistrer cette classe dans les propriétés de l'application :
rest.client.impl=<Your Package Name>.ClientHelper

Tous les 7 commentaires

Si vous attendez un POJO, vous pouvez fournir cette classe ou une réponse ClientResponse.class String.class ou générique ClientResponse.class

Vous pouvez utiliser ws-support pour les étapes prêtes à l'emploi.

Merci pour la réponse!

En espérant que la partie de code ci-dessous soit utile.
paramètres

Qu'est-ce que ----> Ressource de chaîne
Quoi de ----> Carteparamètres

private static void requestFor (ressource de chaîne, carteparamètres) {

  • WebResource webResource = new RestTestBase().getWebResource(
  • getBundle().getString("ws.endurl", ApplicationProperties.SELENIUM_BASE_URL.getStringVal()), ressource);
  • if (null != params && !params.isEmpty()) {
  • Carte à valeurs multiplesmparams = new MultivaluedMapImpl();


    • for (Clé de chaîne : params.keySet()) {

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

Nous avons essayé avec la partie de code ci-dessous et nous obtenons une exception comme ci-dessous.

Script essayé :

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

Erreur:

javax.net.ssl.SSLHandshakeException : sun.security.validator.ValidatorException : la création du chemin PKIX a échoué :
sun.security.provider.certpath.SunCertPathBuilderException : impossible de trouver un chemin de certification valide vers la cible demandée

Salut @APrem

Il semble que le client HTTP ne fasse pas confiance au certificat.

Pour cela, vous devez étendre la RestClientFactory avec l'extrait de code d'ici :
https://gist.github.com/outbounder/1069465

votre classe étendue ressemblera donc à ce qui suit et vous pouvez la placer dans n'importe quel package Java :
`paquet;

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

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

la classe publique ClientHelper étend 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());
}

}`

Une fois cela fait, vous devez enregistrer cette classe dans les propriétés de l'application :
rest.client.impl=<Your Package Name>.ClientHelper

Salut Prem,
J'espère que le commentaire ci-dessus vous aidera à résoudre votre problème.

Je voudrais vous demander de déplacer la question sur le forum de support de la communauté, comme stackoverflow avec balise QAF ou lié au groupe . Lorsque vous demandez sur stackoverflow, ajoutez la balise qaf pour obtenir une réponse rapide.

Merci,
Chirag

Merci pour la réponse.

Ajout de la classe ClientHelper et maintenant nous pouvions voir la réponse.
Mais l'URL qui est jamais donnée dans .getWebResource(getBundle().getString("ws.endurl", url)); a la clé api. Par conséquent, le symbole du point d'interrogation "?" est là dans l'URL. Ce morceau de code prend le "?" comme "%3F" et l'impression de la console comme ci-dessous.

Attendu : https://sample.url.com/xxxxxxxxxxxxx?apikey=l7xxfc8df89f313944a89e280481e09bb411
Réel : https://sample.url.com/xxxxxxxxxxxxx%3Fapikey=l7xxfc8df89f313944a89e280481e09bb411

En raison de cette conversion, nous obtenons une erreur dans la sortie.

Sortie console :
1 * Demande client sortant
1 >> OBTENIR https://sample.url.com/xxxxxxxxxxxxx%3Fapikey=l7xxfc8df89f313944a89e280481e09bb411
1 * Début de la réception : 87
1 * Reçu : delta : 87 octets : 87
Terminé1 * Terminé
1 * Réponse entrante du client
1 << 401
1 << Serveur : Apache-Coyote/1.1
1 << Contenu-Longueur : 87
1 << Date : ven. 31 mars 2017 14:39:19 GMT
1 << Type de contenu : text/plain;charset=UTF-8
1 <<
{
"les erreurs": [
{
"message": "Apikey invalide",
"code": 4010
}
]
}

J'ai passé l'apikey avec l'objet Header comme ci-dessous et j'ai pu obtenir une réponse.

Générateur de générateur = webResource.getRequestBuilder();
builder.header(apikey, apiValue);
builder.get(ClientResponse.class);

Merci!

Merci @cjayswal @thetechnocrat pour le soutien !!

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

raviguptasmarsh picture raviguptasmarsh  ·  8Commentaires

BChitrakannan picture BChitrakannan  ·  9Commentaires

cjayswal picture cjayswal  ·  17Commentaires

Nandesh7 picture Nandesh7  ·  8Commentaires

Rupak-66 picture Rupak-66  ·  12Commentaires