JUnit blackbox/ whitebox для проверки выбора сортировки?

Я пытаюсь понять и применить методы JUnit для "черного ящика" и "белого ящика" в классе SelectionSort, но у меня возникают проблемы с пониманием того, в каком направлении двигаться.

Одна из моих неудачных попыток приведена ниже. Я пытаюсь проверить размер массива из моего класса SelectionSort, но мой метод (unsortedArray) не распознается.

@Test
public void testUnsortedArray() {
    int n = 20;
    int[] x = new int[n];
    for (int i = 0; i < 20; i++) {
        x[i] = (n);

        n--;
        i++;
    }
    SelectionSort2 a = new SelectionSort2();
    assertArrayEquals(20, a.unsortedArray(x, 20));

}

Ниже представлен мой класс SelectionSort. Любая помощь или руководство очень ценится:)

public class SelectionSort2 {

    public static void main(String[] args)
    {
        int n = 20;
        int[] numArray = unsortedArray(n); // re-initialize 
        printArray(numArray,n);
        selectSort2(numArray, n);
        printArray(numArray, n);
    }


    //Generate data for the selection sort array 
    public static int[] unsortedArray(int n) {
        int[] a = new int[n];
        for (int index = 0; index < n; index++) {
            a[index] = (n - index);
        }
        return a;
    }
    //print the array 
    public static void printArray(int[] data, int n)
    {
        for (int index = 0; index < n; index++) {
            System.out.print(data[index] + " ");
        }
        System.out.println();
    }

    public static void selectSort2(int[] data, int n)
    {
        for (int numUnsorted = n; numUnsorted > 0; numUnsorted--) {
            int maxIndex = 0;
            for (int index = 1; index < numUnsorted; index++) {
                if (data[maxIndex] < data[index])
                    maxIndex = index;
                //swap the element 
                int temp = data[numUnsorted-1];
                data[numUnsorted-1] = data[maxIndex];
                data[maxIndex] = temp;

            }
        }
    }
} 

2 ответа

Решение

Тестирование черного ящика можно рассматривать как пары ввода-вывода. Вы даете своей программе набор входов и смотрите, соответствуют ли выходы тому, что вы ожидаете.

Так что в этом случае у вас будет что-то вроде:

input: {5, 3, 1};                 expected output: {1, 3, 5}
input: {9, 7, 5, 6, 8, 34, 3, 6}; expected output: {3, 5, 6, 6, 7, 8, 9, 34}
input: {}                         expected output: {}
input: {1, 3, 5}                  expected output: {1, 3, 5}

и вы бы использовали что-то вроде assertArrayEquals() чтобы убедиться, что вывод программы соответствует ожидаемому.

Тестирование белого ящика немного сложнее, потому что вы разрабатываете тесты, которые пытаются выполнить все возможные пути через код, что означает, что тесты белого ящика имеют тенденцию быть немного более специфичными для реализации. Если честно, я не очень знаком с тестированием белого ящика, поэтому я не могу вам чем-то помочь. Я предполагаю, что тестирование "белого ящика" для этого будет по существу смотреть на ваш код и искать различные угловые случаи, которые могут появиться во время выполнения. Ваш код кажется довольно простым, хотя я не уверен, какие случаи вы можете встретить, которые еще не были бы охвачены тестами черного ящика...

Я думаю, что для конкретного теста, который вы дали, проблема заключается в следующем:

assertArrayEquals(20, a.unsortedArray(x, 20));

assertArrayEquals() либо принимает два массива в качестве аргументов или String и два массива, с String действует как сообщение об ошибке. Я не думаю, что ваш код скомпилируется, так как ни один из передаваемых вами аргументов не является действительным. Кроме того, вы не определяете unsortedArray(int[], int) метод... Вы хотели сделать selectSort2(x, 20)?

Как только вы исправите эту строку, тест JUnit должен работать. Комментируя, что одна строка позволила запустить тест JUnit по крайней мере на моем компьютере.

Еще одна вещь - вы сказали, что хотите проверить размер массива в классе SelectionSort. Для этого, assertTrue() Возможно, это и есть метод, но я не уверен, что такой тест будет полезен, потому что размеры массива не могут быть изменены, и вы не возвращаете новый массив в любой точке.

Метод assertArrayEquals используется для проверки 2 массивов. Но ваш первый аргумент 20 не является объектом массива, который может быть причиной сбоя.

Другие вопросы по тегам