

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 ?
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!

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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