Qaf: API-Automatisierung mit QAF

Erstellt am 29. März 2017  ·  7Kommentare  ·  Quelle: qmetry/qaf

Hallo Team,

Wir versuchen, die API-Automatisierung mit QAF zu implementieren.

Kann jemand bitte zu den folgenden Fragen Vorschläge machen?

  1. Syntax oder Methode zur GET-Methode in QAF? Wir sind uns nicht sicher, welche Methode wir aus der Liste der GET-Optionen auswählen sollen. Anbei der Screenshot.

Getroffen bei --> new RestTestBase().getWebResource(getBundle().getString("ws.endurl", url), "/application.json"). * * --> Welche GET-Methode soll verwendet werden?

  1. Wie kann man nach Erhalt der Antwort den Inhalt aus der JSON-Antwort extrahieren und mit QAF validieren?

Danke im Voraus!!

Grüße,
Prem
capture_webserviceget

help wanted webservice

Hilfreichster Kommentar

Hallo @APrem

Dies sieht so aus, als ob der HTTP-Client dem Zertifikat nicht vertraut.

Dazu müssen Sie die RestClientFactory mit dem Code-Snippet von hier erweitern:
https://gist.github.com/outbounder/1069465

Ihre erweiterte Klasse sieht also wie folgt aus und Sie können dies in jedes Ihrer Java-Pakete einfügen:
`Paket;

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

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

öffentliche Klasse ClientHelper erweitert 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());
}

}`

Sobald Sie dies tun, müssen Sie diese Klasse in den Anwendungseigenschaften registrieren:
rest.client.impl=<Your Package Name>.ClientHelper

Alle 7 Kommentare

Wenn Sie ein POJO erwarten, können Sie diese Klasse oder eine String.class oder generische Antwort ClientResponse.class

Sie können ws-support für gebrauchsfertige Schritte verwenden.

Danke für die Antwort!

Ich hoffe, dass der folgende Teil des Codes hilfreich ist.
Parameter

Was ist ----> String-Ressource
Was ist ---->KarteParameter

private statische void requestFor(String-Ressource, MapParameter) {

  • WebResource webResource = new RestTestBase().getWebResource(
  • getBundle().getString("ws.endurl", ApplicationProperties.SELENIUM_BASE_URL.getStringVal()), Ressource);
  • if (null != params && !params.isEmpty()) {
  • Mehrwertige Kartemparams = new MultivaluedMapImpl();


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

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

Wir haben es mit dem folgenden Teil des Codes versucht und erhalten eine Ausnahme wie unten.

Skript ausprobiert:

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

Fehler:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX-Pfaderstellung fehlgeschlagen:
sun.security.provider.certpath.SunCertPathBuilderException: kein gültiger Zertifizierungspfad zum angeforderten Ziel gefunden

Hallo @APrem

Dies sieht so aus, als ob der HTTP-Client dem Zertifikat nicht vertraut.

Dazu müssen Sie die RestClientFactory mit dem Code-Snippet von hier erweitern:
https://gist.github.com/outbounder/1069465

Ihre erweiterte Klasse sieht also wie folgt aus und Sie können dies in jedes Ihrer Java-Pakete einfügen:
`Paket;

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

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

öffentliche Klasse ClientHelper erweitert 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());
}

}`

Sobald Sie dies tun, müssen Sie diese Klasse in den Anwendungseigenschaften registrieren:
rest.client.impl=<Your Package Name>.ClientHelper

Hallo Prem,
Ich hoffe, der obige Kommentar wird Ihnen helfen, Ihr Problem zu lösen.

Ich möchte Sie bitten, die Frage in ein Community-Support-Forum wie Stackoverflow mit QAF-Tag oder in Gruppe verlinkt zu verschieben . Wenn Sie nach Stackoverflow fragen, fügen Sie das Tag qaf , um eine schnelle Antwort zu erhalten.

Vielen Dank,
Chirag

Danke für die Antwort.

ClientHelper-Klasse hinzugefügt und jetzt konnten wir die Antwort sehen.
Aber die URL, die immer in .getWebResource(getBundle().getString("ws.endurl", url)) angegeben ist; hat den API-Schlüssel. Daher ist das Fragezeichensymbol "?" steht in der URL. Dieses Stück Code nimmt das "?" als "%3F" und Drucken der Konsolenausgabe wie unten beschrieben.

Erwartet: https://sample.url.com/xxxxxxxxxxxxx?apikey=l7xxfc8df89f313944a89e280481e09bb411
Aktuell: https://sample.url.com/xxxxxxxxxxxxx%3Fapikey=l7xxfc8df89f313944a89e280481e09bb411

Aufgrund dieser Konvertierung erhalten wir einen Ausgabefehler.

Konsolenausgabe:
1 * ausgehende Client-Anfrage
1 >> GET https://sample.url.com/xxxxxxxxxxxxx%3Fapikey=l7xxfc8df89f313944a89e280481e09bb411
1 * Empfangsstart: 87
1 * Empfangen: Delta: 87 Byte: 87
Fertig1 * Fertig
1 * Eingehende Antwort des Kunden
1 << 401
1 << Server: Apache-Coyote/1.1
1 << Inhalt-Länge: 87
1 << Datum: Fr, 31 Mär 2017 14:39:19 GMT
1 << Inhaltstyp: text/plain;charset=UTF-8
1 <<
{
"Fehler": [
{
"message": "Ungültiger APIkey",
"code": 4010
}
]
}

Ich habe den apikey mit dem Header-Objekt wie unten beschrieben übergeben und kann eine Antwort erhalten.

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

Danke schön!

Danke @cjayswal @thetechnocrat für die Unterstützung !!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

raviguptasmarsh picture raviguptasmarsh  ·  8Kommentare

Rupak-66 picture Rupak-66  ·  12Kommentare

BChitrakannan picture BChitrakannan  ·  9Kommentare

cjayswal picture cjayswal  ·  17Kommentare

Nandesh7 picture Nandesh7  ·  8Kommentare