知识大全 用Java测试网络代码

Posted

篇首语:不磨不炼,不成好汉。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 用Java测试网络代码相关的知识,希望对你有一定的参考价值。

用Java测试网络代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  网络代码被证明是很难进行完全彻底的测试 这是因为测试组件不依赖其他服务器 以独立进程形式工作时效果最好 本文中 Nelson Minar描述了两种单元测试网络代码的方法 首先 他提出您设计网络代码时应该尽可能地做到逻辑上与网络独立 接着 他建议使用Java的协议处理器类模拟网络连接而不是使用实际的网络 使用这些原则 您就可以很轻松地生成网络测试软件   测试网络代码并是一件很困难的事情 优秀的单元测试组件运行速度非常快 这样开发人员在每次编译之后就能够进行测试 当然 测试流也要能够稳定地运行 这样它们才可以持续捕获代码中的任何错误 然而 实践证明 网络代码(例如 从URL上读取的代码)是很难快速并稳定地测试的 而且 如果测试组件本身进行网络调用 测试会因为依赖网络和其他服务器将会变得非常缓慢并十分不稳定   设想一个可以从网页上下载 格式化并显示XML数据的程序 该程序的本地测试流将需要从一个运行的Web服务器上获取XML数据 但是程序的很多部分——XML解析器 格式化程序和显示程序——可能不需要依赖网络就可以独立测试 请记住这个例子 我将在本文中举例说明两种可以测试与网络相关代码的方法 当测试进行时 这两种方法可以避免使用网络   我首先描述简单的网络激活演示程序PrintRSS 然后再讨论如何使用简单的 Reader 和Writer 对象而不是网络连接来设计简化测试的PrintRSS程序 最后我将介绍一个允许程序员合成特殊的testurl库 使用正常中的URLs绕过网络 注意 测试将使用JUnit 测试框架的 assert() 方法   PrintRSS演示程序   PrintRSS是一个可以从URL读取数据并对数据进行处理的程序 它可以很好的演示网络代码的测试 PrintRSS 使用RSS格式读取数据 这个数据格式可以简单地将新鲜内容并入XML 本文中 这个重要的RSS结构定义如下       Channel Title   Item <fp class=\'fp-qx8q6\'></fp>   Item <fp class=\'fp-zfw8j\'></fp>      PrintRSS从某个URL下载RSS文档 规定内容的具体布局 然后以一种易读的方式将标题输出到System out   Channel Title   Item    Item   PrintRSS执行四个主要操作   ● 打开与某一URL的连接   ● 使用XML进行读取   ● 格式化数据   ● 输出到System out   PrintRSS程序将上述的四种功能封装在一个单独的方法(printURL(URL))中 然而 很难对这个方法进行测试 原因有两个   首先代码依赖于从URL上读取的数据 如果URL 是一 URL 这就要涉及到网络 而且 输出到System out所产生的影响使代码自己的行为也被隐藏起来 好好考虑一下这些问题 您又能如何更好地设计Printress来进行测试呢?   使用eaders和writers封装数据  简单地解析和格式化XML代码而不是连接网络 您就能分解代码并独立测试数据的逻辑性 虽然再分解代码看起来有点令人畏惧 但是这样的努力是为了得到更好的代码 这是因为代码是经过测试的同时设计也更标准   记住 您可以将printURL()的代码解析和格式化功能分解为一个新的方法formatReader(Reader Writer) 这个方法专门用于对一个带有XML数据的Reader对象进行解析然后将结果报告输出到提供的Writer   测试 formatReader(Reader Writer)现在变得简单了   testFormatReaderGoodData():   String goodRSSData = +   Channel Title +   Item <fp class=\'fp-q90sp\'></fp> +   Item <fp class=\'fp-nenvc\'></fp> +   ;   String goodRSSOutput = Channel Title\\n Item \\n Item \\n ;     Reader r = new StringReader(goodRSSData);   Writer w = new StringWriter();   PrintRSS formatReader(r w);     assertEquals(goodRSSOutput w toString());  上面的示例只用readers和writers在没有URL和网络连接的情况下测试了解析和格式化逻辑 测试示例演示了一个有用的测试方法 创建的reader流将测试数据包含在测试代码中而不是从文件或者网络读取数据 实践证明StringReader和StringWriter(或者 ByteArrayInputStream 和ByteArrayOutputStream)在把测试数据嵌入到单元测试流方面是没有价值的   上述的单元测试在一切都正常时执行一定的逻辑进行观察 但它对问题出现错误处理代码同样重要 接下来 就是一个测试坏数据的示例 其中巧妙的使用了Junit来检查是否出现异常   testFormatReaderBadData():   String badXMLData = this is not valid xml data ;   StringReader r = new StringReader(badXMLData);     try    PrintRSS formatReader(r new StringWriter());   fail( should have thrown XML error );   catch (XMLParseException ex)    // No error we expected an exception     readers 和 writers再次封装数据 主要的不同在于 这里的数据使 formatReader()抛出异常 如果没有产生异常 就会调用Junit的方法fail()   使用Java 协议处理器测试网络代码  虽然非网络的分离方法可以使程序能像PrintRSS一样易于测试 但是这样的努力对于创建完整的测试流还是不够的 我们仍希望测试网络代码本身 尤其是网络异常控制 而且有时候分离到reader接口并不是很方便 被测试的代码可能会依赖于一个仅能理解URL的库 本部分我将解释如何测试方法 formatURL(URL Writer) 这种方法带有URL 读取RSS并将数据输出到writer   您可以使用多种方式测试包含URL的代码 首先 您可以使用标准 URLs 并指向运转的测试服务器 然而这种方法要求稳定的Web服务器——少一个组件来使测试复杂化 其次 您可以使用指向本地文件的 file: URLs 这种方法和使 URLs存在相同的问题 虽然您可以使用file:或者 URLs访问准确的测试数据 但是它仍然很难模拟导致I/O(输入和输出)异常的网络失败   一个测试URL代码的更好方法就是创建新的URL命名空间testurl: 使之处于测试程序的完全控制之中——种使用Java协议处理器的简单方法   实现sturl   Java协议处理器允许编程人员使用它们自己的代码实现协议 协议处理器很简单   首先 满足Java编写协议处理器的需求 要处理好三个重要的部分   ● 类TTestURLConnection URLConnection的实现可以处理返回输入流 标题等实际方法   ● 类 Handler 将testurl: URL转换成 TestURLConnection   ● 属性java protocol handler pkgs 表示何处找到新的URL命名空间实现的系统属性   其次 提供一个有用的TestURLConnection执行过程 在这种情况下 库用户看不到实际的 TestURLConnection 相反 工作是通过类TestURLRegistry进行的 这个类只有一个单独的方法 TestURLRegistry register(String InputStream) 它将输入流和给订的URL联系在一起 例如   InputStream inputIS = ;   TestURLRegistry register( data inputIS);  如此安排使得开放的URL testurl:data返回inputIS中的输入流 实现了这一点 您就能很容易的构建测试程序控制输出的URL (注意 输入流数据并没有复制 因此 通常情况下每一个URL您只能使用一次 )   对准确数据的测试  首先我们使用testurl 用准确数据测试formatURL()     testFormatURLGoodStream():   InputStream dataIS = new ByteArrayInputStream(goodRSSData getBytes());   TestURLRegistry register( goodData dataIS);   URL testURL = new URL( testurl:goodData );     Writer w = new StringWriter();   PrintRSS formatURL(testURL w);   assertEquals(goodRSSOutput w toString());  上面的代码和先前的测试使用相同的数据 但这里却把数据与testurl:goodData URL联系起来 方法formatURL() 打开并读取URL 测试代码保证数据能够正确读取 格式化并被输出到Writer   模拟失败  用网络环境编写程序很容易 但编写可以正确处理网络失败的代码却比较困难 testurl 能够模拟网络失败——这是该方法的主要优点   首先 模拟连接到某一URL的网络失败是不可能的 这种情形的一个典型代表就是远程web服务器没有工作 我们的testurl:库包含一个它能理解的URL testlurl:errorOnConnect 将保证只要您连接到这个URL 它就会抛出一个IOException 您可以使用这个URL 并对程序是否能正确处理URL不能访问的情况进行测试   testFormatURLNoConnection():   URL noConnectURL = new URL( testurl:errorOnConnect );   Writer w = new StringWriter();   try    PrintRSS formatURL(noConnectURL w);   fail( Should have thrown IO exception on connect );   catch (IOException ioex)      如果连接失败 上面的测试保证formatURL()可以正确地抛出一个IOException 但是 您将如何测试这样一种情形(起初网络连接正常工作但在交互期间失败)呢?   因为您已经完全控制了与测试URL相关的输入流 您就可以选用任意一种输入流实现 例如 您创建一个简单的类BrokenInputStream 它用方法read()封装输入流 而方法read()在抛出异常IOException之前只允许读取一定字节数目的数据 cha138/Article/program/Java/hx/201311/26243

相关参考

知识大全 用Ruby和JtestR来促进Java测试

用Ruby和JtestR来促进Java测试  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  用Ru

知识大全 用Java代码生成打印收据

用Java代码生成打印收据  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  首先来看看效果如下图 

知识大全 用Java的循环实现矩阵乘法代码分享

用Java的循环实现矩阵乘法代码分享  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  public

知识大全 用Java写出一段string和stringbuffer的代码

用Java写出一段string和stringbuffer的代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来

知识大全 巧用工具 为Java程序生成代码做覆蓋统计

巧用工具为Java程序生成代码做覆蓋统计  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  曾经为大

知识大全 重置路由器之后,无线不能用,电脑连接不上网络显示错误代码651

重置路由器之后,无线不能用,电脑连接不上网络显示错误代码651您好:重置后,要重新设置路由器的:1、打开Web浏览器,在地址栏中键入:192.168.0.1,然后按Enter键。2、在随后打开的登陆窗

知识大全 用Java制作网络文件下载系统

用Java制作网络文件下载系统  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  由于Linux操作

知识大全 用Java编写简单的UDP网络通信程序

用Java编写简单的UDP网络通信程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java中

知识大全 自动化测试框架: 用原型编写用例

  最近在考虑自动化测试框架的时候发现原来的想法虽然解决了定位及访问控件的困难但是用例代码却因此对程序实现细节有了很强的依赖这些依赖可能对用例代码的开发带来一些困惑  在思考解决这个问题的时候自然的方

知识大全 用Solstice Enterprise Manager建立Java网络管理应用程序

用SolsticeEnterpriseManager建立Java网络管理应用程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容