快速业务通道

JUnit反模式 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
。所以,让我们谈一下边界测试。如果存在一个边界,那么输入参数为 0,这是一个有效的输入,从数学上说,0 的阶乘是 1。执行前面的实现会导致测试失败,因为您希望的返回值是 1,但得到的却是 IllegalArgumentException。还应该检查边界的另一边 -1,以验证可以得到期望的 IllegalArgumentException,而不是一个整数。

对其他边界的相应测试将留做练习供您操练。提示:如果执行 Factorial.eval(100) 将会发生什么情况?

JUnit反模式(3)

时间:2011-02-04 Alex Garrett

简单测试

与愉快路径反模式一样,简单测试反模式讲的不是关于“是什么”而是“不是 什么”。若开发人员没有经验,并且代码难以测试,则通常会出现这种症状。结果,您会看到对容易测试 (equals 和 toString 往往很突出,参见清单 1) 的内容进行多次的测试,而被测单元的真正逻辑却被忽略了。结果出现了许多不能检测系统的传递测试,这会导致对代码健康状态的误解。

清单 1. 一些容易测试的签名

testEqualsReflexive() testEqualsSymmetric() testEqualsTransitive() testEqualsOnNullParameter() testEqualsWorksMoreThanOnce() testEqualsFailsOnSubclass() testEqualsIsStillReflexive()

进行系统测试之所以困难,是因为您经常尝试测试某个方法,而不是检测某个装置。假设您要测试一个堆栈的实现,那么您的测试签名可能如清单 2 所示。

清单 2. 用于堆栈单元测试的可能测试签名

testPopHappyPath(); testPopEmptyStack(); testPushHappyPath(); testPushFullStack(); testPeek();

其中有些测试很容易,如清单 3 所示。

清单 3. 用于空堆栈的单元测试

public void testPopEmptyStack() {    Stack stackUT = new Stack();    assertEquals(0, stackUT.getSize());    try {      stackUT.pop();      fail("Expected StackUnderflowException");    } catch (StackUnderflowException _expected) {} }

但是,如何测试 push 的愉快路径呢?

清单 4. 用于 stack.push() 的元单测试

public void testPushHappyPath() {    Stack stackUT = new Stack();    Object item = new Object();    stackUT.push(item);    // now what? }

这是测试单元实现的常见错误,而不是单元与其客户机签定的契约。假设 push 方法的实现方式如下:

public class Stack {    private List elements;    ...    public void push(Object _element) {      elements.add(_element);    } }

JUnit反模式(4)

时间:2011-02-04 Alex Garrett

您需要进行这一测试来验证 elements List 现在是否含有 push 添加的 Object。所以,您要编写如下测试:

public void testPushHappyPath() {    Stack stackUT = new Stack();    Object expectedElement = new Object();    stackUT.push(expectedElement);    List elements = stackUT.getElementsList();    assertEquals(1, elements.size());    assertEquals(expectedElement, elements.get(0)); }

其中的问题是破坏了封装,原因是公开了被测单元的内幕。相反,要测试 push 是否将对象放入了列表,您应测试堆栈与客户机签定的契约。J.B. Rainsberger 将此称为测试装置 (fixture)。

现在,您的测试如清单 5 所示。

清单 5. 用于堆栈装置的单元测试

public void testPushPop() {    Stack stackUT = new Stack();    Object expectedElement = new Object();    assertEquals(expectedElement, stackUT.push(expectedElement).pop();    assertTrue(stackUT.isEmpty()); } public void testFILO() {    Stack stackUT =

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号