我想用JUnit测试验证我在Java中的集合的排序算法。如果我将“B”,“C”,“A”输入到集合中并希望对其进行排序(例如按字母顺序排列),使用JUnit对此进行测试的正确方法是什么?
我实现了Comparable接口,并希望确保我的排序正常工作。
我认为这个问题可以在Java或JUnit之外扩展到任何语言的一般测试。
答案 0 :(得分:10)
我会使用预期顺序中的值创建另一个集合,然后检查结果是否匹配。
但说实话,如果你只是想检查IComparable
和不是某种排序算法的实现,我会只是做出关于调用compareTo
的结果。编写测试会更简单,而更多更容易理解任何失败。
(如果排序测试失败,那只是意味着许多比较中的一个做错了。它无法帮助你解决 比较的问题错了。)
答案 1 :(得分:1)
我想说从特殊情况开始:
答案 2 :(得分:1)
不确定我是否完全接受了你的问题。谈到编写测试的技术方面,您可以使用这些内容(例如,使用Hamcrest):
import java.util.Collection;
import org.hamcrest.collection.IsIterableContainingInOrder;
import org.junit.Assert;
import org.junit.Test;
import com.google.common.collect.Lists;
public class MyTest {
@Test
public void collectionTest() {
final Collection<String> actual = Lists.newArrayList("AAA", "ABC", "BBB", "AZZ");
Assert.assertThat(actual, IsIterableContainingInOrder.contains("AAA", "ABC", "AZZ", "BBB"));
}
}
运行这个的结果:
java.lang.AssertionError:
Expected: iterable containing ["AAA", "ABC", "AZZ", "BBB"]
got: <[AAA, ABC, BBB, AZZ]>
at org.junit.Assert.assertThat(Assert.java:778)
at org.junit.Assert.assertThat(Assert.java:736)
at ...
如果你的问题更具哲学性,那么还有另外两个答案......
答案 3 :(得分:0)
无论您使用JUnit还是任何其他测试框架,都无所谓。关于单元测试的问题是你想测试你的类行为(这就是UNIT测试的原因)。测试类本身不应该实现Comparable,它应该是你的类,但是为了测试它是无关紧要的。
考虑一下您要测试的方案列表。
例如,提交“B”,“C”,“A”,并确保您返回的内容等于“A”,“B”,“C”。确保如果提交有序列表,则返回相同的有序列表。确保它正确处理空输入,空输入和边界情况(“A”,“B”,“A”可能是一个很好的测试)。对于每种情况,您应该有一个测试,并且您的断言应该在每个测试中确切地检查特定情况。