[英]Java Unit Testing
我有一个程序,正在尝试为其编写单元测试,我只需要知道它是否正确? 这是程序:
public static int[] bucketSort(int[] entries)
{
int numberBuckets = maxVal(entries);
//Creates an array with maxVal buckets.
int[] buckets = new int[numberBuckets+1];
//Loop through input entries and add one to the count for every occurrence of that number in entries.
for (int i = 0; i < entries.length; i++)
{
buckets[entries[i]]++;
}
int key = 0;
for (int i = 0; i < buckets.length; i++)
{
for (int j = 0; j < buckets[i]; j++)
{
//Use the number of every occurrence of each number in entries to construct the sorted array.
entries[key] = i;
key++;
}
}
//Print out the sorted array.
for(int i = 0; i <= entries.length-1; i++)
{
System.out.print(entries[i] + ", ");
}
return entries;
}
这是单元测试的内容
import junit.framework.Assert;
import junit.framework.TestCase;
public void testBucketSort()
{
int[] a1 = {9, 6, 2, 2, 4, 1, 0, 10,};
int[] a2 = BucketSort.bucketSort(a);
int[] a3 = {0, 1, 2, 2, 4, 6, 9, 10,};
Assert.assertArrayEquals(a2, a3);
}
}
不,这是不正确的。 有两个原因:
您已使用已排序的数据。 尽管它也应该是一个测试用例,但是您应该使用随机数据集并对其进行排序。 保留另一个数组,如a3作为预期数组,然后在a2和a3上调用assertArrayEquals。
您的assertArrayEquals实现未验证任何内容。 基本上,它只打印true或false,但是您的测试始终会通过。 您可以使用Assert类中的junit assertArrayEquals方法,也可以使用自己的实现,如果条件不匹配,则应通过失败测试。
除非您有充分的理由,否则请使用JUnit,而不是您自己的测试方法。
另外,请考虑一下您的代码可能如何中断并为每种情况编写测试。 例:
确保在所有情况下结果都正确正确的长度并正确排序。
我看到的最大问题是,您以错误的顺序将参数传递给assertArrayEquals()
:所有JUnit断言都按预期的 实际顺序接受参数。
除此之外,您没有足够的测试。 对于任何基于数组的方法,我至少要编写4个测试:一个带有0个元素的测试,一个带有1个元素,一个带有2个元素,以及一个带有3个元素的测试。这将捕获大多数边缘情况(0、1、2),并且至少给出确保您的代码可以正常处理不断增加的大小(3)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.