2012-07-16 55 views
0

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

以下是方案二实例方法:

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", ? ?) 
} 

我真的不知道WH可以从这里出发。我甚至不确定我是应该测试实时URL还是本地文件。 我在这里发现这个问题:https://stackoverflow.com/questions/5555024/junit-testing-httpurlconnection 但我不能真的按照它,我不知道它被解决无论如何。 任何指针赞赏。

回答

1

对于您的问题没有一个确凿的答案,您测试的内容取决于您的代码的功能以及测试的深度。

所以,如果你有一个解析方法是采用HTML,并返回字符串:“这是一个解析的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()之外还有很多其他方法,所以你应该看看here

最终由您来决定要测试哪些部件以及如何测试它们。

+0

谢谢 - 我要检查那本食谱。 – Robert 2012-07-16 12:33:47

1

想想你的方法应该有什么效果。在第一种情况下,当HttpURLConnection(url)被调用时应该发生的预期事情似乎是状态码和url被追加到一个名为CvsString的东西上。你将不得不在CvsString中实现一些东西,以便你可以检查你所期望的事情是否真的发生了。

但是:看看你的代码,我建议你参考一本关于单元测试的书,以及如何重构代码,使它变得可测试。在你的代码片段中,我看到很多原因,为什么单元测试你的代码很困难,如果不是不可能的话, G。整体使用静态方法,带有副作用的方法,关注点很少分离等等。因此,在这种情况下不可能完全回答你的问题。

不要误解我的意思,这并不意味着冒犯了你。很值得学习这些东西,它会提高你的编码能力。

+0

感谢您的意见。 – Robert 2012-07-16 12:52:51