出列测试

时间:2011-11-26 12:39:59

标签: java junit

有人能告诉我/解释如何对出队进行适当的测试? 我已经实现了优先级队列,为了验证它,我做了一些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));
}

Pqueue代码:

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);
    }       
}

2 个答案:

答案 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的名称更改为PrioQueuePriorityQueue

我强烈建议彻底测试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);