快速业务通道

JUnit反模式 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
new Stack();    Object expectedOne = new Object();    Object expectedTwo = new Object();    stackUT.push(expectedOne);    stackUT.push(expectedTwo);    assertEquals(expectedTwo, stackUT.pop());    assertEquals(expectedOne, stackUT.pop());    assertTrue(stackUT.isEmpty()); }

您将不会再破坏封装,原因是您没有声明单元在封装中如何运行。相反,您充分利用了该装置显示的严密内聚性。拥有可以推动但不能弹出的堆栈没有任何意义,因此,您可以将这些方法作为堆栈暴露给其客户机的契约的一部分进行测试。

当编写代码时,应考虑到这个契约 —— 您将要编写的特定内容都将暴露给它的客户机,无论此内容是一个方法、一个类,还是一个与类交互的组。该契约是您要测试的一个内容,而不是实现细节。以这种形式进行测试将有助于该契约的形式化,使该契约更为明确并能够通过测试得到很好的定义,而不会处于不确定和非正式状态。

JUnit反模式(5)

时间:2011-02-04 Alex Garrett

过度复杂的测试

当测试明显正确时,该测试通常会成功。如果测试很复杂,以致于不能立即断定它是否正确,那么您将无法知道该测试是否因为是错误的测试(甚至更糟的是不知道它是否正被错误地传递)而导致失败。当被测系统需要一个复杂的设置或暴露需要拆分的复杂数据结构时,通常会出现这种情况。

请考虑这样一个例子,在这个例子中有一个代码,该代码携带一些客户数据并将其写出,保存到一个有固定记录的文件中,以便在旧式系统中使用。您大概不会对记录是否为正确格式的测试感兴趣 —— 在这些方面,您已经进行了许多测试。您要测试的是记录中是否存在正确的数据。在这种情况下,很容易看到如清单 6 所示的测试。

清单 6. 过度复杂的测试

import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import junit.framework.TestCase; public class RecordTest extends TestCase {    public void testRecordContainsCorrectCustomerData() {      // setup      String expectedName = "Estragon";      int expectedId = 1001;      String [] expectedItemNames = {"A man", "A plan", "A canal", "Suez"};      Customer customer = new Customer(expectedId, expectedName, expectedItemNames);      // execute      BillingCenter.processCustomer(customer);      // assert results      File file = new File("customer.rec");      assertTrue(file.exists());      FileInputStream fis = new FileInputStream(file);      ByteArrayOutputStream baos = new ByteArrayOutputStream();      byte [] buffer = new byte[16];      int numRead;      while ((numRead = fis.read(buffer)) >= 0) {        baos.write(buffer, 0, numRead);      }      byte [] record = baos.toByteArray();      assertEquals(128, record.length); // exactly one record      String actualName = new String(record, 0, 15).trim();      assertEquals(expectedName, actualName);      int [] temp = new int[4];      temp[0] = record[15];      temp[1] = record[16];      temp[2] = record[17];      temp[3] = record[18];      int actualId = (temp[0] << 24) & (temp[1] << 16) & (temp[2] << 8) & temp[3];      as

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号