Constrúyalo sobre una API de plataforma simple con implementaciones reales y simuladas. Ese es un proyecto de semanas-hombre que se amortiza cuando corrige su primer error en horas que hubieran tardado al menos semanas sin el entorno simulado si pudiera solucionarlo.
En mi último sistema (almacenamiento de valor clave persistente de alto rendimiento con contenedores que podrían ser fuertes o eventualmente consistentes) eso fue
- register_recv toma un identificador de servicio, cierre + contexto de ejecución aplicado al recibirlo
- send_msg toma un mensaje / metadatos y cierre opcional + contexto de ejecución para la respuesta. Los mensajes podrían incluir tiempos de espera, y cerqué las respuestas obsoletas en la capa de mensajería.
- un contexto de ejecución predeterminado
- un visualizador cronometrado de eventos
- gettime devolviendo la hora actual
- un PRNG
donde el contexto de ejecución es un despachador de mensajes que aprovecha uno (para la lógica principal) o más (colocando una fachada controlada por eventos en la parte superior de las API con hilos u operaciones vinculadas a la CPU), con un solo contexto de un solo hilo compartido para el entorno de prueba que permite la repetición orden de ejecución cuando el PRNG tiene la misma semilla.
- ¿Qué buscan la mayoría de los programadores e ingenieros de software en su entorno de trabajo ideal?
- ¿Cuáles son los requisitos para ser desarrollador de software?
- ¿Es posible que alguien se convierta en un desarrollador de software competente enseñándose a sí mismo? Si es así, ¿cuál es una lista de todos los recursos gratuitos que incluiría si desarrollara un curso intensivo de desarrollo de software en el hogar?
- ¿Cómo cambio mi trabajo de desarrollador de software a analista de negocios? Quiero interactuar más con las personas y resolver problemas comerciales reales.
- ¿Qué software usan los equipos de cricket para analizar el desempeño de los otros equipos? ¿De dónde sacan los datos? ¿Cómo lo visualizan? ¿Quién desarrolla este software?
Pasé node-id como parámetro de construcción a cada componente, aunque eso también podría provenir de la API.
En el entorno de prueba, me burlé de la capa de mensajería y el servicio de persistencia, con el bloqueo de nodo simulado desconectando la mensajería y la persistencia y luego liberando el estado. Admití rangos de retardo configurables en la capa de mensajería para permitir perturbar el orden de ejecución. Simulé el tiempo avanzando a la hora del próximo evento programado cuando el sistema se quedó inactivo.
Luego, utilícelo para escribir pruebas deterministas y operaciones pseudoaleatorias o búsquedas de estado validadas contra modelos de corrección. Por ejemplo, las lecturas de una tienda muy consistente no pueden devolver una versión anterior de los datos después de que se haya observado una nueva a través de una lectura o implícita a través de una escritura exitosa.
Hablo más sobre esto en la respuesta de Drew Eckhardt a ¿Cuáles son las mejores prácticas para depurar sistemas / algoritmos distribuidos? y la respuesta de Drew Eckhardt a ¿Cómo diseña / diseña Drew Eckhardt un sistema distribuido que pueda simularse determinísticamente en un solo hilo / proceso para probarlo?
Antes de escribir el software, también desea validar sus protocolos subyacentes a través de TLA + o Promela / Spin, aunque aún necesita verificar el modelo del código completado para encontrar y luego corregir los errores de implementación.
Antes de que los sistemas distribuidos se convirtieran en una necesidad comercial, las personas no sabían mejor y probaron el enfoque de proceso por separado con malos resultados, como eliminar la primera versión de los productos porque los errores del protocolo no se podían arreglar. Ahora lo sabemos mejor y no quieres seguir viviendo en esa cultura primitiva.
Puede (y debe obtener una mejor cobertura de código) realizar pruebas de integración separadas utilizando procesos y luego completar máquinas (virtuales o reales). Combine eso con la inyección de fallas en el nivel bajo de la biblioteca (libc) o del sistema operativo (controlador de filtro de Windows) para obtener aún más confianza en sus rutas de error.