2009-07-23 8 views
2

Je suis chargé d'écrire des tests unitaires pour une suite de logiciels en réseau écrits en python. Écrire des unités pour les constructeurs de message et d'autres méthodes statiques est très simple, mais j'ai frappé un mur quand il s'agit d'écrire des tests pour les threads en boucle réseau. Par exemple: Le serveur auquel il se connecte peut être sur n'importe quel port, et je veux pouvoir tester la possibilité de se connecter à de nombreux ports (en séquence, pas en parallèle) sans avoir à exécuter de nombreux serveurs. Quel est un bon moyen d'aborder cela? Peut-être faire de la construction et de la destruction du serveur une partie du test? Quelque chose me dit qu'il doit y avoir une réponse plus simple qui m'échappe.en utilisant pyunit sur un thread réseau

Je dois imaginer qu'il existe des méthodes pour tester les unités de réseau en réseau, mais je n'arrive pas à en trouver.

Répondre

1

Je voudrais essayer d'introduire une usine dans votre code existant qui est censé créer des objets socket. Ensuite, dans un test de simulation dans une fausse usine qui crée des faux sockets qui prétendent simplement être connectés à un serveur (ou non pour des cas d'erreur, que vous voulez aussi tester, n'est-ce pas?) Et consigner le trafic de messages pour prouver que votre code a utilisé les bons ports pour se connecter aux bons types de serveurs. Essayez de ne pas utiliser de threads pour l'instant, pour simplifier les tests.

0

Cela dépend de la manière dont votre logiciel réseau est mis en couches et de la précision de vos tests, mais il est certainement possible dans certains scénarios de configurer le serveur et d'effectuer une partie du test. Par exemple, quand je travaillais sur le paquetage de journalisation Python (avant qu'il ne devienne une partie de Python), j'ai eu un test (je n'ai pas utilisé pyunit/unittest - c'était juste un script ad-hoc) qui a déclenché (dans un test) quatre serveurs à écouter sur les ports TCP, UDP, HTTP et HTTP/SOAP, puis leur a envoyé du trafic réseau. Si vous êtes intéressé, la distribution est here et le script de test pertinent dans l'archive à regarder est log_test.py. Le paquetage de journalisation de Python est bien sûr venu depuis lors, mais l'ancien paquet est toujours là pour être utilisé avec les versions de Python < 2.3 et> = 1.5.2.

0

J'ai quelques cas de test qui exécutent un serveur dans le setUp et le ferment dans le tearDown. Je ne sais pas si c'est une façon très élégante de le faire mais ça marche pour moi. Je suis heureux de l'avoir et cela m'aide beaucoup.

Si le serveur init est très long, une alternative serait de l'automatiser avec ant. Ant exécuterait/arrêterait le serveur avant/après l'exécution des tests.

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

0

Vous devez créer des sockets fictifs. La façon exacte de le faire dépend de la façon dont vous créez des sockets et la création d'un générateur de sockets serait une bonne idée. Vous pouvez également utiliser une bibliothèque moqueuse comme pymox pour vous simplifier la vie. Il peut également éventuellement éliminer le besoin de créer un générateur de socket uniquement dans le seul but de tester.

vous feriez quelque chose comme aide pymox, 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() 
Questions connexes