首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >出列测试

出列测试
EN

Stack Overflow用户
提问于 2011-11-26 20:39:59
回答 2查看 2.9K关注 0票数 1

谁能告诉我/解释我怎样才能对队列进行适当的测试?我实现了一个优先级队列,为了验证它,我做了一些junit测试。我对java比较陌生,所以在尝试验证我的优先级队列的实现时,可能会犯一些大错误。

测试代码:

代码语言:javascript
运行
复制
@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));
}

预队列码:

代码语言:javascript
运行
复制
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);
    }       
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-28 15:11:59

您的测试应该测试代码如何对输入做出反应的所有可能性。在编写要测试的实际代码之前,考虑测试用例通常是有帮助的。(搜索“测试驱动的开发”,以获得关于这个问题的有趣的、更教条的观点)

我只写了4个测试:2个测试常规行为,2个测试异常情况。

我通常会创建一些用于测试的“instance”成员,这会将每个单元测试减少一行,否则我就必须创建一个实例(代码更少,工作也更少)。

不要在代码中测试ListNode (应该在ListNodeTest中测试)。

我下面的测试假设new ListNode(2,1).equals( new ListNode(2,1) )

代码语言:javascript
运行
复制
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的名称更改为PrioQueuePriorityQueue

我强烈建议彻底测试equals()方法,以便从代码中获得您所期望的结果。看看equals()通常应该做什么。您还缺少一个hashCode()方法,该方法通常是在您自己重写equals()时实现的。

票数 2
EN

Stack Overflow用户

发布于 2011-11-26 20:44:34

这没有任何意义:

代码语言:javascript
运行
复制
PQueue p = (PQueue)obj;
return (obj==p);

它等同于:

代码语言:javascript
运行
复制
return (p==p);

你的意思可能是:

代码语言:javascript
运行
复制
return (this == p);

但这也不会真正起作用--第一个if子句已经处理了这种情况。

如果要比较队列的内容是否相等,则需要遍历它们并检查两个队列中的每一项。由于您使用的是链表,因此可以直接执行此操作:

代码语言:javascript
运行
复制
return this.list.equals(p.list);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8278459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档