2017-04-13 1 views
1

행렬의 대각선 합계의 차이를 계산하는 작은 함수에 테스트 케이스 (Java, Maven, Junit, Eclipse 사용)를 작성하려고합니다.테스트 데이터를 준비하고 제공하는 방법

기능은 내가이 프로그램을 실행할 때

public class testSolutions { 

    Solution solution = new Solution(); 

    Integer a[][] = { { 11, 2, 4 }, { 4, 5, 6 }, { 10, 8, -12 } }; 
    Integer b[][] = { { 12, 22, 8 }, { 2, 16, 8 }, { 10, 5, -1 } }; 

    @DataProvider 
    public Object[][] provideMatrixAndExpectedSum() { 
     return new Object[][] { { a, new Integer(15) } }; 
    } 

    @Test 
    @UseDataProvider("provideMatrixAndExpectedSum") 
    public void test(Integer a[][], int n) { 

     int diagonalDifference = Solution.diagonalDifference(a, n); 

     assertEquals(diagonalDifference, 15); 
    } 
} 

, 난 오류 "방법 테스트는 더해야 얻을, 나는 실패 뭔가 등에 노력이 대답 https://stackoverflow.com/a/19349565/7115684에서

public static int diagonalDifference(Integer matrix[][], int n) { 
     int diagonalSum1 = 0; 
     int diagonalSum2 = 0; 
     int diagonalDifference = 0; 

     for (int i = 0; i < n; i++) { 
      diagonalSum1 = diagonalSum1 + matrix[i][i]; 
      diagonalSum2 = diagonalSum2 + matrix[i][Math.abs(i - 2)]; 
     } 

     diagonalDifference = Math.abs(diagonalSum1 - diagonalSum2); 
     return diagonalDifference; 
    } 
} 

을 테스트 할 매개 변수. " 여기

내 질문은 :

  1. 어떻게 이러한 상황에 대한 테스트 케이스를 작성할 수있다?
  2. 테스트 용 데이터를 어떻게 준비 할 수 있습니까?
  3. 리소스 폴더에 파일의 속성 종류와 같은 파일을 만들어 다른 기능에도 제공 할 수 있습니까?

답변

1

그것은 2 차원 배열을 받아 테스트 할 수있는 기능처럼 보인다 정수를 반환하고 반환 된 값이 올바른지 여부를 테스트 할 필요가있다. JUint를 사용하여 비슷한 코드와 테스트 유닛을 사용하고 있습니다. 내 코드가하는 일을 귀찮게하지 말고 입력이 전달되고 출력이 검증되어야합니다.

import static junitparams.JUnitParamsRunner.$; 
import static org.junit.Assert.assertEquals;  
import org.junit.Test; 
import org.junit.runner.RunWith;  
import junitparams.JUnitParamsRunner; 
import junitparams.Parameters; 

@RunWith(JUnitParamsRunner.class) 
public class countUniqueNumsParamTest { 

    @SuppressWarnings({ "unused", "deprecation" }) 
    private static final Object[] countUniqueNumbers() { 
     return $(
       // Parameters are (1,2), 1=expected result count, 2= input array 
        $(1,new int[]{0}),  //Test Case 1 
        $(0,new int[]{}),  //Test Case 2 
        $(0,new int[]{0,0}), //Test Case 3   
        $(0,new int[]{0,0,0}), //Test Case 4 

        $(1,new int[]{0,1,1,1}), //Test Case 5 
        $(1,new int[]{1,1,1,0}), //Test Case 6 
        $(2,new int[]{1,0,2,1}), //Test Case 7 
        $(4,new int[]{0,1,2,3})  //Test Case 8 

        ); 
    } 
    @Test 
    @Parameters(method="countUniqueNumbers") 
    public void test(int unique, int[] nums) { 
     countUniqueNums cun = new countUniqueNums(); 
     assertEquals(unique, cun.countUnique(nums)); 
    } 
} 

당신이 이클립스의 JUnit에 대한 올바른 라이브러리를 가져 확인하십시오

public class countUniqueNums { 

public int countUnique (int[] nums) { 
    int unique=0; 
    int [] intVal = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; 
    for (int i = 0; i<nums.length; i++) { 
     intVal[nums[i]+9]++; 
     if (intVal[nums[i]+9]==1) 
      unique++; 
     else 
      if (intVal[nums[i]+9]==2) 
       unique--; 
    } 
    return unique; 
} 
} 

는 그리고 테스트 단위는 같다. 테스트 케이스 수업을 내 작품과 일치하도록 조정하면 좋을 것입니다. 희망이 도움이됩니다.

+0

$ 기호 란 무엇입니까? – user252514

+0

는 $ 방법 [] 새로운 객체의 약자 정적 방법이다. 이 방식은 정적으로 피 검사 방법을 필요로하지 않고 파라미터 테스트를 제공하는 장점을 갖는다. JUnitParamsRunner 당신은 또한 당신의 빌드 경로 JUnit에에 Params 항아리를 추가해야합니다 JUnit 테스트를 매개 변수화의보다 강력한 방법 (여기에 수입없이 JUnit을 테스트 클래스의 코드는) 을 제공합니다. 나중에 자바 빌드 경로에이를 추가 할 수 있습니다. –

0

필자는 그러한 접근 방법이 일반적으로 사용자와 같은 사용 사례에 상당히 혼란 스럽다는 것을 알았습니다. 특히 필요하지 않기 때문에 테스트를 읽고 이해하는 것이 훨씬 어려워졌습니다.

왜 필요하지 않습니까? 두 개의 정수를 합산하여 1 + 2 = 3을 테스트하는 방법을 쓰는 경우 왜 2 + 2 = 4라는 또 다른 테스트를 작성해야합니까? 질문 할 수있는 질문은 " 두 번째 테스트 (2 + 2 = 4) , 은 아니지만 첫 번째 테스트는 계속 실패 할 수 있도록 변경해야합니까?" 프로덕션 코드를 변경할 수 있다면 두 번째 코드는 실패하지만 첫 번째 코드는 실패합니다. 즉, 일반적으로 두 개의 별도 테스트입니다.

왜 이해하기가 어렵습니까?

int summand1 = 1; 
int summand2 = 2; 

int sum = MyMath.sum(summand1, summand2); 

assertEquals(3, sum); 

의 한 블록 IMO 훨씬 쉽게 테스트가 실패하면, 나는 몇 줄의 코드 내의 모든 정보를 가지고

public void myTest(int summand1, int summand2, int expectedResult) { 
    int sum = MyMath.sum(summand1, summand2); 

    assertEquals(expectedResult, sum) 
} 

보다 이해하는 것입니다. 두 번째로, 어떤 매개 변수가 사용되었는지 알지 못한다면 매개 변수의 정의가 테스트 클래스의 어딘가에있을 수 있으므로 실제로 문제가 무엇인지 알아 내기 위해 더 많은 시간을 사용하게됩니다.

관련 문제