Table des matières
Contenu de la question
Solution de contournement
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 ?

Feb 22, 2024 pm 01:34 PM

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!

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)