声明:JavaEye新闻文章的版权属于JavaEye网站所有,严禁任何网站转载本文,否则必将追究法律责任!
BDD,即行为驱动编程,是TDD的一个改进版本,BDD本质上也是TDD,但是比TDD要更加自然一些,更DSL化,通过定义一个一个具体可执行的Behavior来驱动软件的开发过程。如果你是一个Ruby程序员的话,那么你一定会发现RSpec已经提供了良好的BDD编程框架。我们正在开发当中的JavaEye3.0网站就是使用了rspec来编写系统的behavior,来驱动编程和单元测试。
不过如果你是一个Java程序员,那么你现在不需要再羡慕Ruby程序员了,因为JDave已经提供了类似rspec的功能。JDave同时也集成了JMock库作为mock实现,下面我们看一个简单的例子:
每个方法实际上也是单元测试,但是并不是使用junit习惯的assert方法,而是specify,断言使用的是mast,containsExactly,should等比较口语化的方法名称。
JDave是一个非常好的尝试,对于不喜欢assert风格的用户不妨尝试尝试,从我们rspec的使用经验来看,写BDD的example要比写TDD的test更加自然一些。
JDave主页:
http://www.jdave.org/
不过如果你是一个Java程序员,那么你现在不需要再羡慕Ruby程序员了,因为JDave已经提供了类似rspec的功能。JDave同时也集成了JMock库作为mock实现,下面我们看一个简单的例子:
import jdave.Block;
import jdave.Specification;
import jdave.junit4.JDaveRunner;
@RunWith(JDaveRunner.class)
public class StackSpec extends Specification<Stack<?>> {
public class EmptyStack {
private Stack<String> stack;
public Stack<String> create() {
stack = new Stack<String>();
return stack;
}
public void isEmpty() {
specify(stack, must.be.empty());
}
public void isNoLongerEmptyAfterPush() {
stack.push("anything");
specify(stack, must.not().be.empty());
}
}
public class FullStack {
private Stack<Integer> stack;
public Stack<Integer> create() {
stack = new Stack<Integer>(10);
for (int i = 0; i < 10; i++) {
stack.push(i);
}
return stack;
}
public void isFull() {
specify(stack, must.be.full());
}
public void complainsOnPush() {
specify(new Block() {
public void run() throws Throwable {
stack.push(100);
}
}, should.raise(StackOverflowException.class));
}
public void containsAllItems() {
for (int i = 0; i < 10; i++) {
specify(stack, contains(i));
}
}
public void doesNotContainRemovedItem() {
stack.remove(3);
specify(stack, does.not().contain(3));
}
public void containsAllButRemovedItem() {
stack.remove(3);
specify(stack, containsExactly(0, 1, 2, 4, 5, 6, 7, 8, 9));
}
}
public class StackWhichIsNeitherEmptyNorFull {
private Stack<Integer> stack;
public Stack<Integer> create() {
stack = new Stack<Integer>();
for (int i = 0; i < 10; i++) {
stack.push(i);
}
return stack;
}
public void addsToTheTopWhenSentPush() {
stack.push(100);
specify(stack.peek(), must.equal(100));
}
}
}
每个方法实际上也是单元测试,但是并不是使用junit习惯的assert方法,而是specify,断言使用的是mast,containsExactly,should等比较口语化的方法名称。
JDave是一个非常好的尝试,对于不喜欢assert风格的用户不妨尝试尝试,从我们rspec的使用经验来看,写BDD的example要比写TDD的test更加自然一些。
JDave主页:
http://www.jdave.org/


评论 共 3 条 发表评论
Jekey 2007-11-27 10:03
pf_miles 2007-11-22 11:02
不好意思,记错了,套里面是可以的...
pf_miles 2007-11-22 10:58