Pregunta

Estoy encargado de las pruebas de unidad de escritura para un paquete de software en red escrito en Python. Unidades de redacción para los constructores de mensajes y otros métodos estáticos es muy simple, pero he golpeado una pared cuando se trata de escribir unas pruebas para la red de bucle hilos.

Por ejemplo: El servidor se conecta a que podría ser en cualquier puerto, y quiero ser capaz de probar la capacidad de conectarse a numerosos puertos (en secuencia, no paralelo) sin tener que ejecutar varios servidores. ¿Qué es una buena manera de abordar esto? Tal vez hacer que la construcción del servidor y la destrucción de parte de la prueba? Algo me dice que debe haber una respuesta más simple que me evade.

Tengo que imaginar que hay métodos para las pruebas unitarias hilos conectados en red, pero me parece que no puede encontrar ninguna.

¿Fue útil?

Solución

Me gustaría tratar de introducir una fábrica en su código existente que pretende crear objetos de socket. Luego, en un pase de prueba en una fábrica de simulacro que crea enchufes simulados que se pretender que ha conectado a un servidor (o no para los casos de error, que también se desea probar, ¿verdad?) Y registrar el tráfico de mensajes para probar que el código ha utilizado los puertos adecuados para conectarse a los tipos correctos de los servidores.

Trate de no usar hilos por el momento, para simplificar las pruebas.

Otros consejos

Depende de cómo el software de red es en capas y el grado de detalle que desea que sus pruebas sean, pero es ciertamente factible en algunos escenarios que hacen que la configuración del servidor y desmontaje parte de la prueba. Por ejemplo, cuando estaba trabajando en el paquete de registro de Python (antes de convertirse en parte de Python), que tenía una prueba (no hice uso de pyunit / unittest - que era sólo un guión ad-hoc), que puso en marcha (en una prueba) cuatro servidores para escuchar en TCP, UDP, HTTP y HTTP / puertos SOAP, y luego se envían tráfico de red para ellos. Si está interesado, la distribución es aquí y la escritura de la prueba correspondiente en el archivo que mirar es log_test.py. El paquete de registro de Python tiene, por supuesto, llegado de alguna manera desde entonces, pero el paquete de edad todavía está alrededor para su uso con versiones de Python <2,3 y> = 1.5.2.

He algunos casos de prueba que se ejecutan en un servidor de la configuración y la cierran en el tearDown. No sé si se trata de manera muy elegante de hacerlo, pero funciona por mí.

Estoy feliz de tenerlo y me ayuda mucho.

Si el servidor de inicio es muy larga, una alternativa sería la de automatizarlo con la hormiga. hormiga ejecutar / detener el servidor antes / después de ejecutar las pruebas.

aquí para muy interesante tutorial sobre hormigas y Python

Usted tendría que cree sockets de simulacros. La forma exacta de hacerlo sería dependerá de cómo cree sockets y la creación de un generador toma sería una buena idea. También puede utilizar una biblioteca de burla como pymox para hacer su vida más fácil. También puede eliminar posiblemente la necesidad de crear un generador toma sólo para el único propósito de probar.

El uso de pymox, que haría algo como esto:

def test_connect(self):
    m = mox.Mox()
    m.StubOutWithMock(socket, 'socket')
    socket_mock = m.MockAnything()
    m.socket.socket(socket.AF_INET, socket.SOCK_STREAM).AndReturn(socket_mock)
    socket_mock.connect(('test_server1', 80))
    socket_mock.connect(('test_server2', 81))
    socket_mock.connect(('test_server3', 82))

    m.ReplayAll()
    code_to_be_tested()
    m.VerifyAll()
    m.UnsetStubs()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top