Compartir tecnología

Automatización (segundo nivel)

2024-07-12

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

Pila de tecnología utilizada para la automatización de la interfaz Java

Resumen de la pila de tecnología:
①Conceptos básicos de Java (encapsulación, reflexión, genéricos, jdbc)
②Análisis del archivo de configuración (propiedades)
③httpclient (enviar solicitud http)
④Datos de proceso Fastjson y jsonpath
⑤Puntos clave del marco de pruebas automatizadas de prueba
⑥ informe de prueba de atractivo

La primera categoría: relacionada con solicitudes http (fastjson, jsonpath, httpclient)

Preparar

Crear proyecto maven

① Primero cree el proyecto maven, newPROJECT–Maven—groupid----finish

Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí

②Verifique la configuración de Maven nuevamente

Archivo—configuraciones—maven
Insertar descripción de la imagen aquí

Fastjson y jsonpath se utilizan para procesar datos.
El enfoque del marco de automatización de pruebas.
informe de prueba de atractivo

1. fastjson (escenario de aplicación: análisis de cadenas json y matrices de cadenas de parámetros de entrada)

fastjson procesa cadenas json y matrices json
Analizar los parámetros de entrada de la cadena json y prepararse para solicitudes posteriores

①Dependencia

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

②Agregue dependencias y las dependencias se generarán automáticamente

Insertar descripción de la imagen aquí
Después de la descarga, puede ver los paquetes de dependencia generados automáticamente.

1.1. Ejemplo (analizar parámetros de entrada de cadena json, parámetros de entrada de matriz de cadena json)

1.1.1. Analizar los parámetros de entrada de la cadena json

Por ejemplo, para iniciar sesión se requiere un nombre de usuario y una contraseña.
{“nombre de usuario”:“qzcsbj”, “contraseña”:“123456”}

Fuente de datos del marco de automatización, los parámetros de entrada son todas cadenas json, es necesario usar fastjson

Paso 1: crear el nombre del paquete, el nombre de la clase y crear el método principal

Insertar descripción de la imagen aquí

Paso 2: defina una variable de cadena, aquí está la cadena json que debe analizarse
Paso 3: para procesar la cadena json, primero analícela en un objeto jsonObject y luego colóquela en el mapa.
1)Primero crea un HashMap, la clave y el valor son ambos String

Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí

2) Aquí se utiliza JSONObjetct.parseObject y el valor de retorno es del tipo JSONObject.

Class.Method, este método es estático

3) Para obtener claves, use el método jsonObjetc.keySet directamente, es decir, obtenga la colección Set

Cada clave de la colección es String.

4) Recorrer nuevamente, obtener el valor a través de la clave atravesada y luego colocar la clave y el valor en el Mapa

Insertar descripción de la imagen aquí

La cadena json definida ahora ha sido analizada y colocada en el mapa.
Insertar descripción de la imagen aquí

5) Verificar el contenido colocado en el Mapa y obtener la clave en el Mapa

Instrucciones para poner el contenido de la cadena json en el mapa
(blog.csdnimg.cn/direct/ae6feeba2eae442f961df977a6c8eac1.jpeg)

1.1.2. Analizar los parámetros de entrada de la matriz de cadenas json

El marco de automatización implica un marco de inicialización y algunos requieren operaciones en los datos internos.Para operar la base de datos, debe escribir sql
Aquí hay una matriz json. En la matriz, cada elemento es una cadena json, que contiene datos de valor clave. El primero es el número de sql, el sql ejecutado real.

[{“sqlNo”:“1”,“sq!”:“seleccione * de los usuarios donde nombre de usuario='qzcsbj';”},.“sqlNo”:“2”,“sql”:“seleccione * de los usuarios donde nombre de usuario='test00501';”}]

Paso 1: crear el nombre del paquete, el nombre de la clase y crear el método principal
Paso 2: defina una variable de cadena, aquí está la matriz de cadenas json que debe analizarse
Método 1 (no recomendable): analizar la cadena JSONObjetct.parseArray (texto de cadena), el valor de retorno es JSONArray
1) Analice la cadena, aquí se usa JSONObjetct.parseArray

Insertar descripción de la imagen aquí

2) Recorrido directo, cada elemento es de tipo Objeto y también se imprimen dos caracteres json.

Insertar descripción de la imagen aquí

3) Imprima el valor sql en la cadena json. Aquí no hay métodos get ni set. Solo puede obtener la cadena json, pero no el contenido de una determinada clave.

Insertar descripción de la imagen aquí
Este método no es aconsejable.

Método 2: JSONObjetct.parseArray (texto de cadena, clase clazz), el valor de retorno es Lista &lt;T&gt;, el tipo de retorno es Lista y el elemento de retorno es HashMap

Pase dos parámetros, el primer parámetro es la cadena que se va a analizar y el segundo parámetro es el archivo de código de bytes.
La solución es: analizar la cadena del primer parámetro en un mapa

1) Encapsule cada elemento en un objeto hashmap. Aquí se utiliza JSONObjetct.parseArray (texto de cadena, clase clazz) para analizar la matriz de cadenas.
2) Obtener sqlNo, sql es del tipo HashMap, puedes usar el método get

Insertar descripción de la imagen aquí

3) Aquí no se obtiene ningún valor o tipo clave. El valor predeterminado es Objeto. Lo que queremos aquí es Cadena, que se puede forzar a convertir. Aquí se utiliza el polimorfismo y la referencia de la clase principal apunta al objeto de la clase secundaria.
4) Es decir, se obtiene el valor correspondiente a cada clave de la cadena json en sql.

Insertar descripción de la imagen aquí

5) Este método es insuficiente: las claves en la cadena json deben mostrarse aquí. Si hay muchas, será problemático.
 String sqlNo = (String)sql.get("sqlNo");
  • 1
Método 3: se utiliza para resolver la deficiencia ⑤ en el Método 2, generalmente usando encapsulación

Encapsule el contenido de cada cadena json en un objeto l, agregue métodos get y set a la clase de entidad y directamente object.get para obtener el contenido de sql. Este tipo de solicitud de código también es más conveniente de escribir. La automatización también hace referencia a esta encapsulación. Eso es encapsular SQL en un objeto,
Encapsule las propiedades como privadas (sqlNo, sql), proporcione métodos get y set, se deben agregar métodos de construcción parametrizados y métodos de construcción sin parámetros, y la reflexión ajustará los métodos de construcción sin parámetros. Si solo escribe parámetros con parámetros y no escribe constructores sin parámetros, definitivamente se informará un error. Para imprimir el resultado de la cadena, debe agregar el método toString (); de lo contrario, se imprimirá la dirección del objeto. Se ha escrito la clase de entidad anterior.

Optimízalo de nuevo
Si el elemento se encapsula en un objeto, se cambia a una clase escrita por usted mismo.clase
Eso es sql.class

1) Defina un javabean sql: la clase sql tiene atributos sqlNo, sql y luego agregue métodos get, set, métodos de construcción y métodos toString()

Insertar descripción de la imagen aquíInsertar descripción de la imagen aquí

2) Encapsule cada cadena json en un objeto sql (Test02), JSONObjetct.parseArray (texto de cadena, clase clazz), el valor de retorno es Lista &lt;T&gt;, el tipo de retorno es Lista y el elemento de retorno es un objeto sql

El segundo método anterior es encapsular cada elemento en un objeto hashMap, y aquí es encapsular cada elemento en un objeto SQL.
Insertar descripción de la imagen aquí

3) atravesar

Obtenga atributos del objeto directamente usando el método get

Insertar descripción de la imagen aquí
Este método es más conveniente y no necesita obtener muchas claves.

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

clase 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 (escenario de aplicación: analizar los datos json de respuesta, como obtener campos de aserción, como el valor asociado que se obtendrá)

Porque actualmente, el proyecto está separado del front-end y del back-end.
El backend generalmente devuelve cadenas json
Si desea hacer afirmaciones, generalmente analiza json. Después del análisis, generalmente solo realiza afirmaciones en campos clave.
Las afirmaciones son generalmente código + campos comerciales clave.
Es una cadena json, por lo que necesitas usar jsonpath

①Dependencia

②Agregue dependencias y las dependencias se generarán automáticamente

blog.csdnimg.cn/5bdd9defd7db47b7a5934f79f9fd0ceb.png)
Insertar descripción de la imagen aquí
Es necesario confirmar si las dependencias se han descargado.

2.1. Ejemplo (obtener los campos comerciales clave que se afirmarán en los datos de respuesta)

2.1.1 Obtener los campos comerciales clave que se afirmarán en los datos de respuesta.
Paso 1: cree un nombre de clase, cree un método principal y defina una variable de cadena

Esta variable aquí es el campo de respuesta devuelto después de iniciar sesión correctamente.
blog.csdnimg.cn/a20e89ee243c43f69a1b4e1c3a97b89b.png)

Paso 2: Para hacer afirmaciones, debe obtener el contenido interno. Se utiliza Configuration.defaultConfiguration.jsonProvider().parse() y el valor de retorno es el tipo de objeto.

Insertar descripción de la imagen aquí
Pasar la respuesta del campo definido

Paso 3: Utilice el método JsonPath.read(Object json, String jsonpath, predicado...filtros), el tipo de retorno es Tipo de objeto

Insertar descripción de la imagen aquí

Automatización de interfaz para procesar datos dependientes.
Obtenga el token del frente de esta línea, que también es $.
Después de obtenerla, si es una variable global, se puede guardar en la variable global.
Si desea obtener la afirmación y luego obtenerla
hacer otra afirmación

3. httpclient (enviar solicitudes escribiendo código)

En el marco de automatización, las solicitudes se envían escribiendo código, lo que significa que es necesario utilizar httpclient, una biblioteca proporcionada por Java para interactuar con el servidor.

①Dependencia

②Agregue dependencias y las dependencias se generarán automáticamente

Insertar descripción de la imagen aquí

3.1. Ejemplo (obtener solicitud, publicar solicitud)

3.1.1. obtener solicitud
Trabajo de preparación: verifique si se pasa la interfaz de solicitud del documento de interfaz swagger. Mire el documento de interfaz para determinar la solicitud de obtención findById y la identificación que se debe pasar.

Necesito pasar identificación
Insertar descripción de la imagen aquí
Desde la biblioteca podemos ver que el id es 259.
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí

Paso 1: cree un nombre de clase Test04 y cree un método principal
Paso 2: definir la URL de la variable de dirección de la interfaz y solicitar los parámetros de los parámetros

Insertar descripción de la imagen aquí
En el archivo de datos, todos los parámetros están concatenados en cadenas json, por lo que id=259 también está concatenado en cadenas json.

Aquí, ponga 259 entre comillas dobles para escapar automáticamente.
Insertar descripción de la imagen aquí

Paso 3: analice la cadena json, use el método JSONObject.parseObject (), el tipo de retorno es tipo JSONObject

Insertar descripción de la imagen aquí

Paso 4: Defina un método estático getRequest (String url, JSONObject jsonobject)

Insertar descripción de la imagen aquí

Paso 5: Luego llame a getRquest() en el método principal. El valor de retorno es de tipo String.

Insertar descripción de la imagen aquí

Paso seis: mejorar la lógica del método getRequest()

obtener solicitud: http://47.108.153.47:18089/qzcsbj/user/findById?id=259
?Parámetros de empalme directo más tarde
También hay varios valores a considerar: http://47.108.153.47:18089/qzcsbj/user/findById?id=259&name=jack

1) Obtenga la clave a través de jsonobetct.keySet() y obtenga una colección Set

Insertar descripción de la imagen aquí

2) Recorre la colección Set y obtén el valor clave

Insertar descripción de la imagen aquí

3) También debe considerar el caso de valores múltiples, es decir, definir flag = true, escribir true primero y ser el primero.

Insertar descripción de la imagen aquí

4) En caso contrario, escribe lo siguiente

Insertar descripción de la imagen aquí

5) Defina una cadena res vacía y devuelva res

Insertar descripción de la imagen aquí
Lo anterior concatenará la URL del parámetro y los parámetros para enviar la solicitud de obtención. Después de la creación, debe crear un objeto de solicitud de obtención.

6) Cree un objeto de solicitud httpget, nuevo HttpGet (org.apache.http.client.methods) seleccione este constructor

Pasa la URL en
Aquí obtienes el objeto de solicitud httpget.
Insertar descripción de la imagen aquí

7) Cree un cliente httpclient, utilizando el método HttpClients.createDefault(), el tipo de retorno es CloseableHttpClient

Insertar descripción de la imagen aquí

La clase abstracta CloseableHttpClient implementa la interfaz HttpClient, Closeable
Insertar descripción de la imagen aquí
Se puede utilizar el polimorfismo y el objeto de la subclase apunta a la referencia de la clase principal (la interfaz implementada por la clase principal)
Insertar descripción de la imagen aquí

8) Ejecute el método de ejecución de solicitud (), pase el objeto httpget y luego genere una excepción

Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí

9) Después de obtener el objeto HttpResponse, puede llamar a su método getEntity para obtener el objeto de respuesta Httpentity. Después de obtener el método EntityUtils.toString, el tipo de retorno es tipo String.

Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí
El resultado res se define arriba
Ahora mismo
Insertar descripción de la imagen aquí

10) correr

Insertar descripción de la imagen aquí

3.1.2. Solicitud de publicación
Trabajo de preparación: verificar si se pasa la interfaz de solicitud del documento de interfaz swagger

Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí

Insertar descripción de la imagen aquí

Paso 1: cree un nombre de clase Test05 y cree un método principal

http://47.108.153.47:18089/qzcsbj/usuario/inicio de sesión
URL, parámetros de parámetros de solicitud, encabezados de solicitud

Insertar descripción de la imagen aquí

Paso 2: definir la URL de la variable de dirección de la interfaz, los parámetros de solicitud y los encabezados de solicitud

Estos parámetros se obtienen de archivos de datos en el marco de automatización.
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí

Paso 3: Analice el párrafo de cadena json y los encabezados utilizando el método JSONObject.parseObject(). El valor de retorno es de tipo JSONObject.
Paso 4: Defina un método para enviar solicitudes de publicación, mejore la lógica y pase el encabezado, la URL y los parámetros.

Definir resolución
devolver resolución

Insertar descripción de la imagen aquí

1) Obtenga la clave a través de jsonobetct.keySet (), obtenga una colección Set, recorra la clave para obtener la clave

Insertar descripción de la imagen aquí

2) Si desea llamar al método addHeader() a través del objeto httppost y el tipo de retorno es HttPost, primero debe crear un objeto httpppost.

Pasar URL
Insertar descripción de la imagen aquí

3) Llame al método addHeader() a través del objeto httppost

Insertar descripción de la imagen aquí

4) Se requiere httpEntity, pero httpEntity es una interfaz. La interfaz no puede crear instancias de objetos. Debe implementar la clase StringEntity para implementar la interfaz httpEntity.

Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí
Si observa el constructor, puede pasar String y especificar el segundo constructor.

Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí
Lo anterior es la solicitud posterior enviada: el encabezado de la solicitud y los datos a enviar están definidos.

5) Cree un cliente httpclient, utilizando el método HttpClients.createDefault(), el tipo de retorno es CloseableHttpClient

El objeto de subclase apunta a la referencia de la clase principal.
Insertar descripción de la imagen aquí

6) Envíe una solicitud, ejecute el método de ejecución de la solicitud (), pase el objeto httppost y luego genere una excepción.

Insertar descripción de la imagen aquí

7)) Después de obtener el objeto HttpResponse, puede llamar a su método getEntity para obtener el objeto de respuesta Httpentity. Después de obtener el método EntityUtils.toString, el tipo de retorno es tipo String.

Insertar descripción de la imagen aquí

8) Llame al método recién definido en el método principal.

Insertar descripción de la imagen aquí

9) correr

Insertar descripción de la imagen aquí