java - 出队测试

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

队列代码:

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

最佳答案

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

我刚写了 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 FAQ http://junit.sourceforge.net/doc/faq/faq.htm .

您可能会考虑更改 PQueue 的名称至 PrioQueuePriorityQueue .

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

关于java - 出队测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8278459/

相关文章:

java - 如何使用 Java Gson 库转换动态 JSON 响应

java - 如何从命令行执行 Junit 测试用例

java - junit数组不等于测试

java - Mockito 与 JUnit 在 Windows 上失败

java - 用于获取当前 UTC 日期时间的单元测试

junit - 如何执行参数化 Junit 测试用例

java - JSF 移动/重定向到其他包含数据的页面

Java比较两个相同的对象给出错误

java - 后缀自赋值行为是否在 C#/Java 中严格定义?

java - 在 Junit 中运行时出现异常