Puede iniciar fácilmente un servidor y luego acceder a él en un caso de prueba. El gevent own test suite hace exactamente eso para probar gevent built-in servers.
Por ejemplo:
class SimpleServer(gevent.server.StreamServer):
def handle(self, socket, address):
socket.sendall('hello and goodbye!')
class Test(unittest.TestCase):
def test(self):
server = SimpleServer(('127.0.0.1', 0))
server.start()
client = gevent.socket.create_connection(('127.0.0.1', server.server_port))
response = client.makefile().read()
assert response == 'hello and goodbye!'
server.stop()
Usando 0
para el valor del puerto significa que el servidor utilizará cualquier puerto disponible. Después de iniciar el servidor, el valor real elegido por bind
está disponible como atributo .
StreamServer
soporta SSL también, pasar keyfile
y certfile
argumentos al constructor y se envuelva cada toma de corriente con SSLObject
antes de pasarlo a su controlador.
Si no utiliza StreamServer
y su servidor se basa en Greenlet entonces de hecho spawning es lo que debe hacer. No se olvide de kill al final del caso de prueba.
Iniciar un servidor y generar un greenlet son operaciones rápidas en gevent, mucho más rápido que crear un nuevo hilo o proceso y puede crear fácilmente un nuevo servidor para cada caso de prueba. Solo no olvide limpiar tan pronto como ya no necesite el servidor.
Creo que no hay necesidad de burlarse de ninguna de las API de gevent, es mucho más fácil simplemente usarlo ya que los servidores y clientes pueden vivir felizmente dentro del mismo proceso.
Si tiene varias pruebas que crean un SimpleServer (tenga en cuenta que el número de puerto es el mismo) y ejecuta estas pruebas en paralelo, obtendrá bloqueos o fallas de prueba. – Sardathrion
El número de puerto en mi ejemplo es cero, lo que significa que bind() encontrará un puerto libre y lo usará. –
¿Cómo reacciona esto si no se genera en un punto verde separado? ¿Están 'connect' y' read' el bloqueo implícito? Sin embargo, gran ejemplo sobre la simplicidad y el poder de coroutines verdes :) – schlamar