Partage de technologie

Automatisation (deuxième niveau)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Pile technologique utilisée pour l'automatisation de l'interface Java

Résumé de la pile technologique :
①Bases de Java (encapsulation, réflexion, génériques, jdbc)
②Analyse du fichier de configuration (propriétés)
③httpclient (envoyer une requête http)
④Données de processus Fastjson et jsonpath
⑤Points clés du cadre de test automatisé
⑥rapport de test d'attrait

La première catégorie : requêtes http liées (fastjson, jsonpath, httpclient)

Préparer

Créer un projet maven

①Créez d'abord le projet maven, newPROJECT–Maven—groupid----finish

Insérer la description de l'image ici
Insérer la description de l'image ici

②Vérifiez à nouveau la configuration de Maven

Fichier—paramètres—maven
Insérer la description de l'image ici

Fastjson et jsonpath sont tous deux utilisés pour traiter les données.
L'objectif du cadre d'automatisation des tests.
rapport de test d'attrait

1. fastjson (scénario d'application : analyse des chaînes json et des tableaux de chaînes de paramètres d'entrée)

fastjson traite les chaînes json et les tableaux json
Analyser les paramètres d'entrée de la chaîne JSON et préparer les requêtes ultérieures

①Dépendance

<!-https://mvnrepository.com/artifact/com.alibaba/fastjson -->
com.alibaba
Fastison
1.2.75

②Ajouter des dépendances et les dépendances seront automatiquement générées

Insérer la description de l'image ici
Après le téléchargement, vous pouvez voir les packages de dépendances générés automatiquement.

1.1. Exemple (analyser les paramètres d'entrée de la chaîne JSON, les paramètres d'entrée du tableau de chaînes JSON)

1.1.1. Analyser les paramètres d'entrée de la chaîne JSON

Par exemple, la connexion nécessite un nom d'utilisateur et un mot de passe.
{« nom d'utilisateur » : « qzcsbj », « mot de passe » : « 123456 »}

Source de données du framework d'automatisation, les paramètres d'entrée sont tous des chaînes json, fastjson doit être utilisé

Étape 1 : Créez le nom du package, le nom de la classe et créez la méthode principale

Insérer la description de l'image ici

Étape 2 : Définissez une variable chaîne, voici la chaîne json qui doit être analysée
Étape 3 : Pour le traitement de la chaîne json, analysez-la d'abord dans un objet jsonObject, puis placez-la dans la carte
1)Créez d’abord un HashMap, la clé et la valeur sont toutes deux des chaînes de caractères

Insérer la description de l'image ici
Insérer la description de l'image ici

2) Analysez la chaîne JSONObjetct.parseObject est utilisée ici et la valeur de retour est de type JSONObject.

Class.Method, cette méthode est statique

3) Pour obtenir les clés, utilisez directement la méthode jsonObjetc.keySet, c'est-à-dire récupérez la collection Set

Chaque clé de la collection est une chaîne

4) Traversez à nouveau, obtenez la valeur via la clé parcourue, puis placez la clé et la valeur dans la carte

Insérer la description de l'image ici

La chaîne json définie maintenant a été analysée et placée dans la carte
Insérer la description de l'image ici

5) Vérifiez le contenu placé dans la carte et obtenez la clé dans la carte

Instructions pour mettre le contenu de la chaîne json dans la carte
blog.csdnimg.cn/direct/ae6feeba2eae442f961df977a6c8eac1.jpeg)

1.1.2. Analyser les paramètres d'entrée du tableau de chaînes JSON

Le cadre d'automatisation implique un cadre d'initialisation et certains nécessitent des opérations sur les données qu'il contient.Pour faire fonctionner la base de données, vous devez écrire SQL
Voici un tableau json. Dans le tableau, chaque élément est une chaîne json, qui contient des données de valeur clé. La première est le numéro SQL, le SQL réellement exécuté.

[{“sqlNo”:“1”,“sq!”:“select * from users where username='qzcsbj';”},.“sqlNo”:“2”,“sql”:“select * from users where username='test00501';”}]

Étape 1 : Créez le nom du package, le nom de la classe et créez la méthode principale
Étape 2 : Définissez une variable de chaîne, voici le tableau de chaînes json qui doit être analysé
Méthode 1 (déconseillée) : Analysez la chaîne JSONObjetct.parseArray (String text), la valeur de retour est JSONArray
1) Analysez la chaîne, JSONObjetct.parseArray est utilisé ici

Insérer la description de l'image ici

2) Traversée directe, chaque élément est de type Objet et deux caractères json sont également imprimés.

Insérer la description de l'image ici

3) Imprimez la valeur SQL dans la chaîne json. Il n'y a pas de méthodes get ou set ici. Vous ne pouvez obtenir que la chaîne json, mais pas le contenu d'une certaine clé.

Insérer la description de l'image ici
Cette méthode n'est pas conseillée

Méthode 2 : JSONObjetct.parseArray (String text, Class clazz), la valeur de retour est List &lt; T &gt;, le type de retour est List et l'élément de retour est HashMap

Passez deux paramètres, le premier paramètre est la chaîne à analyser et le deuxième paramètre est le fichier de bytecode.
La solution est la suivante : analyser le premier paramètre String dans une carte

1) Encapsulez chaque élément dans un objet hashmap. JSONObjetct.parseArray (String text, Class clazz) est utilisé ici pour analyser le tableau de chaînes.
2) Obtenez sqlNon, sql est un type HashMap, vous pouvez utiliser la méthode get

Insérer la description de l'image ici

3) Aucune valeur ou type de clé n'est obtenu ici. La valeur par défaut est Object. Ce que nous voulons ici, c'est une chaîne, qui peut être forcée à convertir, et la référence de la classe parent pointe vers l'objet de la classe enfant.
4) Autrement dit, la valeur correspondant à chaque clé de la chaîne json dans SQL est obtenue.

Insérer la description de l'image ici

5) Cette méthode est insuffisante : les clés de la chaîne json doivent être affichées ici s'il y en a beaucoup, ce sera gênant.
 String sqlNo = (String)sql.get("sqlNo");
  • 1
Méthode 3 : utilisée pour résoudre la lacune ⑤ de la méthode 2, généralement en utilisant l'encapsulation

Encapsulez le contenu de chaque chaîne json dans un objet l, ajoutez les méthodes get et set à la classe d'entité et directement object.get pour obtenir le contenu du sql. Ce type d'invite de code est également plus pratique à écrire. L'automatisation fait également référence à cette encapsulation. C'est pour encapsuler SQL dans un objet,
Encapsulez les propriétés comme privées (sqlNo, sql), fournissez des méthodes get et set, des méthodes de construction paramétrées et des méthodes de construction sans paramètre doivent être ajoutées, et la réflexion ajustera les méthodes de construction sans paramètre. Si vous écrivez uniquement des paramètres avec des paramètres et n'écrivez pas de constructeurs sans paramètres, une erreur sera certainement signalée. Pour imprimer le résultat de la chaîne, vous devez ajouter la méthode toString(), sinon l'adresse de l'objet sera imprimée. la classe d'entité ci-dessus a été écrite.

Optimisez-le à nouveau
Si l'élément est encapsulé dans un objet, il est remplacé par une classe écrite par vous-même.class
C'est sql.class

1) Définir un javabean sql : la classe sql a les attributs sqlNo, sql, puis ajouter les méthodes get, set, les méthodes de construction et les méthodes toString()

Insérer la description de l'image iciInsérer la description de l'image ici

2) Encapsulez chaque chaîne json dans un objet SQL (Test02), JSONObjetct.parseArray (String text, Class clazz), la valeur de retour est List &lt; T &gt;, le type de retour est List et l'élément de retour est un objet SQL

La deuxième méthode ci-dessus consiste à encapsuler chaque élément dans un objet hashMap, et ici consiste à encapsuler chaque élément dans un objet SQL.
Insérer la description de l'image ici

3) Traversée

Obtenez les attributs de l'objet directement à l'aide de la méthode get

Insérer la description de l'image ici
Cette méthode est plus pratique et ne nécessite pas d’obtenir beaucoup de clés.

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>mavenProject</groupId>
    <artifactId>mavenProject</artifactId>
    <version>1.0-SNAPSHOT</version>


    <dependencies>


        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.75</version>
        </dependency>

    </dependencies>

</project>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

classe SQL

package com.zhou.demo;

public class Sql {
    private String sql;
    private String sqlNo;

    public Sql() {
    }

    public Sql(String sql) {
        this.sql = sql;
    }


    public Sql(String sql, String sqlNo) {
        this.sql = sql;
        this.sqlNo = sqlNo;
    }

    public void setSql(String sql) {
        this.sql = sql;
    }

    public void setSqlNo(String sqlNo) {
        this.sqlNo = sqlNo;
    }

    public String getSql() {
        return sql;
    }

    public String getSqlNo() {
        return sqlNo;
    }

    @Override
    public String toString() {
        return "sql{" +
                "sql='" + sql + ''' +
                ", sqlNo='" + sqlNo + ''' +
                '}';
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
package com.zhou.demo;

import com.alibaba.fastjson.JSONObject;

import java.util.HashMap;
import java.util.Set;
//需求:将json字符串转化成map,字符串:{"username":"qzcsbj", "password":"123456"}

public class Test {
    public static void main(String[] args) {
        String parameters="{"username":"qzcsbj", "password":"123456"}";
        //先解析为JSONObject,然后转换为map
        HashMap<String, String> map = new HashMap<String, String>();

        // 解析json格式字符串为JSONObject(JSONObject是Map接口的一个实现类,和HashMap平级)

        JSONObject jsonObject = JSONObject.parseObject(parameters);
        // 将JSO\\\ NObject转换为map,先获取keys,先将keyset获取,集合里的每一个key都是String,通过遍历的key获取value,再放到map中
        Set<String> keys= jsonObject.keySet();
        for (String key:keys) {
            map.put(key,jsonObject.getString(key));

        }

        //验证,获取Map中的key
        Set<String> keys2 = map.keySet();
        for (String key :keys2) {
            System.out.println(key+"="+map.get(key));
        }

    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
package com.zhou.demo;

import com.alibaba.fastjson.JSONObject;

import java.util.HashMap;
import java.util.List;


//JSON数组,每个元素是json字符串
public class Test02 {

    public static void main(String[] args) {
        String initsql="[n" + "{"sqlNo":"1","sql":"select * from  users where  username='qzcsbj';"},n" +
                "{"sqlNo":"2","sql":"select * from  users where  username='tester00501';"}n" + "n" + "]";
  /*   //元素解析为Map
        List<HashMap> sqls = JSONObject.parseArray(initsql,HashMap.class);
        for (HashMap sql:sqls) {
            System.out.println(sql);
            String sqlNo = (String)sql.get("sqlNo");
            String sql_ = (String)sql.get("sql");
            System.out.println("sqlNo-"+sqlNo+",sql_-"+sql_);
        }*/



  //元素封装到对象
        List<Sql> sqls = JSONObject.parseArray(initsql, Sql.class);

        for (Sql sql:sqls) {
            String sqlNo = sql.getSqlNo();
            String sql_ = sql.getSql();
            System.out.println("sqlNo-"+",sql_"+sql_);

        }

    }


    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

2. jsonpath (scénario d'application : analyse des données json de la réponse, comme l'obtention de champs d'assertion, tels que la valeur associée à obtenir)

Car actuellement, le projet est séparé du front et du back end.
Le backend renvoie généralement des chaînes json
Si vous souhaitez faire des assertions, vous analysez généralement json. Après l'analyse, vous ne faites généralement des assertions que sur les champs clés.
Les assertions sont généralement du code + des champs métier clés
C'est une chaîne json, vous devez donc utiliser jsonpath

①Dépendance

②Ajouter des dépendances et les dépendances seront automatiquement générées

blog.csdnimg.cn/5bdd9defd7db47b7a5934f79f9fd0ceb.png)
Insérer la description de l'image ici
Besoin de confirmer si les dépendances ont été téléchargées

2.1. Exemple (obtenir les champs métier clés à affirmer dans les données de réponse)

2.1.1. Obtenir les champs métiers clés à affirmer dans les données de réponse
Étape 1 : Créez un nom de classe, créez une méthode principale et définissez une variable de chaîne

Cette variable ici est le champ de réponse renvoyé après une connexion réussie.
blog.csdnimg.cn/a20e89ee243c43f69a1b4e1c3a97b89b.png)

Étape 2 : Pour faire des assertions, vous devez obtenir le contenu à l'intérieur. Configuration.defaultConfiguration.jsonProvider().parse() est utilisé et la valeur de retour est de type Object.

Insérer la description de l'image ici
Passer la réponse dans le champ défini

Étape 3 : Utilisez la méthode JsonPath.read(Object json, String jsonpath, predicate...filters), le type de retour est de type Object

Insérer la description de l'image ici

Automatisation de l'interface pour le traitement des données dépendantes
Obtenez le jeton au début de cette ligne, qui vaut également $.
Après l'avoir obtenue, s'il s'agit d'une variable globale, elle peut être enregistrée dans la variable globale.
Si vous voulez obtenir l'affirmation, puis l'obtenir
Faire une autre affirmation

3. httpclient (envoyer des requêtes en écrivant du code)

Dans le framework d'automatisation, les requêtes sont envoyées en écrivant du code, ce qui signifie que vous devez utiliser httpclient, une bibliothèque fournie par Java pour interagir avec le serveur.

①Dépendance

②Ajouter des dépendances et les dépendances seront automatiquement générées

Insérer la description de l'image ici

3.1. Exemple (obtenir une demande, publier une demande)

3.1.1. obtenir la demande
Travail de préparation : vérifiez si l'interface de requête du document d'interface swagger est transmise. Consultez le document d'interface pour déterminer la requête d'obtention findById et l'identifiant qui doit être transmis.

Besoin de transmettre une pièce d'identité
Insérer la description de l'image ici
Depuis la bibliothèque, nous pouvons voir que l'identifiant est 259
Insérer la description de l'image ici
Insérer la description de l'image ici
Insérer la description de l'image ici

Étape 1 : Créez un nom de classe Test04 et créez une méthode principale
Étape 2 : Définir l'url de la variable d'adresse de l'interface et les paramètres de requête

Insérer la description de l'image ici
Dans le fichier de données, les paramètres sont tous concaténés en chaînes json, donc id=259 est également concaténé en chaînes json.

Ici, mettez 259 entre guillemets doubles pour y échapper automatiquement.
Insérer la description de l'image ici

Étape 3 : analysez la chaîne json, utilisez la méthode JSONObject.parseObject(), le type de retour est de type JSONObject

Insérer la description de l'image ici

Étape 4 : Définir une méthode statique getRequest(String url, JSONObject jsonobject)

Insérer la description de l'image ici

Étape 5 : Appelez ensuite getRquest() dans la méthode principale. La valeur de retour est de type String.

Insérer la description de l'image ici

Sixième étape : améliorer la logique de la méthode getRequest()

obtenir la demande : http://47.108.153.47:18089/qzcsbj/user/findById?id=259
?Épisser directement les paramètres plus tard
Il existe également plusieurs valeurs à prendre en compte : http://47.108.153.47:18089/qzcsbj/user/findById?id=259&name=jack

1) Obtenez la clé via jsonobetct.keySet() et obtenez une collection Set

Insérer la description de l'image ici

2) Parcourez la collection Set et obtenez la valeur clé

Insérer la description de l'image ici

3) Vous devez également considérer le cas de valeurs multiples, c'est-à-dire définir flag = true, écrire true en premier et être le premier

Insérer la description de l'image ici

4) Sinon, écrivez ce qui suit

Insérer la description de l'image ici

5) Définir une chaîne res vide et renvoyer res

Insérer la description de l'image ici
Ce qui précède concatènera l'URL du paramètre et les paramètres d'envoi de la demande d'obtention. Après la création, vous devez créer un objet de demande d'obtention.

6) Créez un objet de requête httpget, nouveau HttpGet (org.apache.http.client.methods) sélectionnez ce constructeur

Passez l'url
Ici, vous obtenez l'objet de requête httpget
Insérer la description de l'image ici

7) Créez un client httpclient, en utilisant la méthode HttpClients.createDefault(), le type de retour est CloseableHttpClient

Insérer la description de l'image ici

La classe abstraite CloseableHttpClient implémente l'interface HttpClient, Closeable
Insérer la description de l'image ici
Le polymorphisme peut être utilisé et l'objet de sous-classe pointe vers la référence de classe parent (l'interface implémentée par la classe parent)
Insérer la description de l'image ici

8) Exécutez la méthode request execute(), transmettez l'objet httpget, puis lancez une exception

Insérer la description de l'image ici
Insérer la description de l'image ici

9) Après avoir obtenu l'objet HttpResponse, vous pouvez appeler sa méthode getEntity pour obtenir l'objet de réponse Httpentity. Après avoir obtenu la méthode EntityUtils.toString, le type de retour est de type String.

Insérer la description de l'image ici
Insérer la description de l'image ici
Le résultat res est défini ci-dessus
Tout de suite
Insérer la description de l'image ici

10) Courir

Insérer la description de l'image ici

3.1.2. Publier une demande
Travail de préparation : vérifier si l'interface de requête du document d'interface swagger est transmise

Insérer la description de l'image ici
Insérer la description de l'image ici

Insérer la description de l'image ici

Étape 1 : Créez un nom de classe Test05 et créez une méthode principale

http://47.108.153.47:18089/qzcsbj/user/login
URL, paramètres des paramètres de la requête, en-têtes de la requête

Insérer la description de l'image ici

Étape 2 : Définissez l'URL de la variable d'adresse de l'interface, les paramètres de requête et les en-têtes de requête

Ces paramètres sont obtenus à partir de fichiers de données dans le cadre d'automatisation.
Insérer la description de l'image ici
Insérer la description de l'image ici

Étape 3 : Analysez le para de la chaîne json et les en-têtes à l'aide de la méthode JSONObject.parseObject(). La valeur de retour est de type JSONObject.
Étape 4 : Définissez une méthode d'envoi des demandes de publication, améliorez la logique et transmettez l'en-tête, l'URL et les paramètres.

Définir la résolution
retour res

Insérer la description de l'image ici

1) Obtenez la clé via jsonobetct.keySet(), obtenez une collection Set, parcourez la clé pour obtenir la clé

Insérer la description de l'image ici

2) Si vous souhaitez appeler la méthode addHeader() via l'objet httppost et que le type de retour est HttPost, vous devez d'abord créer un objet httpppost.

URL de passage
Insérer la description de l'image ici

3) Appelez la méthode addHeader() via l'objet httppost

Insérer la description de l'image ici

4) httpEntity est requis, mais httpEntity est une interface L'interface ne peut pas instancier des objets. Vous devez implémenter la classe StringEntity pour implémenter l'interface httpEntity.

Insérer la description de l'image ici
Insérer la description de l'image ici
Si vous regardez le constructeur, vous pouvez passer String et spécifier le deuxième constructeur.

Insérer la description de l'image ici
Insérer la description de l'image ici
Ce qui précède est la requête de publication envoyée : l'en-tête de la requête et les données à envoyer sont tous définis.

5) Créez un client httpclient, en utilisant la méthode HttpClients.createDefault(), le type de retour est CloseableHttpClient

L'objet de sous-classe pointe vers la référence de classe parent
Insérer la description de l'image ici

6) Envoyez une requête, exécutez la méthode requestexecute(), transmettez l'objet httppost, puis lancez une exception.

Insérer la description de l'image ici

7)) Après avoir obtenu l'objet HttpResponse, vous pouvez appeler sa méthode getEntity pour obtenir l'objet de réponse Httpentity. Après avoir obtenu la méthode EntityUtils.toString, le type de retour est de type String.

Insérer la description de l'image ici

8) Appelez la méthode qui vient d'être définie dans la méthode principale

Insérer la description de l'image ici

9) Courir

Insérer la description de l'image ici