Question

J'écris un serveur client Python + que les utilisations gevent.socket pour la communication. Y a-t-il des bonnes façons de tester le fonctionnement au niveau socket du code (par exemple, vérifier que les connexions SSL avec un certificat non valide sera rejeté)? Ou est-ce plus simple juste spawn un vrai serveur?

Modifier : Je ne crois pas que se moquant « naïf » sera suffisant pour tester les composants SSL en raison des interactions complexes qui se posent. Ai-je tort dans tout cela? Ou est-il une meilleure façon de tester des choses SSL'd?

Était-ce utile?

La solution

Vous pouvez facilement démarrer un serveur et y accéder dans un cas de test. propre suite de tests de l'gevent fait exactement que pour le test de gevent intégrée dans les serveurs .

Par exemple:

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()

Utilisation 0 pour la valeur du port signifie que le serveur utilisera un port disponible. Une fois le serveur est démarré, la valeur réelle choisie par bind est disponible comme attribut server_port.

supports de StreamServer SSL aussi, transmettre des arguments de keyfile et certfile au constructeur et il se terminera chaque prise avec SSLObject avant de passer à votre gestionnaire.

Si vous n'utilisez pas StreamServer et votre serveur est basé sur Greenlet alors en effet fraie il est ce que vous devriez faire. Ne pas oublier de tuer à la fin du cas de test.

Démarrage d'un serveur et fraie un Greenlet sont des opérations rapides dans gevent , beaucoup plus rapide que de créer un nouveau thread ou processus et vous pouvez facilement créer un nouveau serveur pour chaque test. Il suffit de ne pas oublier de nettoyage dès que vous n'avez plus besoin du serveur.

Je crois qu'il n'y a pas besoin de se moquer de l'une des API gevent, il est beaucoup plus facile de l'utiliser comme serveurs et les clients peuvent vivre heureux dans le même processus.

Autres conseils

Il y a une autre (OMI meilleure): Vous devez se moquer de la bibliothèque que vous utilisez. Un exemple aide moqueur pour python est mox .

Vous n'avez pas besoin d'un ensemble de serveurs avec un certificat valide, une autre avec un certificat non valide, sans support ssl à tous, ceux qui ne répondent pas à tous les paquets à tous, etc. Vous pouvez simuler leur comportement avec un « factice "socket client. La façon dont il fonctionne avec Mox est d'abord vous « enseigner » ce qu'il doit attendre et comment il doit réagir et puis vous exécutez Votre code réel tout en échangeant le vrai gevent.socket pour celui moqué. Il exige une certaine pratique pour obtenir le blocage de celui-ci, mais ça vaut le coup.

Mocking et stubbing sont grands, mais parfois vous avez besoin de le prendre au prochain niveau d'intégration. Depuis fraie un serveur, même un fakeish, peut prendre un certain temps, envisager une suite de tests séparés (les appeler tests d'intégration) pourrait être dans l'ordre.

« Test comme vous allez l'utiliser » est ma ligne directrice, et si vous vous moquez et stub tant que votre test trivial devient ce n'est pas utile (bien que presque tout test est mieux que rien). Si vous êtes préoccupé par les mauvais traitement des certificats SSL, par tous les moyens faire quelques mauvais et écrire un appareil de test, vous pouvez les nourrir. Si cela signifie fraie un serveur, afin que ce soit. Peut-être que si que les bugs que vous assez cela conduira à un refactoring qui le fera testable une autre façon.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top