Maison > Java > le corps du texte

Pourquoi mes tests de serveur Java réussissent-ils lorsque j'ajoute une instruction System.out.println(in.readLine()) avant le test, mais échouent sans elle ?

王林
Libérer: 2024-02-22 13:34:06
avant
737 Les gens l'ont consulté

Réponse de l'éditeur php Yuzai : l'ajout de l'instruction System.out.println(in.readLine()) dans le test du serveur Java peut affecter les résultats du test, car cette instruction lira le flux d'entrée du serveur afin que le serveur puisse recevoir le demande. Sans cette instruction, le serveur risque de ne pas recevoir la requête correctement, entraînant l'échec du test. Par conséquent, l'ajout de cette instruction avant le test permet de garantir que le serveur peut recevoir la demande normalement et réussir le test.

Contenu de la question

J'essaie d'implémenter un serveur en Java pour gérer le jeu de dragueur de mines multijoueur. En essayant de tester mon serveur pour m'assurer qu'il répond correctement aux demandes légitimes des clients, j'ai découvert que seul l'ajout d'une instruction system.out.println(in.readline()) après l'impression d'une demande client spécifique sur le serveur permettrait de réussir le test. stream , mais avant d'appeler le test lui-même.

Par exemple, une demande qu'un client peut faire est une demande de « visualisation » pour voir l'état actuel du tableau. J'ai initialement écrit un test pour "look" comme ceci :

@test(timeout = 10000)
    public void publishedtest() throws ioexception {

        thread thread = startminesweeperserver("board5");

        socket socket = connecttominesweeperserver(thread);
        
        bufferedreader in = new bufferedreader(new inputstreamreader(socket.getinputstream()));
        printwriter out = new printwriter(socket.getoutputstream(), true);

        out.println("look");
        assertequals("- - - - - - -", in.readline());
        assertequals("- - - - - - -", in.readline());
        assertequals("- - - - - - -", in.readline());
        assertequals("- - - - - - -", in.readline());
        assertequals("- - - - - - -", in.readline());
        assertequals("- - - - - - -", in.readline());
        assertequals("- - - - - - -", in.readline());
Copier après la connexion

Cependant, lorsque j'exécute le test comme ceci, il échoue et je reçois un message d'erreur indiquant qu'il attendait [- - - - - - -] mais a obtenu [].

Mais quand j'ajoute une déclaration imprimée comme celle-ci :

@Test(timeout = 10000)
    public void publishedTest() throws IOException {

        Thread thread = startMinesweeperServer("board5");

        Socket socket = connectToMinesweeperServer(thread);

        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

        out.println("look");
        System.out.println(in.readLine());
        assertEquals("- - - - - - -", in.readLine());
        assertEquals("- - - - - - -", in.readLine());
        assertEquals("- - - - - - -", in.readLine());
        assertEquals("- - - - - - -", in.readLine());
        assertEquals("- - - - - - -", in.readLine());
        assertEquals("- - - - - - -", in.readLine());
        assertEquals("- - - - - - -", in.readLine());
Copier après la connexion

Test réussi. Pourquoi y a-t-il une telle situation ? L'instruction print donne-t-elle simplement au client plus de temps pour lire les entrées du serveur, ou y a-t-il éventuellement autre chose ? Heureux de fournir plus d'extraits de mon code si cela peut aider.

Solution de contournement

Devinette aveugle : La réponse de votre serveur commence par une ligne vide inattendue.

system.out.println(in.readline());<code>println 部分实际上并不重要,只需使用 in.readline() 就会得到相同的结果,因为它“消耗”了来自服务器的第一行。这不是时间问题,因为 readline() bloquera jusqu'à ce que la ligne entière soit reçue.

Vous pouvez résoudre ce problème sur le serveur en supprimant tout ce qui envoie des lignes vides, ou en modifiant votre test pour résoudre le problème :

out.println("look");
    assertEquals("", in.readLine()); // Add this line.
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!