有人能告诉我/解释如何对出队进行适当的测试? 我已经实现了优先级队列,为了验证它,我做了一些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);
}
}
答案 0 :(得分:2)
您的测试应该测试代码如何对输入做出反应的所有可能性。在编写应测试的实际代码之前考虑测试用例通常是有帮助的。 (搜索“测试驱动开发”以获得关于此问题的有趣,更具教条的观点)
我刚写了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中的方法名称应该以小写字母开头。
您可能会认为我自己违反了该惯例,在testcase的方法名称中引入了下划线'_'。我认为这很方便,所以我明显违反了单元测试的惯例。为此呐喊我。
也许您还应该仔细查看junit FAQ http://junit.sourceforge.net/doc/faq/faq.htm。
您可以考虑将PQueue
的名称更改为PrioQueue
或PriorityQueue
。
我强烈建议彻底测试equals()
方法,以便从代码中获得您期望的内容。看看equals()
通常应该做什么。您还缺少hashCode()
方法,这种方法通常在您自己覆盖equals()
时实现。
答案 1 :(得分:1)
这没有意义:
PQueue p = (PQueue)obj;
return (obj==p);
与以下内容相同:
return (p==p);
你可能意味着:
return (this == p);
但这也不会真正起作用 - 该案例已由第一个if
条款处理。
如果要比较队列的内容是否相等,则需要迭代它们并检查两个队列中的每个项目。由于您使用的是链接列表,因此可以直接执行此操作:
return this.list.equals(p.list);