2014-01-10 195 views
1

我是jUnit测试的新手,我不知道它是如何工作的,我尝试在网上浏览一些教程,但无法理解。所以我发布我的代码和testClass的框架,那么在这种情况下如何修改testClass,以便我能够理解jUnit的工作方式。如何做jUnit测试

的方法,我想测试:

public String quickSortArray(String numbers, String indexNumber) throws NumberFormatException, Exception{ 

       String[] data = numbers.split(";"); 
       int index = parseInt(indexNumber); 
       int[] inputNum = new int[data.length]; 

       for (int i = 0; i < data.length; i++) { 
        inputNum[i] = parseInt(data[i]); 

       } 
       Set<Integer> removeDuplicates = new HashSet<Integer>(); 
       for (int j = 0; j < inputNum.length; j++) { 
        removeDuplicates.add(inputNum[j]); 
       } 
       int[] finalSortArray = new int[removeDuplicates.size()]; 
       int k = 0; 
       for (Integer move : removeDuplicates) { 
        finalSortArray[k++] = move; 
       } 
       Arrays.sort(finalSortArray); 
       if (finalSortArray.length < index) { 
        return "The index cannot be greater than the non-repeated numbers";      
       } else { 
        int result=finalSortArray[finalSortArray.length-index];      
        return String.valueOf(result); 
       } 
      } 

的TestClass的IDE生成:

/** 
    * Test of quickSortArray method, of class quickSort. 
    */ 
    public void testQuickSortArray() throws Exception { 
     System.out.println("quickSortArray"); 
     String numbers = ""; 
     String indexNumber = ""; 
     quickSort instance = new quickSort(); 
     String expResult = ""; 
     String result = instance.quickSortArray(numbers, indexNumber); 
     assertEquals(expResult, result); 
     // TODO review the generated test code and remove the default call to fail. 
     fail("The test case is a prototype."); 
    } 

所以,我只是想知道的TestClass应该怎么写,我的方法已针对其功能进行了测试。我真的很感激所有的帮助

该方法基本上做的是从一个由分号分隔的数组组成,它首先将它们转换为int,然后删除重复,然后找到第N个最大的数字。 N是这种情况下的指数。

这里是一些手动数据,我不想让人回答计算这个问题的麻烦: expResult = 57; numbers =“12; 57; 65” index =“2”;

expResult = 39; numbers =“09; 78; 45; 39; 05” index =“3”;

我只是想知道如何在代码中使用它。

+0

你可以跑一个海湾愤怒。 – GGrec

+2

1)创建测试数据。 2)手动计算该测试数据的答案。 3)确认该方法返回相同的答案。 4)找出角落案例。附:为什么这种方法在没有这种事情时称为“快速排序”? –

+0

@GGrec ??那是什么,正如我所说我是jUnit的新手。不要知道任何事情。 –

回答

2

假设你的类看起来像这样

import java.util.Arrays; 
import java.util.HashSet; 
import java.util.Set; 


public class X { 

    public String quickSortArray(String numbers, String indexNumber) throws NumberFormatException, Exception{ 

     String[] data = numbers.split(";"); 
     int index = parseInt(indexNumber); 
     int[] inputNum = new int[data.length]; 

     for (int i = 0; i < data.length; i++) { 
      inputNum[i] = parseInt(data[i]); 

     } 
     Set<Integer> removeDuplicates = new HashSet<Integer>(); 
     for (int j = 0; j < inputNum.length; j++) { 
      removeDuplicates.add(inputNum[j]); 
     } 
     int[] finalSortArray = new int[removeDuplicates.size()]; 
     int k = 0; 
     for (Integer move : removeDuplicates) { 
      finalSortArray[k++] = move; 
     } 
     Arrays.sort(finalSortArray); 
     if (finalSortArray.length < index) { 
      return "The index cannot be greater than the non-repeated numbers";      
     } else { 
      int result=finalSortArray[finalSortArray.length-index];      
      return String.valueOf(result); 
     } 
    } 

    private int parseInt(String indexNumber) { 
     return Integer.parseInt(indexNumber); 
    } 
} 

我想你可以写一些像这样的JUnit测试

import static org.junit.Assert.*; 

import org.junit.Test; 


public class XTest { 

    @Test 
    public void testQuickSortArray1() throws NumberFormatException, Exception { 
     String numbers="12;57;65"; 
     String index="2"; 
     String result = new X().quickSortArray(numbers, index); 
     assertEquals("57",result); 
    } 

    @Test 
    public void testQuickSortArray2() throws NumberFormatException, Exception { 
     String numbers="09;78;45;39;05"; 
     String index="3"; 
     String result = new X().quickSortArray(numbers, index); 
     assertEquals("39",result); 
    } 

} 
+0

非常好。非常感谢,真的很有帮助。 –

0
  1. 将你的方法分解成更小的可测试方法:在这里你有输入解析(从字符串到某种集合)和可能排序的组合(很难遵循) - 你想测试这些功能单独
  2. 定义您要测试的“测试用例”,首先不是以编程方式,而是从概念上进行测试。例如,您要测试方法是否对空数据不成功,对排序数据,大小为1的数据,奇数和偶数大小,对多个重复值等有效。
  3. 定义方法应该抛出异常和写入的测试方法为注解它们作为@Test(expected=IllegalArgumentException.class)
  4. 每测试用例执行以下形式的测试方法(此代码特定部分可能不是可编译:)

    @Test 
    public testPresortedValues() 
    { 
        List<Integer> data = Lists.newArrayList(1, 1, 1, 2, 25, 30); 
        List<Integer> expected = Lists.newArrayList(1, 1, 1, 2, 25, 30); 
        Sorter sorter = new Sorter(); 
        sorter.sort(data); 
        for (int i = 0; i < data.size(); ++i) 
        { 
         Asser.assertEquals(data.get(i), expected.get(i); 
        } 
    } 
    
+0

先生我想了解它是如何工作的,所以如果你可以使用我的手动数据并编辑我的testClass以便理解,我将不胜感激。 –

+0

恐怕我的解释和例子已经够全面了。首先重构你的代码(这也是在其他答案中提出的),发布你的更新代码,然后有人会选择提供实际测试用例的任务,也许我会。实际上@ptyx已经为你提供了两个例子,我不会直接在字符串上这样做,但你还想要什么? –

+0

没问题我会看看我能做些什么 –

1

什么方法基本烯丙基确实是从数字数组由分号分隔 它第一将它们转换为int 然后移除 复制然后发现第N数量最多。 N是 这种情况下

第一步将你的方法分为3个(或更多),因此可以单独地测试每个方面的索引。

单元测试的想法是,如果每个单独的砖的作品,装配工程。

您的测试则变得非常简单:

@Test 
public void parsesSimpleArray(){ 
    assertThat(parser.parse("12;57;65")).eq(new int[]{12,57,65}); 
} 

@Test 
public void parseIgnoresEmptyStrings(){ 
    // or whatever your desired behavior should be 
    assertThat(parser.parse("12;;65")).eq(new int[]{12,65}); 
} 

等等

+0

你想让我把我的quickSortArray分成三种不同的方法吗? –

+0

是的。它做得太多了,这意味着测试边界条件或复杂的行为将会很困难。将它分解成简单的方法,只做一件事和一件事。如果你需要一个结合解析,重复数据删除和排序的方便的API,那很好 - 但你实际上并不需要测试它,因为它唯一应该做的就是调用sort(deduplicate(parse()),并且你已经有了排序(),deduplicate()和parse() – ptyx

+0

要扩大我的答案:当某些事情难以测试时,通常是因为它做得太多,依赖于太多的状态,或者不是很好的代码。在这种情况下的答案是修复代码,以便测试更容易,而不是提出一个复杂的脆性测试。小设计的验证是单元测试的一个主要优点 – ptyx