Cómo Realm por MongoDB está probando módulos nativos “en el dispositivo”

Rate this content
Bookmark
Github

La ejecución de pruebas en Node.js es una práctica común para los desarrolladores de aplicaciones y bibliotecas. Pero cuando tu biblioteca se integra más profundamente con la plataforma, el sistema operativo o el motor JS, necesitas aumentar la ejecución de pruebas “en el dispositivo”. El equipo de Realm JS en MongoDB se enfrenta a este desafío, ya que estamos manteniendo una biblioteca React Native con módulos nativos. En esta charla compartiré el paquete “mocha-remote” que hemos construido para ayudarnos a ejecutar pruebas “en el dispositivo” mientras obtenemos informes y seguimos en control desde la comodidad de nuestras terminales.

Kræn Hansen
Kræn Hansen
11 min
15 Nov, 2023

Video Summary and Transcription

El orador trabaja en los SDKs del dispositivo Atlas, que permite probar el código en múltiples plataformas y tiene soporte para múltiples lenguajes de programación. También construyeron Mocha Remote CLI, una herramienta para ejecutar pruebas en Node.js y en un navegador. El orador menciona la popularidad de Jest y la alternativa Vitest para ejecutar pruebas en plataformas como Android e iOS.

Available in English

1. Introducción a Atlas Device SDKs

Short description:

Trabajo para MongoDB en los Atlas Device SDKs, apoyando múltiples sistemas operativos, plataformas y motores de JavaScript. Hoy, quiero compartir una técnica que usamos para probar nuestro código en cualquier lugar donde necesite ejecutarse. MongoDB Atlas es una plataforma de datos para desarrolladores multicloud, que te permite construir con datos. Construimos los Atlas Device SDKs, que cuenta con una base de datos local que se ejecuta en la aplicación y sincronización bidireccional de datos entre la aplicación y la nube. Tenemos soporte para múltiples lenguajes de programación y aprovechamos la generación de código para exponer un componente central común. Queremos probar en todas las plataformas compatibles y tener una excelente experiencia de desarrollador.

Hola. Soy Krane. Trabajo para MongoDB en lo que solíamos llamar Rel, pero que ahora se conoce como los Atlas Device SDKs. Ayudo a construir y mantener nuestro paquete de TypeScript, apoyando múltiples sistemas operativos, plataformas y motores de JavaScript. Y hoy, quiero compartir una técnica que usamos para probar nuestro código en cualquier lugar donde necesite ejecutarse. MongoDB Atlas es una plataforma de data para desarrolladores multicloud, una suite integrada de servicios de data y database en la cloud, que te permite construir con data. Y una parte de esto es acercar la data al lugar donde se está utilizando. Y a esto lo llamamos Atlas para el Edge. Un lugar donde se está utilizando tu data es en los dispositivos móviles de tus usuarios finales. Y para eso, construimos los Atlas Device SDKs, anteriormente conocidos como Realm. Así que los Atlas Device SDKs cuentan con una database local que se ejecuta en la aplicación. Tiene sincronización bidireccional de data entre la aplicación y la database que se ejecuta en la cloud. Y no requiere conectividad a internet, a menos que necesite sincronizarse, por supuesto. Y porque no tiene este requisito, cuando lees y escribes data, es de muy baja latencia. Y además de esas APIs, también tenemos APIs para observar la data a medida que cambia en el servidor y se propaga al dispositivo. Y esto te permite construir experiencias de usuario verdaderamente reactivas. Además de TypeScript, tenemos soporte para Swift, Kotlin, .NET, solo por nombrar algunos. Y para que eso suceda, tenemos un componente central común escrito en C++. Y nuestro equipo aprovecha la generación de código para exponer este componente central como una interfaz de TypeScript en la que construimos el SDK encima. Y para que eso suceda, generamos código, código de pegamento, código de enlace, lo llamamos, entre este componente central y los diversos motores de JavaScript y sus APIs de C++. Actualmente apoyamos el núcleo de JavaScript en Hermes a través de JSI para React Native y también apoyamos V8 a través de NAPI para Node.js y Electron. También tenemos una vista previa del soporte de Wasm para los navegadores. Así que tenemos todo este código TypeScript hecho a mano y reglas que usamos para generar código para todas estas diferentes plataformas con motores de JavaScript que se comportan ligeramente diferente.

Así que naturalmente queremos probar esto en todas las plataformas compatibles antes de lanzar algo en las aplicaciones de miles de usuarios. Cuando me uní, teníamos un solo paquete que exportaba múltiples funciones asíncronas y teníamos entornos de prueba específicos que eran código hecho a mano, algo de él nativo, que no se probaba en absoluto. Era una pesadilla mantenerlo, especialmente cuando queríamos avanzar y actualizar estos entornos a las versiones más recientes de las plataformas que apoyábamos. Y esta falta de developer experience me afectó. Solo quería poder ejecutar la prueba en modo de observación en cualquier plataforma que apoyáramos, tener una increíble developer experience, en lugar de pasar mi tiempo actualizando estos corredores de plataforma o código de ejecución específico de la plataforma. Y pensé para mí mismo, ¿qué pasaría si simplemente ejecutáramos el mismo código en todas las plataformas, y lo manejáramos desde la comodidad de nuestras terminales, y pudiéramos escribir y mantener, y más importante, probar este código por separado de los entornos en los que lo probamos. Básicamente solo quería ejecutar un CLI en mi máquina host, ejecutar las pruebas en el dispositivo, y obtener los informes de vuelta en mi máquina host.

2. Construyendo Mocha Remote CLI

Short description:

En 2019, construí Mocha Remote, una herramienta basada en Mocha para ejecutar pruebas en Node.js y en un navegador. Soporta casi todas las opciones de Mocha, incluyendo tiempos de espera, especificación de reporteros y un contexto. El corredor de Mocha se empaquetó en una variante independiente de tiempo de ejecución utilizando webpack, y se utiliza una conexión WebSocket entre el corredor, el cliente y el servidor Mocha Remote CLI. El CLI puede buscar pruebas específicas y suministrar un contexto. El Mocha Remote CLI está vinculado a un subcomando responsable de iniciar la aplicación de prueba, asegurando la correcta propagación del código de estado.

Entonces, en 2019, eso es exactamente lo que construí. Construí esto alrededor de Mocha. Honestamente, probablemente no hice demasiada investigación. Parecía popular, y sabía que podía ejecutar pruebas tanto en Node.js como en un navegador. Y se usaba en otros lugares de nuestra organización.

Y el CLI de Mocha, básicamente, esta es una diapositiva sobre la arquitectura simplificada de Mocha. Básicamente, una vez que ejecutas el CLI, instancias un corredor, que requiere los archivos de prueba, y luego comienza la ejecución. Y el progreso de las pruebas aprobadas y fallidas se emite a través de eventos de vuelta al CLI, que luego se retransmite a los reporteros. Y nombré mi herramienta Mocha Remote basándome en esto. No es tan popular como Mocha, como puedes ver, pero y en su mayoría son 900 descargas semanales. La mayoría de ellas son probablemente nuestro CI. Y esta es parte de la razón por la que quiero compartir esta historia hoy.

Intenté reutilizar el CLI de Mocha, pero encontré difícil extenderlo porque el corredor en sí no es extensible o no es posible configurarlo desde el CLI de Mocha, pero afortunadamente fue muy fácil de implementar, re-implementar eso, y el CLI de Mocha Remote ahora soporta casi todas las opciones que puedes pasar a Mocha, incluyendo la búsqueda de un título de prueba, incluyendo tiempos de espera, especificando reporteros, observando, y luego también un contexto, que yo mostraré más tarde.

Así que el corredor de Mocha, el corredor original de Mocha, en realidad pude empaquetarlo en una variante independiente del tiempo de ejecución usando webpack, y esto es lo que se ejecuta en las diversas plataformas. En lugar de simples eventos, usando la emisión de eventos, usamos una conexión WebSocket entre el corredor, el cliente y el servidor del CLI de Mocha Remote. Y una vez que el cliente se conecta al servidor, recibirá un mensaje para comenzar a ejecutar las pruebas. El cliente o el corredor ejecutará una función de prueba suministrada por el desarrollador, que básicamente definirá las pruebas ya sea importándolas o definiéndolas en línea. Y una vez que el corredor de pruebas comienza a ejecutarse, comenzará a enviar estos eventos de pruebas aprobadas y fallidas a través de un socket web de vuelta al CLI, que se propaga a los reporteros.

Esto es lo que parece cuando invocas el CLI de Mocha Remote, y puedes ver que buscamos todas las pruebas que tienen conexiones en el título, y también suministramos este contexto, en caso de una URL de API, que se propaga a través de este sistema al corredor, y lo mostraré en un segundo. También suministramos el subcomando noderuntestappjs, que es responsable de iniciar la aplicación de prueba. Y la vida de este subcomando y el CLI de Mocha Remote están vinculados de tal manera que si el subcomando sale prematuramente, el CLI de Mocha Remote también saldrá. Y por y viceversa. Así que también asegura que el código de estado correcto se propague cuando las pruebas fallan en el dispositivo o el dispositivo se bloquea o lo que sea, el CLI de Mocha Remote obtendrá el correcto código de salida no cero.

Genial. Creo que casi es hora de las demostraciones. Solo quiero mostrar aquí, esto es lo que parece en un cliente. Obtiene la prueba, o suministras la función de prueba y obtiene un camino de contexto, este argumento, y puedes ver cómo este contexto es capaz de ser usado cuando instancias esta instancia de MyApp. Genial. Quiero mostrar primero la ejecución, invocando el CLI de Mocha Remote aquí en Node.js. Y

3. Ejecución de pruebas en Android, iOS y otras plataformas

Short description:

También podemos hacerlo para Android, iOS y otras plataformas. Maka era popular en 2016, pero ahora Jest es el estándar de facto en los proyectos de React Native. He iniciado el paquete Jest remote para soportar la ejecución de pruebas en un proceso Node separado. Otra alternativa, Vitest, está ganando atención de la comunidad web de React. Tiene un modo de navegador experimental y un corredor independiente de la plataforma.

esto inicia un proceso node separado que ejecuta las pruebas. También podemos hacerlo para Android aquí. Básicamente invocará el Metro, el paquete metro como una parte de él La otra parte del subcomando ejecutará el React Native CLI, y puedes ver que el emulador se iniciará y comenzará a requerir el paquete y ejecutar las pruebas. Y afortunadamente pasó, lo cual es genial. No quiero gastar tiempo, pero también podemos hacerlo para iOS.

Sí. Volvamos a las diapositivas. Bueno. Así que, Maka era popular en 2016 cuando empezamos el proyecto Realm.js. Se podría argumentar que todavía es popular con 7 millones de descargas semanales, pero no tan popular como Jest. Y Jest es el estándar de facto en los proyectos de React Native. Y por eso también he iniciado el paquete Jest remote. Está construido alrededor de la misma arquitectura y es una buena coincidencia porque el corredor de Jest es realmente enchufable desde el CLI. Así que es posible especificar este corredor Jest remote. Y actualmente, en su forma actual, como estoy grabando esto, soporta la ejecución de las pruebas en un proceso Node separado. Pero mi visión es, por supuesto, soportar todas las otras plataformas que también soportamos con Maka Remote.

Otro competidor, o se puede decir una alternativa a Jest, que está captando mucha atención de la comunidad web de React, especialmente, es Vitest. Y de mis investigaciones iniciales y conversaciones con los mantenedores, parece que esto será una mejor coincidencia ya que también tiene un modo de navegador experimental. Así que el corredor ya está construido de una manera que es independiente de la plataforma y del runtime.

Muchas gracias por su tiempo y atención. Esto es una rareza en estos días. Y espero que esto le haya resultado útil, especialmente si usted también es un mantenedor de un paquete como este. Y si tiene alguna pregunta, no dude en preguntar. Todos mis perfiles en las redes sociales están en mi perfil de Git Nation. Además, por favor ayúdame a construir esto para Vitest o Jest si quieres hacerlo, si tienes tiempo y crees que es interesante. Te deseo la mejor de las suertes con todos tus esfuerzos. Adiós y que tengas un excelente resto de tu día

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

Network Requests with Cypress
TestJS Summit 2021TestJS Summit 2021
33 min
Network Requests with Cypress
Top Content
Whether you're testing your UI or API, Cypress gives you all the tools needed to work with and manage network requests. This intermediate-level task demonstrates how to use the cy.request and cy.intercept commands to execute, spy on, and stub network requests while testing your application in the browser. Learn how the commands work as well as use cases for each, including best practices for testing and mocking your network requests.
Testing Pyramid Makes Little Sense, What We Can Use Instead
TestJS Summit 2021TestJS Summit 2021
38 min
Testing Pyramid Makes Little Sense, What We Can Use Instead
Top Content
Featured Video
Gleb Bahmutov
Roman Sandler
2 authors
The testing pyramid - the canonical shape of tests that defined what types of tests we need to write to make sure the app works - is ... obsolete. In this presentation, Roman Sandler and Gleb Bahmutov argue what the testing shape works better for today's web applications.
Full-Circle Testing With Cypress
TestJS Summit 2022TestJS Summit 2022
27 min
Full-Circle Testing With Cypress
Top Content
Cypress has taken the world by storm by brining an easy to use tool for end to end testing. It’s capabilities have proven to be be useful for creating stable tests for frontend applications. But end to end testing is just a small part of testing efforts. What about your API? What about your components? Well, in my talk I would like to show you how we can start with end-to-end tests, go deeper with component testing and then move up to testing our API, circ
Test Effective Development
TestJS Summit 2021TestJS Summit 2021
31 min
Test Effective Development
Top Content
Developers want to sleep tight knowing they didn't break production. Companies want to be efficient in order to meet their customer needs faster and to gain competitive advantage sooner. We ALL want to be cost effective... or shall I say... TEST EFFECTIVE!But how do we do that?Are the "unit" and "integration" terminology serves us right?Or is it time for a change? When should we use either strategy to maximize our "test effectiveness"?In this talk I'll show you a brand new way to think about cost effective testing with new strategies and new testing terms!It’s time to go DEEPER!
Playwright Test Runner
TestJS Summit 2021TestJS Summit 2021
25 min
Playwright Test Runner
Top Content
Everyone Can Easily Write Tests
TestJS Summit 2023TestJS Summit 2023
21 min
Everyone Can Easily Write Tests
Let’s take a look at how Playwright can help you get your end to end tests written with tools like Codegen that generate tests on user interaction. Let’s explore UI mode for a better developer experience and then go over some tips to make sure you don’t have flakey tests. Then let’s talk about how to get your tests up and running on CI, debugging on CI and scaling using shards.

Workshops on related topic

Designing Effective Tests With React Testing Library
React Summit 2023React Summit 2023
151 min
Designing Effective Tests With React Testing Library
Top Content
Featured Workshop
Josh Justice
Josh Justice
React Testing Library is a great framework for React component tests because there are a lot of questions it answers for you, so you don’t need to worry about those questions. But that doesn’t mean testing is easy. There are still a lot of questions you have to figure out for yourself: How many component tests should you write vs end-to-end tests or lower-level unit tests? How can you test a certain line of code that is tricky to test? And what in the world are you supposed to do about that persistent act() warning?
In this three-hour workshop we’ll introduce React Testing Library along with a mental model for how to think about designing your component tests. This mental model will help you see how to test each bit of logic, whether or not to mock dependencies, and will help improve the design of your components. You’ll walk away with the tools, techniques, and principles you need to implement low-cost, high-value component tests.
Table of contents- The different kinds of React application tests, and where component tests fit in- A mental model for thinking about the inputs and outputs of the components you test- Options for selecting DOM elements to verify and interact with them- The value of mocks and why they shouldn’t be avoided- The challenges with asynchrony in RTL tests and how to handle them
Prerequisites- Familiarity with building applications with React- Basic experience writing automated tests with Jest or another unit testing framework- You do not need any experience with React Testing Library- Machine setup: Node LTS, Yarn
How to Start With Cypress
TestJS Summit 2022TestJS Summit 2022
146 min
How to Start With Cypress
Featured WorkshopFree
Filip Hric
Filip Hric
The web has evolved. Finally, testing has also. Cypress is a modern testing tool that answers the testing needs of modern web applications. It has been gaining a lot of traction in the last couple of years, gaining worldwide popularity. If you have been waiting to learn Cypress, wait no more! Filip Hric will guide you through the first steps on how to start using Cypress and set up a project on your own. The good news is, learning Cypress is incredibly easy. You'll write your first test in no time, and then you'll discover how to write a full end-to-end test for a modern web application. You'll learn the core concepts like retry-ability. Discover how to work and interact with your application and learn how to combine API and UI tests. Throughout this whole workshop, we will write code and do practical exercises. You will leave with a hands-on experience that you can translate to your own project.
How to Solve Real-World Problems with Remix
Remix Conf Europe 2022Remix Conf Europe 2022
195 min
How to Solve Real-World Problems with Remix
Featured Workshop
Michael Carter
Michael Carter
- Errors? How to render and log your server and client errorsa - When to return errors vs throwb - Setup logging service like Sentry, LogRocket, and Bugsnag- Forms? How to validate and handle multi-page formsa - Use zod to validate form data in your actionb - Step through multi-page forms without losing data- Stuck? How to patch bugs or missing features in Remix so you can move ona - Use patch-package to quickly fix your Remix installb - Show tool for managing multiple patches and cherry-pick open PRs- Users? How to handle multi-tenant apps with Prismaa - Determine tenant by host or by userb - Multiple database or single database/multiple schemasc - Ensures tenant data always separate from others
Detox 101: How to write stable end-to-end tests for your React Native application
React Summit 2022React Summit 2022
117 min
Detox 101: How to write stable end-to-end tests for your React Native application
Top Content
WorkshopFree
Yevheniia Hlovatska
Yevheniia Hlovatska
Compared to unit testing, end-to-end testing aims to interact with your application just like a real user. And as we all know it can be pretty challenging. Especially when we talk about Mobile applications.
Tests rely on many conditions and are considered to be slow and flaky. On the other hand - end-to-end tests can give the greatest confidence that your app is working. And if done right - can become an amazing tool for boosting developer velocity.
Detox is a gray-box end-to-end testing framework for mobile apps. Developed by Wix to solve the problem of slowness and flakiness and used by React Native itself as its E2E testing tool.
Join me on this workshop to learn how to make your mobile end-to-end tests with Detox rock.
Prerequisites- iOS/Android: MacOS Catalina or newer- Android only: Linux- Install before the workshop
API Testing with Postman Workshop
TestJS Summit 2023TestJS Summit 2023
48 min
API Testing with Postman Workshop
Top Content
WorkshopFree
Pooja Mistry
Pooja Mistry
In the ever-evolving landscape of software development, ensuring the reliability and functionality of APIs has become paramount. "API Testing with Postman" is a comprehensive workshop designed to equip participants with the knowledge and skills needed to excel in API testing using Postman, a powerful tool widely adopted by professionals in the field. This workshop delves into the fundamentals of API testing, progresses to advanced testing techniques, and explores automation, performance testing, and multi-protocol support, providing attendees with a holistic understanding of API testing with Postman.
1. Welcome to Postman- Explaining the Postman User Interface (UI)2. Workspace and Collections Collaboration- Understanding Workspaces and their role in collaboration- Exploring the concept of Collections for organizing and executing API requests3. Introduction to API Testing- Covering the basics of API testing and its significance4. Variable Management- Managing environment, global, and collection variables- Utilizing scripting snippets for dynamic data5. Building Testing Workflows- Creating effective testing workflows for comprehensive testing- Utilizing the Collection Runner for test execution- Introduction to Postbot for automated testing6. Advanced Testing- Contract Testing for ensuring API contracts- Using Mock Servers for effective testing- Maximizing productivity with Collection/Workspace templates- Integration Testing and Regression Testing strategies7. Automation with Postman- Leveraging the Postman CLI for automation- Scheduled Runs for regular testing- Integrating Postman into CI/CD pipelines8. Performance Testing- Demonstrating performance testing capabilities (showing the desktop client)- Synchronizing tests with VS Code for streamlined development9. Exploring Advanced Features - Working with Multiple Protocols: GraphQL, gRPC, and more
Join us for this workshop to unlock the full potential of Postman for API testing, streamline your testing processes, and enhance the quality and reliability of your software. Whether you're a beginner or an experienced tester, this workshop will equip you with the skills needed to excel in API testing with Postman.
Relational Database Modeling for GraphQL
GraphQL Galaxy 2020GraphQL Galaxy 2020
106 min
Relational Database Modeling for GraphQL
Top Content
WorkshopFree
Adron Hall
Adron Hall
In this workshop we'll dig deeper into data modeling. We'll start with a discussion about various database types and how they map to GraphQL. Once that groundwork is laid out, the focus will shift to specific types of databases and how to build data models that work best for GraphQL within various scenarios.
Table of contentsPart 1 - Hour 1      a. Relational Database Data Modeling      b. Comparing Relational and NoSQL Databases      c. GraphQL with the Database in mindPart 2 - Hour 2      a. Designing Relational Data Models      b. Relationship, Building MultijoinsTables      c. GraphQL & Relational Data Modeling Query Complexities
Prerequisites      a. Data modeling tool. The trainer will be using dbdiagram      b. Postgres, albeit no need to install this locally, as I'll be using a Postgres Dicker image, from Docker Hub for all examples      c. Hasura