2017-03-18 6 views
0

Actuellement, je le fais de cette façon (pseudocode):Comment tester les flux client-serveur avec boost :: Test

#include <boost/test/unit_test.hpp> 
#include <string> 

bool testingClient = true; 

BOOST_AUTO_TEST_SUITE(ProtocolSchema) 
BOOST_AUTO_TEST_CASE(server) 
{ 
    testingClient = false; 
    // start server listener 
    FILE *client_stdout = popen((argv[0] + std::string(" --run_test=ProtocolSchema/client 2>&1")).c_str(), "r"); 
    for (1000ms) 
    { 
     // listen for ping, reply with a pong 
    } 
    pclose(fl); 
} 

BOOST_AUTO_TEST_CASE(client) 
{ 
    if (!testingClient) 
     return; 
    // send ping to the server 
    // check that it replies with a pong 
} 
} 

L'idée est claire: boost::test tests runs de manière séquentielle, une fois qu'il essaie d'exécuter serveur, le test de l'unité du serveur retourne testingClient de cette façon le prochain test ne fait tout simplement rien et se termine. Le test du serveur démarre le même exécutable de test avec le paramètre run_test défini pour exécuter le test client uniquement. Dans le deuxième processus testingClient drapeau n'est pas retourné, cela le fait réellement exécuter le test client.

Existe-t-il un moyen approprié de faire ce genre de test unitaires client-serveur avec boost :: test? Dans mon cas, tous les journaux de test du processus client sont en quelque sorte perdus: il faudrait que je les fread from client_stdout et que j'écrive tout cela dans BOOST_MESSAGE?

+0

on dirait que vous pouvez certainement utiliser [appareils] (http://www.boost.org/doc/libs/1_63_0/libs/test/doc/html/ boost_test/tests_organization/fixtures.html). –

+0

Nous les utilisons, mais cela n'aidera pas dans mon cas. Il n'a pas de relation avec le démarrage de processus séparés (je ne peux pas les exécuter dans le même processus) – Pavel

Répondre

0

Comme mentionné un appareil vous aidera à:

  • mise en place du serveur avant le test
  • tuer ce serveur après le test

Configuration du serveur signifie que vous démarrez une autre thread dans l'appareil (garder une trace de ce fil ou toute signalisation vous permettant de communiquer avec ce fil). Ce fil devrait être vivant pendant la durée du test. Dans le démontage de l'appareil, signalez simplement le fil pour sortir.

Je voudrais éviter d'appeler le même module de test avec des paramètres différents, comme vous le suggérez, pour diverses raisons:

  • le serveur est en fait pas un test: si vous exécutez le module de test sans par exemple. n'importe quel paramètre sur la ligne de commande, alors ce serveur fonctionnera, ce que vous voulez éviter en dehors des tests
  • vous n'avez pas/peu de contrôle sur la durée de vie du serveur, et il est difficile d'un test de vérifier que le serveur est en fait en cours d'exécution

Hope this helps