谁能告诉我/解释我怎样才能对出队进行适当的测试? 我已经实现了一个优先级队列,为了验证它我做了一些 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
的名称至 PrioQueue
或 PriorityQueue
.
我强烈建议测试 equals()
方法,以便从代码中获得您所期望的。看看是什么equals()
通常应该做的。您还缺少 hashCode()
方法,通常在覆盖 equals()
时实现自己。
关于java - 出队测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8278459/