Java Chat Server(Socket) - 如何编写单元测试?

时间:2014-11-28 14:50:38

标签: java junit unit-testing

我编写了一个Java Chat Server程序。 这是一个简单的Server独立程序。 我必须运行它然后运行客户端以使聊天工作。 服务器程序有哪些可能的单元测试方案?谁能告诉我一些基于此代码的单元测试示例? 我之前从未编写过单元测试代码而且我无法真正想到这里需要测试的内容。我认为测试Connection可以是一个但还有什么? (以及如何?)

public class SimpleChatServer {

    static final Logger logger = LogManager.getLogger(SimpleChatServer.class);      
    ArrayList<PrintWriter> clientOutputStreams;
    private BufferedReader reader;
    private Socket sock;
    private ServerSocket serverSock;

    public class ClientHandler implements Runnable{

        public ClientHandler(Socket clientSocket){  // Socket Connection
            try {
                sock = clientSocket;
                InputStreamReader isReader = new InputStreamReader(sock.getInputStream());
                reader = new BufferedReader(isReader);
            } catch(Exception ex) {
                logger.trace(ex);
            }
        }

            public void run() {
                String message;
                try {
                    while ((message = reader.readLine()) != null) {
                        System.out.println("read " + message);
                        tellEveryone(message);
                    }
                } catch(Exception ex) {
                    logger.trace(ex);
                }
            } //close run

    } //close ClientHandler

        public static void main (String[] args) throws Exception
        {
            new SimpleChatServer().listen();
        }

        @SuppressWarnings("resource")
        public void listen()
        {
            clientOutputStreams = new ArrayList<PrintWriter>();
            try {

                ServerSocket serverSock = new ServerSocket(8000); //port number 8000 was used
                while(true) {
                    Socket clientSocket = serverSock.accept();
                    PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
                    clientOutputStreams.add(writer);

                    Thread t = new Thread(new ClientHandler(clientSocket));
                    t.start();
                }
            } catch (Exception ex) {
                logger.trace("Server Error", ex);
            } finally {
                try
                {
                    serverSock.close();
                }
                catch(Exception e){}
            }

        } // close go

        public void tellEveryone(String message)
        {
            Iterator<PrintWriter> it = clientOutputStreams.iterator();
            while(it.hasNext()) {
                try {
                    PrintWriter writer = (PrintWriter) it.next();
                    writer.println(message);
                    writer.flush();
                } catch (Exception ex) {
                    logger.trace(ex);
                }
            } // end while
        } // close tellEveryone

}

1 个答案:

答案 0 :(得分:0)

我打算从Pragmatic Unit Testing获得答案,但建议你找一份副本。至少你应该考虑结果是否正确,边界条件是否正确,以及是否可以强制错误条件。

测试结果通常意味着确保输入组合获得预期结果。边界反映在相关的&#34; 0,1,很多&#34;规则,你做愚蠢的事情,看看你的代码是否具有可以通过坏,空或意外值达到的隐含边界。

例如,如果您将巨大的字符串传递给接受它们的方法会发生什么?那些带有奇怪的Unicode字符的字符串呢?没有换行?

强制错误条件意味着确保事情优雅地降级和/或在预期情况下抛弃。

把你的代码想象成一个脆弱的小装置,然后假装一只笨蛋,一个14岁的黑客和你的非黑客奶奶(我知道有些存在)都在轮流使用它。