【问题标题】:How to test the ordering of elements in a Collection in JUnit test?如何在 JUnit 测试中测试集合中元素的顺序?
【发布时间】:2012-03-30 14:39:53
【问题描述】:

我想用 JUnit 测试验证我的 Java 集合排序算法。如果我将“B”、“C”、“A”输入到集合中并希望对其进行排序(例如按字母顺序),那么使用 JUnit 测试它的正确方法是什么?

我实现了 Comparable 接口并希望确保我的排序正常工作。

我想这个问题可以从 Java 或 JUnit 扩展到任何语言的一般测试。

【问题讨论】:

  • 你的意思是你实现了一个排序算法并想测试集合是否正确排序?
  • 你应该遍历数组并检查每个 N 元素是否小于 N+1 元素
  • 这是另一个主题的解决方案:stackoverflow.com/a/42023087/3062707
  • 你可以写一个类似 shuffle arr 的函数然后排序然后断言排序做这些步骤超过 1000

标签: java junit


【解决方案1】:

我会使用 预期 顺序中的值创建另一个集合,然后检查结果是否匹配。

但老实说,如果您只是想检查IComparable 的实现,而不是某种算法,我会只是对结果做出断言打电话给compareTo。编写测试会更简单,并且更容易理解任何失败。

(如果排序测试失败,那只是意味着许多比较中的一个做错了。它不会帮助您找出哪个比较做了错误的事情。)

【讨论】:

    【解决方案2】:

    不确定我是否完全得到了您的问题。在编写测试的技术方面,您可以使用这些方面的内容(示例使用 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】:

      我会说从特殊情况开始:

      1. 空输入
      2. 逆序输入
      3. 按顺序输入

      【讨论】:

        【解决方案4】:

        无论您使用 JUnit 还是任何其他测试框架,都没有关系。关于单元测试的问题是你想测试你的类行为(这就是为什么要进行单元测试)。测试类本身不应该实现 Comparable,是不是你的类应该实现,但为了测试,这无关紧要。

        想出您要测试的场景列表。

        例如,提交“B”、“C”、“A”,并确保您返回的内容等于“A”、“B”、“C”。确保如果您提交有序列表,则返回相同的有序列表。确保它正确处理空输入、空输入和边界情况(“A”、“B”、“A”可能是一个很好的测试)。您应该为每个案例进行一个测试,并且您的断言应该在每个测试中准确检查特定案例。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-16
          • 1970-01-01
          • 1970-01-01
          • 2011-05-04
          • 1970-01-01
          • 2011-02-06
          • 1970-01-01
          • 2019-12-08
          相关资源
          最近更新 更多