2019년 5월 17일 금요일

Hackerrank Day 27 Testing







알고리즘 연습 사이트


Day 27:Testing


 단위 테스트의 목적은 개발 코드 단위(예: 함수) 가 예상대로 작동하는지 확인하는 것이다.
함수에 대해 테스트 함수 코드를 작성할 때 예상하는 모든 결과가 다뤄지기를 원할 것이다.


1. 함수가 예기치 않는 결과값을 낼 것으로 생각되는 인수를 인자로 받아본다.
2. 경계값을 인자로 넣어서 테스트한다.
3. 특정 실행 패턴에서 예외를 던질 경우에 대해서도 테스트 해야한다. 





오늘 문제는 테스트 코드를 작성해보는 것인데,
아래는 배열에서 최소값을 갖는 배열의 인덱스를 가져오는 함수이다.
 public static int minimum_index(int[] seq) {
        if (seq.length == 0) {
            throw new IllegalArgumentException("Cannot get the minimum value index from an empty sequence");
        }
        int min_idx = 0;
        for (int i = 1; i < seq.length; ++i) {
            if (seq[i] < seq[min_idx]) {
                min_idx = i;
            }
        }
        return min_idx;
    }class TestDataEmptyArray {
    public static int[] get_array() {
        return new int[]{};
    }
}

아래는 오늘 문제의 구현 코드인데 다양한 조건의 배열을 만들어서 리턴한다. 빈 배열, 유니크한 데이터 배열, 최소값을 최소 2개 이상 갖는 배열을 리턴해 본다. 
특이 케이스 상황을 임의로 만들어보는 것이다.


static class TestDataEmptyArray {
    public static int[] get_array() {
        return new int[]{};
    }
}

static class TestDataUniqueValues {
    public static int[] get_array() {
        return new int[]{1,2,3,4,5};
    }

    public static int get_expected_result() {
        return minimum_index(get_array());
    }
}

static class TestDataExactlyTwoDifferentMinimums {
    public static int[] get_array() {
         return new int[]{1,2,3,4,3,2,1};
    }

    public static int get_expected_result() {
        return minimum_index(get_array());
    }
}

실제로 테스트 할 때 위에서 생성한 배열들을 대상으로 테스트를 진행하고 특이 케이스에서 예외 처리 코드를 작성 해주면 된다. 
아래 코드는 hackerrank에 있는 코드를 가져왔다.
  
public static void TestWithEmptyArray() {
        try {
            int[] seq = TestDataEmptyArray.get_array();
            int result = minimum_index(seq);
        } catch (IllegalArgumentException e) {
            return;
        }
        throw new AssertionError("Exception wasn't thrown as expected");
    }

    public static void TestWithUniqueValues() {
        int[] seq = TestDataUniqueValues.get_array();
        if (seq.length < 2) {
            throw new AssertionError("less than 2 elements in the array");
        }

        Integer[] tmp = new Integer[seq.length];
        for (int i = 0; i < seq.length; ++i) {
            tmp[i] = Integer.valueOf(seq[i]);
        }
        if (!((new LinkedHashSet<Integer>(Arrays.asList(tmp))).size() == seq.length)) {
            throw new AssertionError("not all values are unique");
        }

        int expected_result = TestDataUniqueValues.get_expected_result();
        int result = minimum_index(seq);
        if (result != expected_result) {
            throw new AssertionError("result is different than the expected result");
        }
    }

    public static void TestWithExactlyTwoDifferentMinimums() {
        int[] seq = TestDataExactlyTwoDifferentMinimums.get_array();
        if (seq.length < 2) {
            throw new AssertionError("less than 2 elements in the array");
        }

        int[] tmp = seq.clone();
        Arrays.sort(tmp);
        if (!(tmp[0] == tmp[1] && (tmp.length == 2 || tmp[1] < tmp[2]))) {
            throw new AssertionError("there are not exactly two minimums in the array");
        }

        int expected_result = TestDataExactlyTwoDifferentMinimums.get_expected_result();
        int result = minimum_index(seq);
        if (result != expected_result) {
            throw new AssertionError("result is different than the expected result");
        }
    }




댓글 없음:

댓글 쓰기