谁能告诉我/解释我怎样才能对队列进行适当的测试?我实现了一个优先级队列,为了验证它,我做了一些junit测试。我对java比较陌生,所以在尝试验证我的优先级队列的实现时,可能会犯一些大错误。
测试代码:
@Test
public void testDequeue() throws MyException {
System.out.println("Dequeue");
PQueue q=new PQueue();
PQueue o=new PQueue();
q.Enqueue("abc", 1); // Enqueue with an object and a priority
q.Dequeue();
System.out.println(q.dim()); // to see if the dequeue worked
o.Enqueue("def", 2);
assertTrue(o.equals(q));
}
预队列码:
public class PQueue<E> implements IPQueue<E>,Serializable{
private int size,front,rear;
private LinkedList<ListNode> list;
public PQueue()
{
front=0;
rear=0;
list=new LinkedList<ListNode>();
}
public void Enqueue(E obj, int p) throws MyException
{
if (obj==null) throw new MyException("Did not enqueued");
if (rear==0)
{
front=rear=1;
list.add(new ListNode(obj, p));
}
else
{
rear++;
int x= list.size();
for(int i=0;i<x-1;++i)
{
if(list.get(i).GetPriority() < p) list.add(i, new ListNode(obj, p));
}
}
}
public E Dequeue() throws MyException
{
if(rear==0) throw new MyException("Cannot dequeue; queue is empty!");
rear--;
return (E) list.getLast();
}
public int IsEmpty()
{
if(rear==0)
return 1;
else
return 0;
}
public int IsFull()
{
if(rear-front+2>size)
return 1;
else
return 0;
}
public void MakeEmpty()
{
size=0;
}
public int dim()
{
return rear;
}
public LinkedList<ListNode> getList()
{
return list;
}
@Override
public boolean equals(Object obj) {
if(this == obj) {
return true;
}
if (!(obj instanceof PQueue)) {
return false;
}
PQueue p = (PQueue)obj;
return (obj==p);
}
}
发布于 2011-11-28 15:11:59
您的测试应该测试代码如何对输入做出反应的所有可能性。在编写要测试的实际代码之前,考虑测试用例通常是有帮助的。(搜索“测试驱动的开发”,以获得关于这个问题的有趣的、更教条的观点)
我只写了4个测试:2个测试常规行为,2个测试异常情况。
我通常会创建一些用于测试的“instance
”成员,这会将每个单元测试减少一行,否则我就必须创建一个实例(代码更少,工作也更少)。
不要在代码中测试ListNode
(应该在ListNodeTest
中测试)。
我下面的测试假设new ListNode(2,1).equals( new ListNode(2,1) )
。
private final PQueue<Integer> instance = new PQueue<Integer>();
@Test
public void testDequeue() throws Exception
{
System.out.println( "Dequeue" );
instance.Enqueue( 2, 1 );
assertEquals( new ListNode<Integer>(2, 1), instance.Dequeue() );
}
@Test
public void testDequeue_DequeuedTwice() throws Exception
{
System.out.println( "Dequeue_DequeuedTwice" );
instance.Enqueue( 2, 1 );
instance.Enqueue( 3, 2 );
assertEquals( new ListNode<Integer>(2, 1), instance.Dequeue() );
}
@Test( expected=MyException.class)
public void testDequeue_Empty() throws Exception
{
System.out.println( "Dequeue_Empty" );
instance.Dequeue();
}
@Test( expected=MyException.class)
public void testDequeue_DequeuedTwice() throws Exception
{
System.out.println( "Dequeue_DequeuedTwice" );
instance.Enqueue( 2, 1 );
instance.Dequeue();
instance.Dequeue();
}
有一点,您可以将new ListNode<Integer>(2, 1)
定义为测试的static final
。我没有。如果我用了3次,也许我会用它……
其他注意事项:看看http://www.oracle.com/technetwork/java/codeconventions-135099.html#367。Java中的方法名称应该以小写字母开头。
你可能会说我自己违反了这个约定,在测试用例的方法名中引入了下划线“_”。我认为这很方便,所以我故意违反了单元测试的约定。就为这点骂我吧。
也许你也应该仔细看看junit常见问题解答http://junit.sourceforge.net/doc/faq/faq.htm。
您可能会考虑将PQueue
的名称更改为PrioQueue
或PriorityQueue
。
我强烈建议彻底测试equals()
方法,以便从代码中获得您所期望的结果。看看equals()
通常应该做什么。您还缺少一个hashCode()
方法,该方法通常是在您自己重写equals()
时实现的。
发布于 2011-11-26 20:44:34
这没有任何意义:
PQueue p = (PQueue)obj;
return (obj==p);
它等同于:
return (p==p);
你的意思可能是:
return (this == p);
但这也不会真正起作用--第一个if
子句已经处理了这种情况。
如果要比较队列的内容是否相等,则需要遍历它们并检查两个队列中的每一项。由于您使用的是链表,因此可以直接执行此操作:
return this.list.equals(p.list);
https://stackoverflow.com/questions/8278459
复制相似问题