0

我正在尝试在网络爬虫上设置单元测试,并且对如何测试它们感到困惑。(我只做过一次单元测试,它是在一个计算器程序上。)

以下是程序中的两个示例方法:

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

您的问题没有一个确凿的答案,您测试的内容取决于您的代码做什么以及您想要测试它的深度。

因此,如果您有一个 parse 方法,它接受一个 HTML 并返回字符串:“this is a parsed html”(显然不是很有用,但只是说明一点),您将像这样测试它:

@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 回答