0

Webクローラーで単体テストをセットアップしようとしていますが、それらをテストする方法についてかなり混乱しています。(単体テストは一度だけ行ったことがあり、それは電卓プログラムで行われました。)

プログラムの 2 つのメソッドの例を次に示します。

protected static void HttpURLConnection(String URL) throws IOException {

    try {
        URL pageURL = new URL(URL);

        HttpURLConnection connection = (HttpURLConnection) pageURL
                .openConnection();
        stCode = connection.getResponseCode();
        System.out.println("HTTP Status code: " + stCode);

        // append to CVS string
        CvsString.append(stCode);
        CvsString.append("\n");

        // retrieve URL
        siteURL = connection.getURL();
        System.out.println(siteURL + " = URL");

        CvsString.append(siteURL);
        CvsString.append(",");
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
}

と:

public static void HtmlParse(String line) throws IOException {

    // create new string reader object
    aReader = new StringReader(line);

    // create HTML parser object
    HTMLEditorKit.Parser parser = new ParserDelegator();

    // parse A anchor tags whilst handling start tag
    parser.parse(aReader, new HTMLEditorKit.ParserCallback() {
        // method to handle start tags
        public void handleStartTag(HTML.Tag t, MutableAttributeSet a,
                int pos) {
            // check if A tag
            if (t == HTML.Tag.A) {
                Object link = a.getAttribute(HTML.Attribute.HREF);
                if (link != null) {
                    links.add(String.valueOf(link));

                    // cast to string and pass to methods to get title,
                    // status
                    String pageURL = link.toString();
                    try {
                        parsePage(pageURL); // Title - To print URL, HTML
                        // page title, and HTTP status
                        HttpURLConnection(pageURL); // Status
                        // pause for half a second between pages
                        Thread.sleep(500);

                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch (BadLocationException e) {
                        e.printStackTrace();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }, true);
    aReader.close();
}

Eclipse でテスト クラスをセットアップし、次の行に沿ってテスト メソッドの概要を示します。

@Test
public void testHttpURLConnection() throws IOException {
    classToTest.HttpURLConnection( ? );
    assertEquals("Result", ? ? )
}

ここからどこへ行けばいいのかわからない。ライブ URL とローカル ファイルのどちらをテストする必要があるかさえわかりません。ここでこの質問を見つけました: https://stackoverflow.com/questions/5555024/junit-testing-httpurlconnection しかし、実際にはそれに従うことができず、とにかく解決されたかどうかはわかりません。任意のポインタをいただければ幸いです。

4

2 に答える 2

1

あなたの質問に対する決定的な答えはありません。何をテストするかは、コードが何を行い、どの程度深くテストしたいかによって異なります。

したがって、HTML を受け取り、「これは解析済みの html です」という文字列を返す parse メソッドがある場合 (明らかにあまり有用ではありませんが、要点を説明するだけです)、次のようにテストします。

@Test
public void testHtmlParseSuccess() throws IOException {        
    assertEquals("this is a parsed html", classToTest.parse(html) ) //will return true, test will pass
}

@Test
    public void testHtmlParseSuccess() throws IOException {        
        assertEquals("this is a wrong answer", classToTest.parse(html) ) //will return false, test will fail
    }

他にもたくさんの方法があるassertEquals()ので、こちらをご覧ください。

最終的には、どの部分をテストし、どのようにテストするかを決定するのはあなた次第です。

于 2012-07-16T12:29:30.227 に答える
1

メソッドがどのような効果を持つべきかを考えてください。最初のケースでは、HttpURLConnection(url) が呼び出されたときに予想されることは、ステータス コードと URL が CvsString と呼ばれるものに追加されるようです。期待したことが実際に起こったかどうかを検査できるように、CvsString に何かを実装する必要があります。

ただし、コードを見て、単体テストと、コードをリファクタリングして十分にテストできるようにする方法に関する本を参照することをお勧めします。あなたのコード スニペットには、コードの単体テストが不可能ではないにしても難しい理由がたくさんあります。たとえば、静的メソッドの全体的な使用、副作用のあるメソッド、懸念事項の分離がほとんどないなどです。このため、質問に答えることができません。このコンテキストで完全に。

誤解しないでください、これは不快な意味ではありません。これらのことを学ぶことは、コーディング能力を大幅に向上させる価値があります。

于 2012-07-16T12:47:43.930 に答える