Ниже приведен тестовый класс 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);
}
}
}
По-моему, у вас слишком много настроек и утверждение, которое не очень понятно.
Наличие выражения 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 тестов).