Maison >Java >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 ?

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 ?

王林
王林avant
2024-02-22 13:34:06780parcourir

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

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

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer