首頁  >  文章  >  為什麼當我在測試前新增 System.out.println(in.readLine()) 語句時,我的 Java 伺服器測試會通過,但如果沒有該語句則會失敗?

為什麼當我在測試前新增 System.out.println(in.readLine()) 語句時,我的 Java 伺服器測試會通過,但如果沒有該語句則會失敗?

王林
王林轉載
2024-02-22 13:34:06739瀏覽

php小編魚仔解答:在Java伺服器測試中加入System.out.println(in.readLine())語句可能會影響測試結果,因為這個語句會讀取伺服器的輸入流,使得伺服器能夠接收請求。如果沒有該語句,伺服器可能無法正確接收請求,導致測試失敗。因此,在測試前加入該語句是為了確保伺服器能夠正常接收請求並通過測試。

問題內容

我正在努力用 java 實作一個伺服器來處理多人掃雷遊戲。在嘗試測試我的伺服器以確保它正確回應合法的客戶端請求時,我發現只有在將特定客戶端請求列印到伺服器後添加system.out.println(in.readline()) 語句才能通過測試輸出流,但在調用測試本身之前。

例如,客戶端可以發出的一個請求是「檢視」請求,以查看板的目前狀態。我最初為“look”編寫了一個測試,如下所示:

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

但是,當我像這樣運行測試時,它失敗了,並且收到一條錯誤訊息,指出它期望 [- - - - - - -] 但得到 []。

但是,當我新增如下列印語句時:

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

測試通過。為什麼會出現這樣的情況呢? print 語句是否只是給客戶端更多的時間來讀取伺服器的輸入,或者可能還有其他事情發生?如果有幫助的話,很樂意提供更多我的程式碼片段。

解決方法

盲目猜測:您的伺服器回應以意外的空白行開始。

system.out.println(in.readline());<code>println 部分其實不重要,只要使用in.readline() 就會得到相同的結果,因為它“消耗”了來自伺服器的第一行。這不是時間問題,因為 readline() 會阻塞,直到收到整行。

您可以在伺服器上修復此問題,方法是刪除發送空白行的任何內容,或修改測試以解決該問題:

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

以上是為什麼當我在測試前新增 System.out.println(in.readLine()) 語句時,我的 Java 伺服器測試會通過,但如果沒有該語句則會失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除