Тестирование Junit: тестирование всех возможных границ?

1

Ниже приведен тестовый класс Junit, который я написал. Мне интересно, как можно было бы проверить границы каждого класса.

 public class TestLibrarySearch {

        // Test data structures - books, etc

        // some books
        Book b1, b2, b3;

        String authorB1, authorB2, authorB3;
        String ISBNB1, ISBNB2, ISBNB3;

        String titleB1, titleB2, titleB3;

        int ratingB1, ratingB2, ratingB3;

        // the array list of books structure
        ArrayList<Book> arrayList; 

        @Before
        public void setUp() throws Exception {
            // create some books with test data
            authorB1 = "B1Author";
            authorB2 = "B2Author"; 
            authorB3 = "B3Author";

            titleB1 = "B1Title";
            titleB2 = "B2Title";
            titleB3 = "B3Title";

            ISBNB1 = "ISBNB1AAAA";
            ISBNB2 = "ISBNB2AAAA";
            ISBNB3 = "ISBNB3AAAA";


            ratingB1 = 1;
            ratingB2 = 1;
            ratingB3 = 3;

            // create the test book object 
            b1 = new Book(ISBNB1, authorB1, titleB1, ratingB1);
            b2 = new Book(ISBNB2, authorB2, titleB2, ratingB2);
            b3 = new Book(ISBNB3, authorB3, titleB3, ratingB3);

            // create the array list of books
            arrayList = new ArrayList<Book>(); 

            // add the book to the list
            arrayList.add(b1);
            arrayList.add(b2);
            arrayList.add(b3);
        }

Например, в классе ниже метод позволяет искать книгу с использованием определенного рейтинга. (1-5), как бы реализовать тест, который также ищет вне пределов, будет ли это тестирование для исключения?

@Test
    public void testSearchByRating() {
        LibrarySearch ls = new LibrarySearch(arrayList);
        ArrayList<Book> results =  ls.searchByRating(1);

        if ((results.contains(b1)) && (results.contains(b2))){
            assertTrue(true);
        } else {
            assertTrue(false);
        }
    }

}
Теги:
validation
junit
range

1 ответ

1

По-моему, у вас слишком много настроек и утверждение, которое не очень понятно.

Наличие выражения if в тесте - это запах.

рефакторинг из инструкции if оставляет тест с:

@Test
public void testSearchByRating() {
    LibrarySearch ls = new LibrarySearch(arrayList);
    ArrayList<Book> results =  ls.searchByRating(1);

    assertTrue(results.contains(b1) && results.contains(b2));
}

На самом деле вы могли бы включить в себя нестандартную настройку, чтобы у вас была суть того, что вы тестируете с первого взгляда. Кроме того, остерегайтесь магических чисел. вы хотите быть ясно, что рейтинг в книге соответствует рейтингу, который вы ищете.

@Test
public void testSearchByRating() {
    //setup/given
    int rating = 1;
    // if the ISBN is a key, specify 2 different strings, if not use a constant
    // if the structure of the ISBN is not checked, prefer a String like "isbn 1"
    Book b1 = new Book("ISBNB1AAAA", ANY_AUTHOR, ANY_TITLE, rating);
    Book b2 = new Book("ISBNB2AAAA", ANY_AUTHOR, ANY_TITLE, rating);
    LibrarySearch ls = new LibrarySearch(Arrays.asList(b1,b2));

    // execution/when
    ArrayList<Book> results =  ls.searchByRating(rating);

    // assertion/then
    assertTrue(results.contains(b1));
    assertTrue(results.contains(b2));
}

Если вы хотите протестировать поиск с недопустимым рейтингом, рассмотрите желаемое поведение. Это может быть одно из следующего:

@Test(expected=IllegalArgumentException.class)
public void searchForNegativeRatingThrows() {
    LibrarySearch ls = new LibrarySearch(Collections.emptyList());

    ls.searchByRating(rating);
}

@Test
public void searchForNegativeRatingYieldsNothing() {
    int rating = -1;
    LibrarySearch ls = new LibrarySearch(Arrays.asList(bookWithRating(rating)));

    ArrayList<Book> results = ls.searchByRating(rating);

    assertEquals(0, results.size());
}

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню