Pergunta

Estou escrevendo um cliente Python+servidor que usa gevent.socket para comunicação. Existem boas maneiras de testar a operação no nível do soquete do código (por exemplo, verificar se as conexões SSL com um certificado inválido serão rejeitadas)? Ou é mais simples para apenas spawn um servidor real?

Editar: Não acredito que zombaria "ingênua" seja suficiente para testar os componentes SSL por causa das interações complexas envolvidas. Estou errado nisso? Ou existe uma maneira melhor de testar coisas de ssl?

Foi útil?

Solução

Você pode iniciar facilmente um servidor e depois acessá -lo em um caso de teste. O gevent's Suíte de teste próprio faz exatamente isso para testar o gevent servidores internos.

Por exemplo:

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 o valor da porta, significa que o servidor usará qualquer porta disponível. Depois que o servidor é iniciado, o valor real escolhido por bind está disponível como server_port atributo.

StreamServer suporta SSL também, passe keyfile e certfile argumentos para o construtor e ele envolverá cada soquete com SSLObject antes de passar para o seu manipulador.

Se você não usa StreamServer e seu servidor é baseado em Greenlet Então, de fato desova É o que você deve fazer. Não se esqueça de matar no final do caso de teste.

Iniciar um servidor e gerar uma Greenlet são operações rápidas em Gevent, muito mais rápido do que criar um novo thread ou processo e você pode criar facilmente um novo servidor para cada caso de teste. Só não se esqueça de limpar assim que não precisar mais do servidor.

Acredito que não há necessidade de zombar de nenhuma API da Gevent, é muito mais fácil usá -lo, pois servidores e clientes podem viver com prazer no mesmo processo.

Outras dicas

Existe outra maneira (IMO melhor): você deve zombar da biblioteca que está usando. Um exemplo de ajudante de zombaria para Python é Mox.

Você não precisa de um conjunto de servidores com um certificado válido, outro com um certificado inválido, sem suporte SL . A maneira como funciona com o Mox é você primeiro "ensine" o que deve esperar e como deve reagir e, em seguida, você executa seu código real enquanto troca o verdadeiro genetrocetido. Requer alguma prática para pegar o jeito, mas vale a pena.

Zombando e malhas são ótimos, mas às vezes você precisa levá -lo ao próximo nível de integração. Como a desova de um servidor, mesmo falsa, pode levar algum tempo, considere um conjunto de testes separado (ligue para os testes de integração) pode estar em ordem.

"Teste como você vai usá -lo" é a minha diretriz e, se você zombar e tirar tanto que seu teste se torne trivial, não é tão útil (embora quase qualquer teste seja melhor do que nenhum). Se você está preocupado em lidar com os certificados SSL ruins, faça alguns ruins e escreva um acessório de teste para o qual você possa alimentá -los. Se isso significa desova de um servidor, que assim seja. Talvez se isso o incomodar o suficiente, isso levará a uma refatoração que o tornará testável de outra maneira.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top