Question

Je suis confié la tâche avec les tests unitaires d'écriture pour une suite de logiciels en réseau écrit en python. unités écriture pour les constructeurs de messages et d'autres méthodes statiques est très simple, mais je l'ai frappé un mur quand il s'agit d'écrire un des tests pour les fils en boucle réseau.

Par exemple: Le serveur se connecte à pourrait être sur un port, et je veux être en mesure de tester la capacité de se connecter à de nombreux ports (dans l'ordre, non parallèle) sans avoir à exécuter de nombreux serveurs. Ce qui est une bonne façon d'aborder ce sujet? Peut-être faire partie la construction et la destruction serveur de test? Quelque chose me dit qu'il faut une réponse plus simple qui me élude.

Je dois imaginer qu'il existe des méthodes pour les tests unitaires threads en réseau, mais je ne peux pas sembler trouver.

Était-ce utile?

La solution

Je voudrais essayer d'introduire une usine dans votre code existant qui est censé créer des objets socket. Puis, dans une passe de test dans une usine maquette qui crée des douilles fausses qui font semblant qu'ils ont connectés à un serveur (ou non pour les cas d'erreur, que vous souhaitez également tester, non?) Et connectez-vous le trafic de messages pour prouver que votre code a utilisé les ports droit de se connecter aux bons types de serveurs.

Essayez de ne pas utiliser les threads pour l'instant, pour simplifier les tests.

Autres conseils

Cela dépend de la façon dont votre logiciel de réseau est en couches et comment détaillée vous voulez que vos tests à, mais il est certainement possible dans certains scénarios pour faire la configuration du serveur et une partie décorticage du test. Par exemple, quand je travaillais sur le paquet d'enregistrement de Python (avant qu'il ne devienne une partie de Python), j'ai eu un test (je n'ai pas utilisé pyunit / unittest - il était juste un script ad hoc) qui a tiré vers le haut (dans un test) quatre serveurs pour écouter sur TCP, UDP, HTTP et HTTP / ports SOAP, puis envoyé le trafic réseau à leur disposition. Si vous êtes intéressé, la distribution est et script de test pertinent dans l'archive à regarder est log_test.py. Le package de journalisation Python a bien sûr venir d'une certaine façon, depuis lors, mais l'ancien paquet est toujours là pour être utilisé avec les versions de Python <2.3 et> = 1.5.2.

J'ai des cas de test qui exécutent un serveur dans la configuration et le fermer dans le tearDown. Je ne sais pas si elle est très élégante façon de le faire, mais il fonctionne de moi.

Je suis heureux de l'avoir et il me aide beaucoup.

Si l'initialisation du serveur est très longue, une alternative serait d'automatiser avec des fourmis. fourmi marche / arrêt du serveur avant / après l'exécution des tests.

Voir pour tutoriel très intéressant fourmi et python

Vous devez créer les sockets simulacres. La manière exacte de faire cela dépendra de la façon dont vous créez des prises et la création d'un générateur de courant serait une bonne idée. Vous pouvez également utiliser une bibliothèque comme se moquant pymox pour rendre votre vie plus facile. Il peut également éliminer éventuellement la nécessité de créer un générateur de socket juste pour le seul but de test.

En utilisant pymox, vous feriez quelque chose comme ceci:

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()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top