CursosEmpresasBlogLiveConfPrecios

Spies

Clase 19 de 27 • Curso de Introducción al Testing con JavaScript

Clase anteriorSiguiente clase

Contenido del curso

Introduccion

  • 1
    ¿Qué es el testing?

    ¿Qué es el testing?

    09:31 min
  • 2
    La piramide del testing

    La piramide del testing

    07:46 min
  • 3
    Hablemos sobre deuda técnica

    Hablemos sobre deuda técnica

    06:48 min
  • 4
    Herramientas de testing

    Herramientas de testing

    07:54 min
  • 5
    Creando el proyecto

    Creando el proyecto

    08:15 min
  • 6
    Tu primer test

    Tu primer test

    09:15 min

Escribiendo pruebas

  • 7
    Pruebas estáticas

    Pruebas estáticas

    11:44 min
  • 8
    Assertions / matchers

    Assertions / matchers

    10:10 min
  • 9
    Setup and Teardown

    Setup and Teardown

    11:31 min
  • 10
    Implementado Setup

    Implementado Setup

    12:00 min
  • 11
    Tipos de pruebas

    Tipos de pruebas

    13:34 min
  • 12
    Metodologías

    Metodologías

    13:59 min

Pruebas Unitarias

  • 13
    Pruebas unitarias

    Pruebas unitarias

    06:32 min
  • 14
    Coverage report

    Coverage report

    08:06 min
  • 15

    Instalación de Docker en Windows, macOS y Ubuntu

    01:35 min
  • 16
    Proyecto de API

    Proyecto de API

    11:48 min
  • 17
    Mocking, Stub, doubles

    Mocking, Stub, doubles

    14:08 min
  • 18
    Mocking

    Mocking

    09:43 min
  • 19
    Spies

    Spies

    Viendo ahora
  • 20
    Generando Fake Books

    Generando Fake Books

    12:19 min

Integration Test & E2E

  • 21
    Configurando supertest en el API

    Configurando supertest en el API

    16:29 min
  • 22
    Integration Test

    Integration Test

    09:44 min
  • 23
    e2e

    e2e

    20:40 min

UI Test

  • 24
    UI Test

    UI Test

    10:02 min

Automatizar

  • 25
    Unit tests en GitHubActions

    Unit tests en GitHubActions

    13:49 min
  • 26
    E2E en GitHubActions

    E2E en GitHubActions

    08:02 min
  • 27
    ¿Quieres más cursos de testing?

    ¿Quieres más cursos de testing?

    01:51 min
  • Tomar el examen del curso
    • Andrés Pérez Díaz

      Andrés Pérez Díaz

      student•
      hace 3 años

      Muy interesante este curso, no entiendo por qué no tiene más visualizaciones.

      David Antonio Garcia Saaib

      David Antonio Garcia Saaib

      student•
      hace 3 años
      const fakeBooks = [ { _id: 1, name: 'Harry Potter' }, { _id: 2, name: 'Harry Potter 2' }, { _id: 3, name: 'Harry Potter 3' }, ];

      const mockGetAll = jest.fn(); Es una funcion fantasma que manejaremos.

      jest.mock('../lib/mongo.lib', () => jest.fn().mockImplementation(() => ({ getAll: mockGetAll, create: () => { }, })));

      jest.mock('../lib/mongo.lib' Suplanta a la llamada de la libreria de mongo, para que cuando sea llamada en su lugar ejecute otro jest.fn(), y mediante mockImplementation sea seteado el objeto con el metodo getAll: mockGetAll.

      beforeEach

      let service; beforeEach(() => { service = new BooksService(); });

      service = new BooksService() crea una instancia de BookService, que ya contiene la trampa que al llamar a mongo, lo suplanta con los metodos getAll y create.

      Test

      mockGetAll.mockResolvedValue([...fakeBooks]) const books = await service.getBooks({}) expect(books.length).toEqual(3); expect(mockGetAll).toHaveBeenCalled() expect(mockGetAll).toHaveBeenCalledWith('books', {}) expect(mockGetAll).toHaveBeenCalledTimes(1)

      Seteamos que cuando mockGetAll sea llamado retorne fakeBooks. service.getBooks({}) hace una llamada al servicio. Los expect son en si ifs que ven el detalle de la data. expect(books.length).toEqual(3) verifica que la respuesta tenga tres posiciones. expect(mockGetAll).toHaveBeenCalled() Verifica que haya sido llamada esta funcion fake. ... y asi xD

        Diego Vergara

        Diego Vergara

        student•
        hace 3 años

        Buena explicación bro 👍

      Miguel Angel Reyes Moreno

      Miguel Angel Reyes Moreno

      student•
      hace 3 años

      Este comentario lo había hecho antes pero lo vuelvo a hacer por si alguien se le pasó:

      Para evitar errores de typo con Jest y que VS Code pueda autocompletar código de Jest, instalen esta dependencia de npm:

      npm i @types/jest -D

      Así me evité el error que tuvo el profe Nico :D

      Rubén Ernesto Aragón Gil

      Rubén Ernesto Aragón Gil

      student•
      hace 3 años
      const BooksService = require('./books.service'); const fakeBooks = [ { _id: 1, name: 'Harry Potter', }, ]; const mockGetAll = jest.fn(); jest.mock('../lib/mongo.lib', () => jest.fn().mockImplementation(() => ({ getAll: mockGetAll, create: () => {}, }))); describe('Test for BooksService', () => { let service; beforeEach(() => { service = new BooksService(); jest.clearAllMocks(); }); describe('test for getBooks', () => { test('should return a list book', async () => { // Arrange mockGetAll.mockResolvedValue(fakeBooks); // Act const books = await service.getBooks({}); console.log(books); // Assert expect(books.length).toEqual(1); expect(mockGetAll).toHaveBeenCalled(); expect(mockGetAll).toHaveBeenCalledTimes(1); expect(mockGetAll).toHaveBeenCalledWith('books', {}); }); test('should return a list book', async () => { mockGetAll.mockResolvedValue([{ _id: 1, name: 'Harry putter 2', }]); const books = await service.getBooks({}); console.log(books); expect(books[0].name).toEqual('Harry putter 2'); }); }); });
      Aram Missael Guzmán Boiso

      Aram Missael Guzmán Boiso

      student•
      hace 2 años

      Spies

      Los spies son muy utiles para realizar pruebas de caja blanca.

      Para este ejemplo se va espiar el comportamiento de le método getAll .

      Para realizar esto debemos crear una variable y asignarla a una función de jest.

      const mockGetAll = jest.fn();

      Después dentro de MongoLibStub, donde declaramos a getAll, le asignamos mockGetAll.

      { getAll: mockGetAll, }

      Ahora modificamos la respuesta del método getAll, con la función mockResolvedValue(fakeBooks)

      // Retorna una promesa mockGetAll.mockResolvedValue(fakeBooks);

      Y ahora podemos utilizar los métodos toHaveBeenCalled toHaveBeenCalledTimes toHaveBeenCalledWith para espiar y comprabor que el comportamiento interno de nuestro método sea el correcto.

      expect(mockGetAll).toHaveBeenCalled(); expect(mockGetAll).toHaveBeenCalledTimes(1); expect(mockGetAll).toHaveBeenCalledWith('books', {});

      Consideraciones

      • Es importante anteponer el nombre mock a la variable que contendrá la función de jest.
      • Jest tiene una carpeta espacial para almacenar los mocks, ya que antes de correr los test ejecuta los mocks.
      Diego Fernando Velesaca Orellana

      Diego Fernando Velesaca Orellana

      student•
      hace 2 años

      En esta clase estamos haciendo el test de lo que deberia retornar el metodo getBooks() de la la clase BooksService, pero si se quisiera hacer el test de la conexion a la base y comprobar que es lo que en realidad retorna la consulta, se deberia crear mas test para cada funcion/metodo en este caso en particular se deberia crear el test para el metodo getAll() de la clase MongoLib?

      EDISSON MOGOLLON

      EDISSON MOGOLLON

      student•
      hace 4 años

      En este caso cuando utilizo el nombre spyGetAll siempre me da error, pero cuando uso el nombre mockGetAll todo sale correcto. Esto se debe a que jest tiene algun estandar para estas definiciones?

        Nicolas Molina

        Nicolas Molina

        teacher•
        hace 4 años

        Exacto jest si o si dice que debemos llamarlo mock al inicio otra forma es organizar neustros mocks en la carpeta mocks que nos sugiere jest.

      Zaidibeth Ramos

      Zaidibeth Ramos

      student•
      hace 2 años

      Por que en un momento (la clase anterior) funciono el mockResolveValue y ahora tiene que ser mockResolvedValue?

      Jesus David Mejia

      Jesus David Mejia

      student•
      hace un año

      Tengo una pregunta y tal vez un aporte al mismo tiempo. Vengo de hacer varios cursos de Testing con Nico en Angular y otros cursos de Testing con Node de otras plataformas y me surge una duda, Nico menciona que en las pruebas unitarias debemos centrarnos en el archivo que estamos trabajando, en este caso estamos un paso más allá, estamos involucrando archivos como el “mongo.lib.js” el cual debería tener su testing por aparte. ¿No se supone que no deberíamos tocar el archivo de “mongo.lib.js”, es decir, no debemos irnos más allá del servicio porque no son pruebas de integración, el proceso adecuado no sería crear un SPY del Servicio y controlar el getBooks y createBook desde el servicio mas no del mongo.lib, en otros cursos de testing con Node y Frameworks suele ser de la manera como lo estoy diciendo, nose si me estoy equivocando? Mi solución alternativa es con SpyOn en el Servicio mas no en el MongoLib, con SpyOn es mas corto y menos enredado.

      const BooksService = require("./books.service"); const fakeBook = [ { _id: 1, name: "Iron Man", }, ]; const fakeBooks = [ { _id: 1, name: "Harry Potter", }, { _id: 2, name: "Señor de los Anillos", }, ]; describe("Test for BooksService", () => { let service; beforeEach(() => { service = new BooksService(); jest.clearAllMocks(); }); //Nico with mockImplementation //Owner with spyOn describe("Test for BooksService [Owner - spyOn]", () => { describe("test for getBooks with spyOn in BooksService", () => { test("should return a list book", async () => { //Arranger const spyGetAll = jest.spyOn(service, "getBooks"); spyGetAll.mockResolvedValue(fakeBooks); //Act const books = await service.getBooks({}); //Assert expect(books.length).toEqual(2); expect(spyGetAll).toHaveBeenCalled(); expect(spyGetAll).toHaveBeenCalledWith({}); }); test("should do match with name of first element", async () => { //Arranger const spyGetAll = jest.spyOn(service, "getBooks"); spyGetAll.mockResolvedValue(fakeBook); //Act const books = await service.getBooks({}); //Assert expect(books.length).toEqual(1); expect(books[0].name).toEqual("Iron Man"); }); }); }); });
      Jesus David Mejia

      Jesus David Mejia

      student•
      hace un año

      Tengo una pregunta y tal vez un aporte al mismo tiempo. Vengo de hacer varios cursos de Testing con Nico en Angular y otros cursos de Testing con Node de otras plataformas y me surge una duda, Nico menciona que en las pruebas unitarias debemos centrarnos en el archivo que estamos trabajando, en este caso estamos un paso más allá, estamos involucrando archivos como el “mongo.lib.js” el cual debería tener su testing por aparte. ¿No se supone que no deberíamos tocar el archivo de “mongo.lib.js”, es decir, no debemos irnos más allá del servicio porque no son pruebas de integración, el proceso adecuado no sería crear un SPY del Servicio y controlar el getBooks y createBook desde el servicio mas no del mongo.lib, en otros cursos de testing con Node y Frameworks suele ser de la manera como lo estoy diciendo, nose si me estoy equivocando? Mi solución alternativa es con SpyOn en el Servicio mas no en el MongoLib, con SpyOn es mas corto y menos enredado.

      const <u>BooksService</u> = require("./books.service"); const fakeBook = [  {    _id: 1,    name: "Iron Man",  },];const fakeBooks = [  {    _id: 1,    name: "Harry Potter",  },  {    _id: 2,    name: "Señor de los Anillos",  },];
      const BooksService = require("./books.service"); const fakeBook = [ { _id: 1, name: "Iron Man", }, ]; const fakeBooks = [ { _id: 1, name: "Harry Potter", }, { _id: 2, name: "Señor de los Anillos", }, ];
      Jesus David Mejia

      Jesus David Mejia

      student•
      hace un año

      Tengo una pregunta y tal vez un aporte al mismo tiempo. Vengo de hacer varios cursos de Testing con Nico en Angular y otros cursos de Testing con Node de otras plataformas y me surge una duda, Nico menciona que en las pruebas unitarias debemos centrarnos en el archivo que estamos trabajando, en este caso estamos un paso más allá, estamos involucrando archivos como el “mongo.lib.js” el cual debería tener su testing por aparte. ¿No se supone que no deberíamos tocar el archivo de “mongo.lib.js”, es decir, no debemos irnos más allá del servicio porque no son pruebas de integración, el proceso adecuado no sería crear un SPY del Servicio y controlar el getBooks y createBook desde el servicio mas no del mongo.lib, en otros cursos de testing con Node y Frameworks suele ser de la manera como lo estoy diciendo, nose si me estoy equivocando? Mi solución alternativa es con SpyOn en el Servicio mas no en el MongoLib, con SpyOn es mas corto y menos enredado.

      const`` ``BooksService`` = require("./books.service"); const`` fakeBook = [  {    _id: 1,    name: "Iron Man",  },];``const`` fakeBooks = [  {    _id: 1,    name: "Harry Potter",  },  {    _id: 2,    name: "Señor de los Anillos",  },];

      describe("Test for BooksService", () ``=>`` {  ``let`` service;  beforeEach(() ``=>`` {    service = new ``BooksService``();    jest.clearAllMocks();  });   //Nico with mockImplementation   //Owner with spyOn  describe("Test for BooksService [Owner - spyOn]", () ``=>`` {    describe("test for getBooks with spyOn in BooksService", () ``=>`` {      test("should return a list book", async () ``=>`` {        //Arranger        ``const`` spyGetAll = jest.spyOn(service, "getBooks");        spyGetAll.mockResolvedValue(fakeBooks);        //Act        ``const`` books = await service.getBooks({});        //Assert        expect(books.length).toEqual(2);        expect(spyGetAll).toHaveBeenCalled();        expect(spyGetAll).toHaveBeenCalledWith({});      });      test("should do match with name of first element", async () ``=>`` {        //Arranger        ``const`` spyGetAll = jest.spyOn(service, "getBooks");        spyGetAll.mockResolvedValue(fakeBook);        //Act        ``const`` books = await service.getBooks({});        //Assert        expect(books.length).toEqual(1);        expect(books[0].name).toEqual("Iron Man");      });    });  });});

      Jesus David Mejia

      Jesus David Mejia

      student•
      hace un año

      Tengo una pregunta y tal vez un aporte al mismo tiempo. Vengo de hacer varios cursos de Testing con Nico en Angular y otros cursos de Testing con Node de otras plataformas y me surge una duda, Nico menciona que en las pruebas unitarias debemos centrarnos en el archivo que estamos trabajando, en este caso estamos un paso más allá, estamos involucrando archivos como el “mongo.lib.js” el cual debería tener su testing por aparte. ¿No se supone que no deberíamos tocar el archivo de “mongo.lib.js”, es decir, no debemos irnos más allá del servicio porque no son pruebas de integración, el proceso adecuado no sería crear un SPY del Servicio y controlar el getBooks y createBook desde el servicio mas no del mongo.lib, en otros cursos de testing con Node y Frameworks suele ser de la manera como lo estoy diciendo, nose si me estoy equivocando? Mi solución alternativa es con SpyOn en el Servicio mas no en el MongoLib, con SpyOn es mas corto y menos enredado.const <u>BooksService</u> = require("./books.service"); const fakeBook = [  {    _id: 1,    name: "Iron Man",  },];const fakeBooks = [  {    _id: 1,    name: "Harry Potter",  },  {    _id: 2,    name: "Señor de los Anillos",  },];```js const BooksService = require("./books.service");

      const fakeBook = [ { _id: 1, name: "Iron Man", }, ]; const fakeBooks = [ { _id: 1, name: "Harry Potter", }, { _id: 2, name: "Señor de los Anillos", }, ];

      describe("Test for BooksService", () => { let service; beforeEach(() => { service = new BooksService(); jest.clearAllMocks(); });

      //Nico with mockImplementation

      //Owner with spyOn describe("Test for BooksService [Owner - spyOn]", () => { describe("test for getBooks with spyOn in BooksService", () => { test("should return a list book", async () => { //Arranger const spyGetAll = jest.spyOn(service, "getBooks"); spyGetAll.mockResolvedValue(fakeBooks); //Act const books = await service.getBooks({}); //Assert expect(books.length).toEqual(2); expect(spyGetAll).toHaveBeenCalled(); expect(spyGetAll).toHaveBeenCalledWith({}); }); test("should do match with name of first element", async () => { //Arranger const spyGetAll = jest.spyOn(service, "getBooks"); spyGetAll.mockResolvedValue(fakeBook); //Act const books = await service.getBooks({}); //Assert expect(books.length).toEqual(1); expect(books[0].name).toEqual("Iron Man"); }); }); }); });

      Dany Ruddy Huayhua Huayhua

      Dany Ruddy Huayhua Huayhua

      student•
      hace 2 años

      Tuve que aclarar esta duda interna que tenía

      Mocks:

      Un "mock" es un objeto simulado que imita el comportamiento de un componente real.

      Spies:

      Un "spy" es similar a un "mock" en el sentido de que también registra y verifica el comportamiento de un objeto durante una prueba. Sin embargo, a diferencia de un mock que imita completamente el objeto real, un "spy" es una versión parcialmente real del objeto que está siendo probado. Los "spies" se utilizan para espiar y registrar el comportamiento de métodos o funciones específicas de un objeto, mientras que el resto del objeto se comporta como lo haría normalmente.

    Escuelas

    • Desarrollo Web
      • Fundamentos del Desarrollo Web Profesional
      • Diseño y Desarrollo Frontend
      • Desarrollo Frontend con JavaScript
      • Desarrollo Frontend con Vue.js
      • Desarrollo Frontend con Angular
      • Desarrollo Frontend con React.js
      • Desarrollo Backend con Node.js
      • Desarrollo Backend con Python
      • Desarrollo Backend con Java
      • Desarrollo Backend con PHP
      • Desarrollo Backend con Ruby
      • Bases de Datos para Web
      • Seguridad Web & API
      • Testing Automatizado y QA para Web
      • Arquitecturas Web Modernas y Escalabilidad
      • DevOps y Cloud para Desarrolladores Web
    • English Academy
      • Inglés Básico A1
      • Inglés Básico A2
      • Inglés Intermedio B1
      • Inglés Intermedio Alto B2
      • Inglés Avanzado C1
      • Inglés para Propósitos Específicos
      • Inglés de Negocios
    • Marketing Digital
      • Fundamentos de Marketing Digital
      • Marketing de Contenidos y Redacción Persuasiva
      • SEO y Posicionamiento Web
      • Social Media Marketing y Community Management
      • Publicidad Digital y Paid Media
      • Analítica Digital y Optimización (CRO)
      • Estrategia de Marketing y Growth
      • Marketing de Marca y Comunicación Estratégica
      • Marketing para E-commerce
      • Marketing B2B
      • Inteligencia Artificial Aplicada al Marketing
      • Automatización del Marketing
      • Marca Personal y Marketing Freelance
      • Ventas y Experiencia del Cliente
      • Creación de Contenido para Redes Sociales
    • Inteligencia Artificial y Data Science
      • Fundamentos de Data Science y AI
      • Análisis y Visualización de Datos
      • Machine Learning y Deep Learning
      • Data Engineer
      • Inteligencia Artificial para la Productividad
      • Desarrollo de Aplicaciones con IA
      • AI Software Engineer
    • Ciberseguridad
      • Fundamentos de Ciberseguridad
      • Hacking Ético y Pentesting (Red Team)
      • Análisis de Malware e Ingeniería Forense
      • Seguridad Defensiva y Cumplimiento (Blue Team)
      • Ciberseguridad Estratégica
    • Liderazgo y Habilidades Blandas
      • Fundamentos de Habilidades Profesionales
      • Liderazgo y Gestión de Equipos
      • Comunicación Avanzada y Oratoria
      • Negociación y Resolución de Conflictos
      • Inteligencia Emocional y Autogestión
      • Productividad y Herramientas Digitales
      • Gestión de Proyectos y Metodologías Ágiles
      • Desarrollo de Carrera y Marca Personal
      • Diversidad, Inclusión y Entorno Laboral Saludable
      • Filosofía y Estrategia para Líderes
    • Diseño de Producto y UX
      • Fundamentos de Diseño UX/UI
      • Investigación de Usuarios (UX Research)
      • Arquitectura de Información y Usabilidad
      • Diseño de Interfaces y Prototipado (UI Design)
      • Sistemas de Diseño y DesignOps
      • Redacción UX (UX Writing)
      • Creatividad e Innovación en Diseño
      • Diseño Accesible e Inclusivo
      • Diseño Asistido por Inteligencia Artificial
      • Gestión de Producto y Liderazgo en Diseño
      • Diseño de Interacciones Emergentes (VUI/VR)
      • Desarrollo Web para Diseñadores
      • Diseño y Prototipado No-Code
    • Contenido Audiovisual
      • Fundamentos de Producción Audiovisual
      • Producción de Video para Plataformas Digitales
      • Producción de Audio y Podcast
      • Fotografía y Diseño Gráfico para Contenido Digital
      • Motion Graphics y Animación
      • Contenido Interactivo y Realidad Aumentada
      • Estrategia, Marketing y Monetización de Contenidos
    • Desarrollo Móvil
      • Fundamentos de Desarrollo Móvil
      • Desarrollo Nativo Android con Kotlin
      • Desarrollo Nativo iOS con Swift
      • Desarrollo Multiplataforma con React Native
      • Desarrollo Multiplataforma con Flutter
      • Arquitectura y Patrones de Diseño Móvil
      • Integración de APIs y Persistencia Móvil
      • Testing y Despliegue en Móvil
      • Diseño UX/UI para Móviles
    • Diseño Gráfico y Arte Digital
      • Fundamentos del Diseño Gráfico y Digital
      • Diseño de Identidad Visual y Branding
      • Ilustración Digital y Arte Conceptual
      • Diseño Editorial y de Empaques
      • Motion Graphics y Animación 3D
      • Diseño Gráfico Asistido por Inteligencia Artificial
      • Creatividad e Innovación en Diseño
    • Programación
      • Fundamentos de Programación e Ingeniería de Software
      • Herramientas de IA para el trabajo
      • Matemáticas para Programación
      • Programación con Python
      • Programación con JavaScript
      • Programación con TypeScript
      • Programación Orientada a Objetos con Java
      • Desarrollo con C# y .NET
      • Programación con PHP
      • Programación con Go y Rust
      • Programación Móvil con Swift y Kotlin
      • Programación con C y C++
      • Administración Básica de Servidores Linux
    • Negocios
      • Fundamentos de Negocios y Emprendimiento
      • Estrategia y Crecimiento Empresarial
      • Finanzas Personales y Corporativas
      • Inversión en Mercados Financieros
      • Ventas, CRM y Experiencia del Cliente
      • Operaciones, Logística y E-commerce
      • Gestión de Proyectos y Metodologías Ágiles
      • Aspectos Legales y Cumplimiento
      • Habilidades Directivas y Crecimiento Profesional
      • Diversidad e Inclusión en el Entorno Laboral
      • Herramientas Digitales y Automatización para Negocios
    • Blockchain y Web3
      • Fundamentos de Blockchain y Web3
      • Desarrollo de Smart Contracts y dApps
      • Finanzas Descentralizadas (DeFi)
      • NFTs y Economía de Creadores
      • Seguridad Blockchain
      • Ecosistemas Blockchain Alternativos (No-EVM)
      • Producto, Marketing y Legal en Web3
    • Recursos Humanos
      • Fundamentos y Cultura Organizacional en RRHH
      • Atracción y Selección de Talento
      • Cultura y Employee Experience
      • Gestión y Desarrollo de Talento
      • Desarrollo y Evaluación de Liderazgo
      • Diversidad, Equidad e Inclusión
      • AI y Automatización en Recursos Humanos
      • Tecnología y Automatización en RRHH
    • Finanzas e Inversiones
      • Fundamentos de Finanzas Personales y Corporativas
      • Análisis y Valoración Financiera
      • Inversión y Mercados de Capitales
      • Finanzas Descentralizadas (DeFi) y Criptoactivos
      • Finanzas y Estrategia para Startups
      • Inteligencia Artificial Aplicada a Finanzas
      • Domina Excel
      • Financial Analyst
      • Conseguir trabajo en Finanzas e Inversiones
    • Startups
      • Fundamentos y Validación de Ideas
      • Estrategia de Negocio y Product-Market Fit
      • Desarrollo de Producto y Operaciones Lean
      • Finanzas, Legal y Fundraising
      • Marketing, Ventas y Growth para Startups
      • Cultura, Talento y Liderazgo
      • Finanzas y Operaciones en Ecommerce
      • Startups Web3 y Blockchain
      • Startups con Impacto Social
      • Expansión y Ecosistema Startup
    • Cloud Computing y DevOps
      • Fundamentos de Cloud y DevOps
      • Administración de Servidores Linux
      • Contenerización y Orquestación
      • Infraestructura como Código (IaC) y CI/CD
      • Amazon Web Services
      • Microsoft Azure
      • Serverless y Observabilidad
      • Certificaciones Cloud (Preparación)
      • Plataforma Cloud GCP

    Platzi y comunidad

    • Platzi Business
    • Live Classes
    • Lanzamientos
    • Executive Program
    • Trabaja con nosotros
    • Podcast

    Recursos

    • Manual de Marca

    Soporte

    • Preguntas Frecuentes
    • Contáctanos

    Legal

    • Términos y Condiciones
    • Privacidad
    • Tyc promociones
    Reconocimientos
    Reconocimientos
    Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
    Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
    Logo reconocimientoPrimera Startup EdTech · 2018
    Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
    Logo reconocimientoCEO Mejor Emprendedor del año · 2024
    De LATAM conpara el mundo
    YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads