.net - recibir - ¿Cómo se prueba un servidor TCP? ¿Vale la pena?
sockets en java enviar y recibir (8)
Lo primero que debe hacer es separar el comportamiento (s) de los paquetes TCP que son entrantes. Resúmalo en una mesa de despacho u otra cosa similar.
Luego escriba pruebas unitarias para cada uno de los comportamientos independientemente de cómo fueron invocados. Puede probar la capa final de comportamiento TCP -> con una herramienta de prueba que escriba o tome prestada. Esa capa debería ser casi trivial si el código se considera adecuadamente.
Estoy desarrollando un pequeño servidor TCP, que procesará algunos paquetes TCP y se comportará de manera diferente en función de la solicitud.
¿Cómo puedo escribir la prueba de unidad para esto? Si es realmente difícil de escribir, ¿vale la pena el esfuerzo?
No puedo darte ningún ayudante específico ya que tu pregunta es bastante abierta.
Sin embargo, parece como si quisiera escribir un servidor / cliente simulado según sus necesidades. Valdría la pena mirar a Rhino Mocks .
También es posible que desee echar un vistazo al proyecto NMemCached de Oren que implementa un servidor de caché utilizando una implementación TCP / IP personalizada. Ese proyecto tiene algunas pruebas de unidad / integración interesantes escritas usando Rhino Mocks.
No sé nada de .net, pero puedo contarte sobre las pruebas unitarias.
Necesitas factorizar las cosas. Por ejemplo, su servidor puede ejecutarse en un hilo y hacer algún trabajo. Donde hace el trabajo debe estar dentro de una función. Probablemente también tenga un objeto de solicitud. Haga que la "función de trabajo" del servidor tcp tome el objeto de solicitud como parámetro. Luego, realice la prueba unitaria como de costumbre: al comienzo de la prueba, configure la solicitud y páselo a la "función de trabajo" del objeto del servidor tcp. En realidad, no tiene los enchufes abiertos del servidor ni nada. Solo está probando las unidades de los métodos que hacen el trabajo, y solo probando el manejo de la solicitud. No está probando conectores o confiabilidad de red ni nada de eso. Necesitas probar eso de otra manera.
Puede echar un vistazo a NMock , una biblioteca burlona para .NET. Si dos partes están involucradas en una prueba unitaria, siempre es bueno simplemente "burlarse" de una de las partes (la que no está probando, en ese caso, el Cliente).
Sin embargo, esto requerirá algunos cambios en su código, pero créanme, vale la pena.
Si escribe un servidor TCP, también debería estar escribiendo una biblioteca cliente. A menos que esté haciendo algo elegante, simplemente puede disparar paquetes sobre el adaptador de bucle invertido entre la prueba de su unidad y el servidor stub. Solo necesita verificar que está haciendo TCP correctamente con estas pruebas, ya que el resto de sus pruebas deberían, en la forma de prueba de la unidad adecuada, anular / omitir la lógica de TCP / socket y saltar directamente a la unidad individual que se está probando.
Hacer todo esto vale la pena. Si eres lo suficientemente nuevo como para TCP y no estás seguro de cómo y por qué debes probarlo en una unidad, es probable que cometas algunos errores / suposiciones erróneas sobre cómo escribir tu código TCP, y las pruebas unitarias serán invaluables para las llamadas. que fuera. También encontrará que lo alienta a concentrarse más en las necesidades del cliente, lo que tiende a generar un protocolo más limpio y una base de código de servidor más limpia.
Sin duda vale la pena el esfuerzo. Lo que he dominado para una aplicación basada en servidor pequeño HTTP = en la que estoy trabajando es tener una serie de scripts que activan solicitudes en el servidor utilizando wget . Luego usé diff para comparar el resultado de wget guardado con lo que esperaba obtener, e informar cualquier referencia. Ejecuto este conjunto de scripts cada vez que cambio el servidor, y ha captado muchos errores.
Obviamente, esto solo funciona para los servidores HTTP, pero valdrá la pena escribir una pequeña aplicación que pueda activar las solicitudes TCP en su servidor y guardar los resultados.
Valdrá la pena.
El número de pruebas unitarias debe coincidir con el tipo de solicitudes (comportamientos diferentes). Esto será útil cuando realice modificaciones y vea si impactó o no en otras partes del servidor TCP.
Puede imitar el envío de paquetes TCP con varias herramientas disponibles. Déjame saber como va.
Intentaría extraer el bit específico de TCP del bit de procesamiento. ¿Su protocolo está realmente basado en paquetes o está basado en flujos? Si se basa en secuencias, puede hacer que la parte de procesamiento acepte una transmisión (o posiblemente un par de secuencias, una para entrada y otra para salida) y alimentarla con un MemoryStream
o su propia implementación de secuencia similar para tener un poco más de control.
De cualquier manera, básicamente quieres burlar el lado de la red de las cosas para que puedas probar la lógica real sin tener que involucrar a la red en absoluto. Probando la capa de red (es decir, la parte delgada de la lógica entre las clases de red de la infraestructura y la lógica de procesamiento) puede ser un poco más difícil, pero si puedes hacerlo lo suficientemente delgado no debería haber mucho para probar.