Versiones comparadas

Clave

  • Se ha añadido esta línea.
  • Se ha eliminado esta línea.
  • El formato se ha cambiado.

PROYECTO CON API DE TRELLO:

https://developer.atlassian.com/cloud/trello/guides/rest-api/api-introduction/

https://developer.atlassian.com/cloud/trello/rest/api-group-boards/

1. INTRODUCCIÓN al API

...

Qué es una URL:

Las direcciones Web o «URLs» (Uniform Resource Locator) son la base de Internet y una forma sencilla de identificar y encontrar cualquier cosa que buscamos en la red como páginas web, fotos y videos.

...

  • En la barra de direcciones que está en la parte superior del navegador y sirve para escribir una dirección conocida.

  • En los enlaces o links que están en todas las páginas web y al pulsarlos sirven para saltar de una página web a otra, es lo que llamamos «navegar por internet».

Estructura de una URL o Dirección Web

Una dirección web está compuesta por varias partes que en su conjunto sirven para identificar y localizar cada página web, imágen o vídeo de Internet.

...

  • Extensión -o dominio de nivel superior (TLD)- Es la primera división que se hizo en Internet. Crearon divisiones genéricas com, net, org y una extensión para cada país del mundo: es, co, us, etc.
    Recientemente han aparecido nuevas extensiones blog, tienda, web y muchas más debido a los pocos dominios libres que hay con las extensiones más comunes.

     

Mirando a la parte izquierda de la extensión (del .com)

La parte izquierda de la extensión sirve para localizar el servidor web que alberga el contenido que queremos ver.

  • Dominio - Es el nombre de tu sitio. Está a la izquierda de la extensión y están separados entre sí por un punto.
    Cualquier persona o empresa puede registrar un dominio con una extensión (.com, .es,…) y por un tiempo (un año, dos años, cinco años o 10 años).
    Luego, como propietario del dominio puede crear una página web o cuentas de correo electrónico.

     

  • Subdominio - Un dominio también puede dividirse en subdominios.
    Es algo opcional y crear subdominios es la técnica habitual para crear varias páginas web dentro del mismo dominio.
    El subdominio más famoso es www pero hay más como blog, tienda o mail.

     

A la derecha de la extensión

La zona derecha de la extensión sirve para localizar la página web, la imagen o el vídeo perteneciente al dominio. Está organizado del mismo modo que los ficheros del ordenador, es decir en directorios y ficheros.

  • Carpeta o subcarpeta- Es opcional y es el directorio o carpeta dentro del servidor dónde está el recurso.

     

  • Página o recurso - Es la página web, imagen o video que pertenece al dominio y que queremos ver.

     

  • Parámetros - Son opcionales. Al final de una URL pueden aparecer parámetros que sirven a los programadores para incluir información adicional que utilizan las páginas web para enviar información a los servidores, de forma que es posible dar ordenes o añadir la información de un formulario. Los parámetros están formados por una clave y su valor (clave=valor) y están separados del resto de los elementos de la URL por el caracter ?.

2. INTRODUCCIÓN a POSTMAN (INSTALACIÓN)

  • INSTALACIÓN:

...

  • Utilidades de Postman:

...

 

2. AUTHORIZATION - SETUP DEL SUT

  • Como todo software, todo tiene su workflow y su manera de acceder, unas más comunes que otras, pero la realidad es que SIEMPRE debe haber una documentación al respecto.

    • En este Curso se utilizará el SUT: “Trello”,
      el SW issue management especializado en metodología Kanban.

      • En este se realizarán todas las prácticas de Testing real como en el laburo.

PRECONDICIONES PARA INICIAR:
Aquí se encuentra toda la Documentación API de Trello para Postman:

Info

Authentication and Authorization - API KEY

Trello uses a delegated authentication and authorization flow so that your application never has to deal with storing or handling usernames or passwords. Instead, your application passes control to Trello (identifying itself via the API key) and once Trello has allowed the user to choose an account and sign in, Trello will hand the user and control back to your application, along with an API Token.

To get started, you’ll need an API key. You can get your API key by logging into Trello and visiting https://trello.com/app-key. Be sure to read and agree to Trello Developer Terms of Service. Your API key will be clearly labeled at the top of that page.

...

Info

Your users will always see this screen when granting your application access. The permissions, duration of access, and application name displayed are all configured via the URL parameters. More on that at Authorization. But we'll leave everything as is, and click "Allow".

Once you click Allowyou'll grant your own app (identified via your API key) access to your account and be redirected to a page that contains the API token.

This token, along with your API key, can be used to read and write for your entire Trello account. Tokens should be kept secret!

3. HTTP REQUESTS

  • COMPONENTES DEL REQUEST

    • ADDRESS (URL)

    • REQUEST METHOD (GET, POST, PUT, DELETE, etc.)

    • PARAMETERS (Variables Key-Valor)

    • AUTHORIZATION (Tipos de Token para autenticar el Request)

    • HEADERS (API-key, Token, etc…)

    • BODY (Para hacer POST, PUT, UPDATE, etc.)

    • TESTS (Scripts para Validar los comportamientos del Request)

  • COMPONENTES DEL RESPONSE

    • STATUS CODE:

    • HEADERS (Respuesta del Header)

    • COOKIES (Respuesta de Cookies)

    • BODY (Puede ser en lenguaje JSON, como la mayoría actualmente, u otras como XML, HTML, etc)

4. VARIABLES DE SCOPES - usando esta Sintaxis: “{{}}”

Las Variables tienen algo llamado “SCOPES”
Son los siguientes: (se mostrarán con un ejemplo de ESQUEMA DE JERARQUÍA:

...

  • EN LOS SCRIPTS, SE USA ESTA QUERY PARA OBTENER EL SCOPE APROPIADO DEL REQUEST:

    • Bloque de código
      //Para POST
      pm.variables.set("","");
      //Para GET
      pm.variables.get("");
      //Para DELETE
      pm.variables.unset("");
  • 🌍VARIABLES GLOBALES (Glovar) — Familia Var: El Abuelo

    • Cuando usarla?

      • Para propósitos generales, ideal para rápidos resultados y prototipos.

        • Mejores Prácticas:

          • Tratar de no usarlas mucho

          • Removerlas si no se necesitan ya.

          • Obtén variables en Scripts usando:

            • Bloque de código
              pm.globals.get("");
    • Grilla de la Variable:

      • <key>

      • Type:

        • Default

        • Secret

      • <Initial Value> (Visible)

      • <Current Value> (Hidden)

  • 🏰VARIABLES ENVIRONMENTS (Amvar) — Familia Var: La Madre

    • Cómo usarla?

      • Ideal cuando se trabaja con diferentes ambientes (servidores)

        • Especialmente cuando en un Proyecto se trabaja con diferentes Ambientes de Pruebas:

          • Ejemplo realista (un URL por cada ambiente):

            • {{Dev}}; {{QA1}}; {{QA2}}; {{UAT}}; {{STAGE}}… etc.

      • Buena alternativa para variables globales.

      • Similar a las variables Globales pero con un scope específico

      • Ideal para cambiar entre diferentes setups

      • Usarlo para Autenticaciones o credenciales.

      • Para pasar data a otros Requests!

      • Mejores Prácticas:

        • Removerlas si no se necesitan ya.

        • No almacenar información específica de Environment.

        • Evitar confundirlos con Variables Globales

        • Obtén variables en Scripts usando:

          • Bloque de código
            pm.environment.get("");
    • Grilla de la Variable:

      • <key>

      • Type:

        • Default

        • Secret

      • <Initial Value> (Visible)

      • <Current Value> (Hidden)

  • 📂VARIABLES PARA COLECCIONES (Colvar) — Familia Var: El Padre

    • Cómo usarla?

      • Asociados a una Collection en Postman

      • No pueden ser compartidos por múltiples collections.

      • Mejores Prácticas:

        • Usarlo con cualquier valor o constante

        • URL / credenciales de autenticación si solo existe un solo Environment.

        • Eliminar variables duplicados de Environements.

        • Obtén variables en Scripts usando según la conveniencia:

          • Bloque de código
            // Establecer una Variable Collection:
            pm.collectionVariables.set("var","valor");
            
            // Obtener una Variable Scope:
            pm.collectionVariables.get("");
            
            // Obtener la variable por Scope:
            pm.variables.get("");
    • Grilla de la Variable:

      • <key>

      • <Initial Value> (Visible)

      • <Current Value> (Hidden)

  • 🧪DATA (Datavar) — Familia Var: La Hermana Hija Mayor

    • Cómo usarla?

      • Usado cuando se trabaja con múltiples Datasets

      • Existe solamente durante la ejecución de una iteración (Query)

        • Usando una Query:

          • Bloque de código
            // Variable muy particular para solamente el Script (const o let):
            const nombredeVariable = dataquery
            let nombredeVariable = dataquery
            // Este tipo de Variables les llamaremos "Variables de Script"
            
            //Para crear una Variable Scope temporal mientas se hacen Tests, se hace:
            //Para Establecer una:
            pm.environment.set("","");
            //Para Obtener una:
            pm.environment.get("");
            //Para Borrar una:
            pm.environment.unset("");
      • Puede ser establecido solamente desde un CSV o un JSON file.

5. PARAMETERS (Key-Valor)

  • PATH PARAMETERS

    • Es la continuidad de la ruta de una URL (parámetros separados por “/”)

      • Normalmente son la información REQUERIDA de una URL para un Post.

      • Siempre van primero antes de los Query Parameters

      • Postman puede detectar estos Path con la key “:” para colocar el valor Path Parameter:
        Ejemplo:

  • QUERY PARAMETERS (QP)

    • Son los campos específicos de un body
      (parámetros comenzados por un “?” y separados por “&” en la URL)

    • Normalmente son información opcional de una URL para hacer un Post, PERO algunos Query Parameters son OBLIGATORIOS.

    • Siempre van después del “?”

 

SCRIPTS (TESTING)

...

1. SINTAXIS DE LOS SCRIPTS DE PRUEBA:

  • En Postman, cada “test” es un Step del Caso de Prueba para validar.
    La sintaxis inicial es siempre la misma:

    • Bloque de código
      pm.test("Descripción del Step de Prueba", function() {});
  • En cada SCRIPT siempre debe haber una “Assertion”, y a veces una “Variable” para hacer el Test.
    Como en el ejemplo siguiente, un Assertion:

    • Bloque de código
      pm.test("validar codigo 200", function () {
          pm.response.to.have.status(200);
      });

      El Assertion era:

      Bloque de código
      pm.response.to.have.status();

      Hay demasiados tipos de “Assertion” que se pueden usar (véase: https://www.chaijs.com/api/bdd/)

    • En caso de una Variable de Script, el ejemplo visual es el siguiente:

      Bloque de código
      const jsonData = pm.response.json();

      Se puede usar la declaración de variable dentro del bloque de código del test o fuera del mismo:

      Bloque de código
      const jsonData = pm.response.json();
      pm.test("Validar status de protocolo https", function() {
          pm.expect(jsonData.name).to.eql("TV Samsung 123");
      });
      pm.test("Validar status de protocolo https", function() {
          const jsonData = pm.response.json();
          pm.expect(jsonData.name).to.eql("3er Created by API");
      });

      (En el ejemplo arriba se usó un Script para testear “Parámetros” del JSON recibido)

      (Se recomienda siempre usar “const” para declarar una variable que será inmutable)
      (En caso de que, por alguna razón, la variable será duplicada en el mismo script, se usa “let”)

  • IMPORTANTE A TOMAR EN CUENTA:
    → QUÉ VARIABLE DECLARAR EN LOS SCRIPTS: (Diferencia entre VAR vs LET vs CONST)

    https://youtu.be/bvkY9ey83yY

  • RECOMENDACIÓN:
    USAR SIEMPRE → “Console.log()” para poder ver y chequear los datos de los Objetos del Body antes de poder hacer los ASSERTIONS.

EQUIVALENCIAS DE INCIDENCIAS QA
con el WORKFLOW de API Testing (con Postman)

...

 

2. SCRIPTS para PARAMETERS:

  • Para poder encontrar un Parámetro y validarlo, se necesita conocer el JSON que se recibirá, para así saber hallar el nombre del parámetro y su valor (Key + Valor del Parámetro)
    Ejemplo:

    • Bloque de código
      pm.test("Validar Board", function (){
          const body = pm.response.json();
          pm.expect(body.idBoard).to.eql(pm.globals.get("idBoard"))
      });

      En este caso, “idBoard”, es una Key que tiene el JSON que se obtuvo, y “body” es una variable creada previamente para definir “La Respuesta del JSON”. Y el “eql()” nos dice a qué debe ser igual nuestra Key del Body (por eso se comienza como “pm.expect(body.idBoard)” para establecer QUÉ SE ESPERA OBTENER).
      Otros Ejemplos validando Parametros:

    • Bloque de código
      pm.test("Validar creación de Board", function () {
          const jsonData = pm.response.json();
          pm.expect(jsonData.name).to.eql('Tablero 9 creado por API');
      });
      //Arriba validamos que el Key "name" sea igual a "Tablero 9 creado por API", y listo.
      
      pm.test("Closed should be false", function () {
          const jsonData = pm.response.json();
          pm.expect(jsonData.closed).to.eql(false);
      });
      //Arriba validamos que el Key "closed" sea igual a False (es un boleano), y listo.
      
      pm.test("Should be private", function () {
          const jsonData = pm.response.json();
          pm.expect(jsonData.prefs.permissionLevel).to.eql("private");
      });
      //Arriba validamos que "permissionLevel" (2do key) sea igual "private", y listo.
      //Toma en cuenta que "permissionLevel" está dentro del otro key "prefs", y así...

      Todo es cuestión de conocer el JSON y saber dónde se encuentra el Parámetro (Key-Valor) que queremos validar con el Script de Prueba.
      Hay muchos tipos de Scripts de Testing, pero el de Parámetros es el más usado.

2. PRE-REQUEST SCRIPS

Para cada Request en una Collection, los Scripts se ejecutarán en el siguiente orden:

...

  • PRE-REQUEST” Consiste en DEFINIR una VARIABLE DE SCOPE con una Declaración de Script.

    • Cuya ejecución será primero y antes de aparecer el Body del Response.

  • El Flujo sería:

    • (Primero, segundo, tercero)

      • PRE-REQUEST SCRIPTS = RUN THE HTTP REQUEST → RESPONSE BODY = TEST SCRIPTS

    • En la pestaña de Pre-Request Scripts, se puede hacer la siguiente Declaración. Ejemplo:

      • Bloque de código
        const CardName = "My Card " + parseInt(Math.random() * 100)
        //Definimos un Valor random con esta Declaración de Variable
        
        pm.environment.set("name", CardName);
        //Establecemos el nombre de la Variable de Scope 
        (que se generará automáticamente al correr el Test)
    • PARA LUEGO, En el TEST Scripts:

      • Bloque de código
        pm.test("Validar creación de card", function (){
            const body = pm.response.json();
            const autoname = pm.environment.get("name");
            pm.expect(body.name).to.eql(autoname)
        });

        AL momento de Correr el Test, primero: se definirá la Variable de Scope (Environment) PREVIAMENTE, y luego: correrá el Test usando la Variable Scope definida.
        ((También se puede crear un Script para DESHACER la variable una vez finalice el Test, y así no guardará Variables de Scopes innecesariamente!))

      • → BÁSICAMENTE SE USA PARA SOBREESCRIBIR DATA / PREPARAR DATA

3. ASSERTIONS SCRIPTS

  • Los Assertions SIEMPRE van a estar en un Script de Prueba.

  • Para VALIDAR un resultado esperado, se deben usar Assertions SEGÚN EL BODY DE RESPUESTA DEL API.

    • Cada Software tiene su estructura de código presentada con sus API, las cuales pueden ser variadas, aunque la más común hoy en día es la de JSON por su adaptabilidad a cualquier lenguaje como todos sabemos.

  • A continuación se presentará cada SINTAXIS para HACER SCRIPTS SEGÚN EL “RESPONSE BODY”:

    • JSON →→ 🚩

      • Bloque de código
        pm.response.json()
    • XML →

      • Bloque de código
        xml2Json(responseBody)
    • HTML →

      • Bloque de código
        cheerio(pm.response.text())
    • Plain-Text →

      • Bloque de código
        pm.response.text()
    • CSV →

      • Bloque de código
        csv-parse/lib/sync
  • CHAI ASSERTION LIBRARY:

  • QUIZ DE ASSERTIONS PARA LA CLASE: (COPIA Y PEGA EN EL SCRIPT para que aprecies el código.

    • DELIVERY QUIZ:
      ENVÍA LA RESPUESTA AL PRIVADO Y TE DIRÉ TU PUNTUACIÓN

    • Bloque de código
      // CHAI ASSERTIONS Quiz
      
      //Q1: 
      // De acuerdo a este Assertion de la documentación Chai
      expect(false).to.be.false;
      //Cómo puedes correr esto en Postman?
      //1
      expect(false).to.be.false
      //2
      pm.expect(false).to.be.false;
      //3*
      pm.test("Step", function(){
          pm.expect(false).to.be.false;
      });
      
      //Q2: 
      // Observa muy bien la siguiente Assertion dentro del test:
      pm.test("Step", function(){
          let number = '5';
          pm.expect(number).to.eql(5);
      //Cuál sería el Outcome de la prueba?
      //1
      //La prueba será PASS, porque 5 es igual a 5
      //2*
      //La prueba será FAIL, porque los dos valores tienen diferentes tipos de daata. '5' is un String y 5 is un número.
      
      //Q3: 
      // Considera el Assertion del siguiente Test:
      pm.test("Step", function(){
          let number;
          pm.expect(number).to.eql(null);
      //Cuál sería el Outcome de la prueba?
      //1*
      //La prueba será PASS, porque el número NO está definido, así que por predeterminado es NULL
      //2
      //La prueba será FAIL, porque el number NO está definido, y así NO es igual a NULL.
      
      //Q4: 
      // Quieres chequear un valor (netflix) en un Array de múltiples valores (youtube,netflix,twitch). Cómo lo harías?
      //1
      pm.test("Step", function(){
          pm.expect('netflix').to.eql(['youtube','netflix','twitch']);
      });
      //2*
      pm.test("Step", function(){
          pm.expect('netflix').to.be.oneOf(['youtube','netflix','twitch']);
      });
      //3
      pm.test("Step", function(){
          pm.expect(netflix).to.be.oneOf([youtube,netflix,twitch]);
      });
      //4
      pm.test("Step", function(){
          pm.expect('netflix').to.be.eql('youtube');
          pm.expect('netflix').to.be.eql('netflix');
          pm.expect('netflix').to.be.eql('twitch');
      });

((EL PRÓXIMO 26 DE ABRIL, LIBERO LA SIGUIENTE PARTE DEL TEMARIO))