Как я могу реализовать тестирование JUnit в этой программе для бинарного поиска? - PullRequest
0 голосов
/ 27 апреля 2019

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

Я уже пытался реализовать тестирование только для обычного класса Java, созданного мной, но это тоже не сработало, было бы здорово, если бы кто-то мог также объяснить мне синтаксис некоторых тестов для моего кода.

package de.hska.iwi.ads.solution.search;

import java.security.acl.LastOwnerException;

import de.hska.iwi.ads.search.Search;

public class BinarySearch<E extends Comparable<E>> implements Search<E> {


@Override
public int search(E[] a, E key, int lower, int upper) {
    // TODO Auto-generated method stub

    this.lower = lower;
    this.upper = upper;

    if(upper > a.length) {
        throw new ArrayIndexOutOfBoundsException();
    }
    int ret = binarySearch(a, key, lower, upper);

    return returnValue;
}

int lower;
int upper;
int returnValue;



/**
 * 
 * @param a Array, der durchsucht werden soll.
 * @param key Element, nach dem gesucht wird.
 * @param lower untere Grenze des zu durchsuchenden Bereiches.
 * @param upper obere Grenze des zu durchsuchenden Bereiches.
 * @return index der Stelle wo daa Elemnt ist.
 */
private int binarySearch(E[] a, E key, int lower, int upper) {

    if (lower < upper) {

        int middle = (lower / 2) + (upper / 2);
        int tempInt = a[middle].compareTo(key);

        if (tempInt > 0) {

            return binarySearch(a, key, lower, middle - 1);
        }
        if (tempInt < 0) {
            return binarySearch(a, key, middle + 1, upper);
        }

        this.returnValue = middle;
        if (key.equals(a[middle]) && !key.equals(a[middle-1])) {
            return middle;
        } else {
            return binarySearch(a, key, lower, middle-1);
        }
    }

    if (key.equals(a[lower])) {
        this.returnValue = lower;

        int temp = checkForDuplicates(a, key, 0, upper-1);

        return returnValue;
    }

    int temp = key.compareTo(a[this.upper]);
    if(temp > 0) {
        this.returnValue = (this.upper + 1);
        return (this.upper + 1);
    }
    temp = key.compareTo(a[this.lower]);
    if(temp < 0) {
        this.returnValue = this.lower - 1;
        return (this.lower - 1);
    } else {
        this.returnValue = upper + 1;
    }


    return returnValue;

}

int lastIndex;

private int checkForDuplicates(E[] a, E key, int lower, int upper) {

    if (lower < upper) {

        int middle = (lower / 2) + (upper / 2);
        lastIndex = middle;
        int tempInt = a[middle].compareTo(key);

        if (tempInt < 0) {
            return checkForDuplicates(a, key, middle + 1, upper);
        }

        this.returnValue = middle;
        if (key.equals(a[lower])) {
            this.returnValue = lower;
            checkForDuplicates(a, key, 0, middle-1);
            return returnValue;
        }

        return -1;
    }

    if (key.equals(a[lower])) {
        this.returnValue = lower;
        return returnValue;
    } 

    return -1;
}


}

1 Ответ

0 голосов
/ 01 мая 2019

Попытайтесь думать об этом как о «проверке поведения».Поведение, которое вы ожидаете от вашего класса BinarySearch, заключается в том, что для заданного массива A и элемента E он будет возвращать индекс элемента E в A, если E является элементом A, или -1, если это не так.Очень простая первая попытка тестирования может выглядеть следующим образом:

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayNameGeneration;
import org.junit.jupiter.api.DisplayNameGenerator;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;

@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
class BinarySearchTest {

    private BinarySearch<Integer> integerBinarySearch;

    @BeforeEach
    void setUp() {
        integerBinarySearch = new BinarySearch<>();
    }

    @Test
    void returns_index_of_searched_element_when_searched_element_is_in_the_beginning_of_array() {
        // given
        Integer[] numbers = new Integer[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int numberToSearch = 1;

        // when
        int indexOfSearchedNumber = integerBinarySearch.search(numbers, numberToSearch, 0, numbers.length - 1);

        // then
        assertThat(indexOfSearchedNumber).isEqualTo(0);
    }

    @Test
    void returns_index_of_searched_element_when_searched_element_is_in_the_end_of_array() {
        // given
        Integer[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int numberToSearch = 10;

        // when
        int indexOfSearchedNumber = integerBinarySearch.search(numbers, numberToSearch, 0, numbers.length - 1);

        // then
        assertThat(indexOfSearchedNumber).isEqualTo(9);
    }

    @Test
    void returns_index_of_searched_element_when_searched_element_is_in_the_middle_of_array() {
        // given
        Integer[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
        int numberToSearch = 6;

        // when
        int indexOfSearchedNumber = integerBinarySearch.search(numbers, numberToSearch, 0, numbers.length - 1);

        // then
        assertThat(indexOfSearchedNumber).isEqualTo(5);
    }

    @Test
    void returns_minus_one_when_element_is_not_in_array() {
        // given
        Integer[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int numberToSearch = 42;

        // when
        int indexOfSearchedNumber = integerBinarySearch.search(numbers, numberToSearch, 0, numbers.length - 1);

        // then
        assertThat(indexOfSearchedNumber).isEqualTo(-1);
    }
}

Это скажет вам, например, что ваша реализация поиска работает неправильно, когда элемент отсутствует в массиве.Для компиляции этой программы вам нужно добавить зависимости junit5 и assertj в вашу программу.Если вы используете инструмент сборки, такой как gradle, в блок зависимостей в build.gradle необходимо добавить следующие записи:

testImplementation 'org.junit.jupiter: junit-jupiter: 5.4.2'

testImplementation 'org.assertj: assertj-core: 3.12.2'

...