La automatización de pruebas es diferente para las aplicaciones

Foto de Lewis Ngugi en Unsplash

Mientras trabajaba en SimplyVital Health durante los últimos 6 meses, adquirí una gran experiencia con las tecnologías adyacentes y y quería que la información que aprendí estuviera disponible para otros. Como tal, este artículo está destinado tanto a desarrolladores de software nuevos en Dapps como a legos y laicos interesados. En resumen, probar aplicaciones asociadas con la tecnología requiere acceder al comportamiento de , así como probar el código que media las actividades de .

Contexto y entorno El contrato inteligente El Front End Marcos de prueba Consideraciones diversas

Las pruebas de software son vitales para cualquier esfuerzo basado en la tecnología. Determinar si una determinada aplicación está funcionando correctamente es clave no solo para la funcionalidad inmediata de la aplicación, sino también para los objetivos de sostenibilidad, mantenibilidad y escalabilidad a mediano y largo plazo. Las pruebas automatizadas, en particular, pueden contribuir significativamente a estos objetivos al proporcionar consistencia y profundidad para probar la cobertura a medida que una aplicación cambia y crece con el tiempo.

Cuando se trata de aplicaciones basadas en (aplicaciones descentralizadas, "Dapps", como los conocen los programadores de ), un probador a menudo tendrá que lidiar con asincrónico naturaleza de la cadena de bloques. ¿Qué significa "asincrónico"? Existen muchas perspectivas sobre los detalles prácticos y técnicos de los entornos "asíncronos" (p. Ej., Para el material relacionado con Javascript, consulte el libro "Async & Performance" de Kyle Simpson), pero basta con decir que un entorno de codificación "asíncrono" es uno en el que los resultados de funciones se devuelven siempre que estén listas frente a regresar en el orden en que se colocaron.

diagrama del comportamiento de la función síncrona versus asíncrona

Las cadenas de bloques funcionan de esta manera. Además, su comportamiento asincrónico está sujeto a la velocidad de la red en la que se ejecutan. Además, para que se procese un bloque / transacción (una porción de código que se ejecuta contra un "contrato inteligente" regulador), la transacción debe ser validada por un "nodo de minería" en esa cadena de bloques. Un "nodo de minería" es una computadora que agrega bloques a la cadena de bloques gastando electricidad para ejecutar el código de la transacción con el fin de obtener una recompensa en forma de tarifas de transacción y recompensas. Un minero (el individuo o entidad que ejecuta el nodo de minería) puede elegir validar o no un bloque en función de su recompensa, lo que agrega una capa adicional de incertidumbre al entorno . Además, el bloque debe ser aceptado en la red a través de un consenso mayoritario entre la población de nodos mineros. Esta falta de velocidad constante, aunque no necesariamente problemática en sí misma, agrega complejidad adicional a un entorno ya asincrónico. Para que un conjunto de pruebas automatizadas sea coherente, deberá interactuar directamente con las transacciones, a menudo mediante la lectura de los recibos y confirmaciones de las transacciones.

Teniendo en cuenta estos detalles, los dos entornos concretos con los que tendrá que lidiar un conjunto de pruebas automatizadas para un Dapp son 1) el contrato inteligente en sí y 2) el front-end y sus interacciones / respuestas a las actividades en la cadena de bloques.

Lo que está en juego para probar un contrato inteligente es significativamente mayor que para otros aspectos de una aplicación basada en la cadena de bloques. Si la lógica y las funciones de un contrato inteligente se construyen de manera deficiente, insegura o ineficiente, los problemas resultantes pueden agravarse rápidamente. Más allá de las preocupaciones de seguridad inmediatas, cada actualización de un contrato inteligente requiere la migración de todas las transacciones anteriores. Si no se produce esta migración, las transacciones anteriores se pueden perder y la inmutabilidad de la cadena de bloques (uno de sus principales beneficios) puede verse comprometida. Por lo tanto, las blockchains rara vez se actualizan, excepto cuando es absolutamente necesario (por ejemplo, la violación de DAO 2016 de Ethereum y la bifurcación resultante). Además, el código conciso aumentará las posibilidades de que sus transacciones se procesen, ya que es menos costoso para los nodos mineros ejecutar un contrato más pequeño. Es importante obtener el contrato correcto desde el principio, para mitigar estos problemas.

El marco Truffle es una herramienta común para la automatización de pruebas de contratos inteligentes. Las pruebas de Truffle se pueden escribir en Javascript o Solidity y utilizar cuentas de prueba que se ejecutan contra una instancia local de la cadena de bloques Ethereum. Es importante tener en cuenta que, si bien la prueba Truffle puede proporcionar comentarios claros y eficientes sobre el comportamiento de su contrato inteligente, el entorno de prueba también es mucho más estable y simple que la red principal de Ethereum. No obstante, los beneficios de la retroalimentación de este entorno de prueba superan en gran medida las posibles deficiencias.

ejemplo de la CLI de Ganache

Truffle utiliza el marco Mocha y la biblioteca de afirmación Chai (ambas también son aplicables a las pruebas de front-end) para probar los valores esperados de los recibos y cuentas de . Por ejemplo, puede asegurarse de que, dado un precio de gas particular y el tamaño de la transacción, se hayan retirado los fondos adecuados de la cuenta de envío para una transacción. También puede probar los permisos enviando una transacción errónea y atrapando y esperando la respuesta de error adecuada.

El front-end de una aplicación basada en puede ser muy similar al front-end de cualquier otra aplicación; No existe un enfoque específico para el diseño front-end que debe tener una aplicación basada en . Sin embargo, si se pretende que el front end muestre cualquiera de las acciones de a sus usuarios, p. transacciones enviadas, pendientes o recibidas: se deberá acceder a esas funciones dentro de las pruebas de front-end. Y si los propios usuarios están destinados a proporcionar, acceder e interactuar con sus propias billeteras y moneda, esto deberá tenerse en cuenta. Hay varias bibliotecas de terceros para proporcionar este tipo de acceso a las billeteras, pero para el probador, puede resultar difícil administrarlas, dependiendo del método o métodos de acceso a estas billeteras y sus dependencias.

Incluso si la cadena de bloques está destinada a permanecer completamente en el fondo de una aplicación, si las funciones relacionadas con la cadena de bloques de la aplicación están destinadas a ser probadas, los métodos simples "async / wait" podrían no funcionar. A menudo es más confiable y eficiente esperar explícitamente los recibos y las confirmaciones de las actividades de . Este tipo de funcionalidad puede ser proporcionada por bibliotecas de terceros como Web3 o ethjs.

* a través de https://etherscan.io/chart/blocktime

Al igual que el entorno de prueba Ganache de Truffle, varias cadenas de bloques, incluido Ethereum, proporcionan redes de prueba públicas para que los desarrolladores se ejecuten. Algunas de estas redes de prueba en la cadena de bloques Ethereum incluyen Rinkeby, Ropsten y Kovan. Estas redes de prueba a menudo ofrecen moneda gratuita, aunque limitada, ("ether", en el caso de Ethereum) para utilizar durante las pruebas. Estos entornos de prueba no solo reducen drásticamente el costo de ejecutar pruebas en una cadena de bloques, sino que brindan un tiempo de respuesta más realista, con transacciones que toman el tiempo de respuesta estándar (aunque aún muy variable) de 10-20 segundos *, en comparación con el de Ganache tasa de respuesta de fuego rápido. (Por cierto, SimplyVital Health está trabajando actualmente en una solución a la velocidad inmensamente variable de la propagación en bloque, financiada por la National Science Foundation: https://www.beckershospitalreview.com/healthcare-information-technology/simplyvital-health-receives-grant -to-estudio-integrando-blockchains.html)

Dependiendo de la cobertura requerida, hay varias pruebas diferentes que uno podría implementar. Las pruebas de "unidad", que verifican la presentación más básica y las características de una aplicación, pueden realizarse usando Chai, Mocha y el corredor de prueba, Karma. Las pruebas "funcionales" y "de extremo a extremo", que verifican la funcionalidad completa de una aplicación desde la primera interacción a través de todos los detalles de sus características, pueden imitar la perspectiva del usuario construyendo un Modelo de objetos de página y utilizando Selenium y Protractor. Como se mencionó anteriormente, Truffle Suite se puede usar para probar directamente la lógica y la funcionalidad de su contrato inteligente (nuevamente, ¡un contrato inteligente debe probarse exhaustivamente antes de la implementación!). Aquí hay una lista de varios marcos:

Marcos de prueba de la unidad frontal

Front-End End-to-End / Marcos de prueba funcionales

Marcos de prueba de contrato inteligente

Un conjunto de pruebas completo para un Dapp utilizará una combinación de marcos para validar la funcionalidad principal tanto del contrato inteligente como del front-end. Para probar la aplicación Nexus de SimplyVital Health, utilizamos principalmente los marcos Truffle y Protractor, los cuales utilizan Jasmine y Chai.

Números grandes: los valores de las direcciones de billetera y los precios de la gasolina no siempre se ajustan a las variables estándar de JavaScript. Las bibliotecas “Big Number” dividen números más grandes en cadenas para obtener variables más manejables. A menudo, estas bibliotecas contendrán sus propias matemáticas y lógica.

¿Quiere probar o implementar cualquiera de las tecnologías mencionadas anteriormente? Consulte Nexus, la aplicación web basada en de código abierto de SimplyVital Health.

A partir de la publicación de este artículo (enero de 2020), ¡SimplyVital Health está contratando! Actualmente estamos buscando Principios de Front-end, Dev-ops, e ingenieros de seguridad y científicos de datos de atención médica. Visite los siguientes sitios para obtener más información:

https://angel.co/company/simplyvital-health

https://www.simplyvitalhealth.com/

https://www.facebook.com/SimplyVitalHealth/

Contribuya a la discusión en los comentarios a continuación. ¡Gracias por leer!