使用测试运行器进行两个不同的测试JUnit

时间:2019-03-31 22:06:35

标签: java junit

我有一个正在使用JUnitCore测试运行程序进行测试的类。该程序实际上从链接列表中删除了第n个值,这非常简单。我正在测试:

1)看看新列表的大小是否是我期望的大小。 2)看看我是否应该删除某个元素。例如,在下面的示例中,我知道“项目1”已被删除。

我的任务是确保1)通过并2)失败,所有这些工作正常,但是在运行我的代码时,我的问题是:

1)这不是一个非常有效的测试,可以进行改进。 2)当1)为True而2)为false(如下面的代码)时,输出仅为“ False”,我不确定这是否正确。

当两个类都为真并且返回True时,我已经尝试过。

  • 测试代码

     import org.junit.Test;
     import org.junit.Ignore;
     import static org.junit.Assert.*;
     import java.util.LinkedList;
    
      public class PruneTest {
       @Test
       public void testListSize() {
    
        LinkedList <String> linkedlist = new LinkedList<String>();
    
        linkedlist.add("Item 0");
        linkedlist.add("Item 1");
        linkedlist.add("Item 2");
        linkedlist.add("Item 3");
        linkedlist.add("Item 4");
        linkedlist.add("Item 5");
        linkedlist.add("Item 6");
        linkedlist.add("Item 7");
        linkedlist.add("Item 8");
        linkedlist.add("Item 9");
    
        Pruner prunes = new Pruner();
        prunes.prune(linkedlist, 2);
    
        assertEquals(5, linkedlist.size());     
      }
    
      @Test
     public void testItemRemoved(){
     LinkedList <String> linkedlist = new LinkedList<String>();
     linkedlist.add("Item 0");
     linkedlist.add("Item 1");
     linkedlist.add("Item 2");
     linkedlist.add("Item 3");
     linkedlist.add("Item 4");
     linkedlist.add("Item 5");
     linkedlist.add("Item 6");
     linkedlist.add("Item 7");
     linkedlist.add("Item 8");
     linkedlist.add("Item 9");
    
     Pruner prunes = new Pruner();
     prunes.prune(linkedlist, 2);
    
     assertTrue(linkedlist.contains("Item 1"));
     }
    }
    
  • 用于创建测试运行器的代码

    import org.junit.runner.JUnitCore;
    import org.junit.runner.Result;
    import org.junit.runner.notification.Failure;
    
    public class PruneTestTwo {
      public static void main() {
        Result result = JUnitCore.runClasses(PruneTest.class);
    
        for (Failure failure : result.getFailures()) {
          System.out.println(failure.toString());
        }
    
       System.out.println(result.wasSuccessful());
      }
    }
    

1 个答案:

答案 0 :(得分:0)

使用替代方法assertThat和匹配器,而不是较旧的assertEquals / assertTrue

,您可以从测试中获得更多详细有用的输出结果

例如,您可以将上面的两个测试结合起来,并得到有意义的输出,说明失败的原因是这样的:

   @Test
   public void testListSize() {

    LinkedList <String> linkedlist = new LinkedList<String>();
    linkedlist.add("Item 0");
    linkedlist.add("Item 1");
    linkedlist.add("Item 2");
    linkedlist.add("Item 3");
    linkedlist.add("Item 4");
    linkedlist.add("Item 5");
    linkedlist.add("Item 6");
    linkedlist.add("Item 7");
    linkedlist.add("Item 8");
    linkedlist.add("Item 9");

    Pruner prunes = new Pruner();
    prunes.prune(linkedlist, 2);

    assertThat(linkedlist.size(), is(5));
    assertThat(linkedlist, hasItem("Item 1"));    
  }

然后,当第二个断言失败时,您将获得与此类似的输出(比一个孤独的false更容易理解):

java.lang.AssertionError: 
Expected: a collection containing "x"
     but: was "Item 0", was "Item 1", was "Item 2", was "Item 3", was "Item 4", was "Item 5", was "Item 6", was "Item 7", was "Item 8", was "Item 9"

通过确保修剪后的列表完全符合您的期望,您可以进一步改进它-无需检查大小和其中的一项,而是可以检查大小和每一项(以及列表的顺序),方法如下:使用contains匹配器:

assertThat(linkedlist, contains("Item 0", "Item 2", "Item 4", "Item 6", "Item 8"));