Junit Flashcards
Чем стаб (stub) отличается от мока (mock)?
Stub – объекты, которые предоставляют заранее заготовленные ответы на вызовы во время выполнения теста и обычно не отвечающие ни на какие другие вызовы, которые не требуются в тесте. Также могут запоминать какую-то дополнительную информацию о количестве вызовов, параметрах и возвращать их потом тесту для проверки. Используется для “затычки” сервисов, методов, классов и т.д. Абсолютно все равно что они вернут при работе или сколько раз произойдет вызов.
Mock – объекты, которые заменяют реальный объект в условиях теста и позволяют проверять вызовы своих членов как часть системы или unit-теста. Содержат заранее запрограммированные ожидания вызовов, которые они ожидают получить. Применяются в основном для т.н. interaction (behavioral) testing. Используется для подмены результатов вызова функций в юнит тестах (важен результат), для учета количества вызовов функций и просто ожидания их вызовов. Используется в области Assert юнит теста.
unit testing?
Модульное тестирование или unit testing — процесс проверки на корректность функционирования отдельных частей исходного кода программы путем запуска тестов в искусственной среде.
Что такое Фикстуры?
Фикстура (Fixture) — состояние среды тестирования, которое требуется для успешного выполнения тестового метода. Может быть представлено набором каких-либо объектов, состоянием базы данных, наличием определенных файлов, соединений и проч.
Какие есть аннотации фикстур?
Предусмотрено четыре аннотации фикстур — две для фикстур уровня класса и две для фикстур уровня метода.
• @BeforeClass — запускается только один раз при запуске теста.
• @Before — запускается перед каждым тестовым методом.
• @After — запускается после каждого метода.
• @AfterClass — запускается после того, как отработали все тестовые методы.
Для чего нужна Аннотация @Ignore?
Аннотация @Ignore заставляет инфраструктуру тестирования проигнорировать данный тестовый метод. Аннотация предусматривает наличие комментария о причине игнорирования теста, полезного при следующем к нему обращении.
Что такое интеграционные тесты?
Что такое интеграционные тесты?
Интеграционные тесты — это тесты, проверяющие работоспособность двух или более модулей системы, но в совокупности — то есть нескольких объектов как единого блока.
Как все работает
public class Salary { private int value; private String type;
public Salary(int v, String t){ value = v; type = t; }
public Salary add(Salary s){ return new Salary(value + s.getValue(), type); }
public int getValue(){ return value; } }
import static org.junit.Assert.*;
import org.junit.Test;
public class TestSalary { @Test public void testAdd() { Salary m1 = new Salary(12, "USD"); Salary m2 = new Salary(14, "USD"); Salary expected = new Salary(26, "USD"); Salary result = m1.add(m2); assertFalse(expected.equals(result)); } }
Команды - проверки результата
- assertEquals(int1, int2) или утверждение эквивалентности. Проверяет на равенство двух значений любого примитивного типа;
- assertFalse, assertTrue(condition) или булевые утверждения. Вместо “condition” необходимо вставить проверяемое условие;
- assertNull, assertNotNull(obj) относятся к Null утверждениям и проверяет содержимое объектной переменной на Null значение;
- assertSame(obj1, obj2) утверждение позволяет сравнивать объектные переменные.
как затестировать выброс Exception
@Test(expected = Exception.class)
“expected = Exception.class” означает, что мы ждем появление исключения Exception. Если исключение не будет выброшено, то такое поведение тестируемой функции будет неверным и тест провалится.
ОТличие @BeforeClass от @Before
@BeforeClass - используется при однократном вызове фикстур
НОвовведения Junit5
JUnit больше не требует, чтобы методы были публичными.
Опциональное сообщение сделали последним аргументом.assertEquals(2017, 2017, “The optional assertion message is now the last parameter.”);
добавили assertAll(“habr”,
() -> assertThat(“https://habrahabr.ru”, startsWith(“https”)),
() -> assertThat(“https://habrahabr.ru”, endsWith(“.ru”))
);
assertIterableEquals(asList(1, 2, 3), asList(1, 2, 3));
Добавили интересный метод для сравнения набора строк. Поддерживаются регулярные выражения!
Assertions.assertLinesMatch(
asList(“можно сравнивать строки”, “а можно по regex: \d{2}\.\d{2}\.\d{4}”),
asList(“можно сравнивать строки”, “а можно по regex: 12.09.2017”)
);
Исключения улучшили Throwable exception = assertThrows(IllegalArgumentException.class, () -> { throw new IllegalArgumentException("что-то пошло не так"); });
assertEquals(“что-то пошло не так”, exception.getMessage());
Для гарантии независимости и изоляциии тестов JUnit во всех предыдущих версиях всегда создавал по инстансу на тест (т.е. на каждый запуск метода отдельный инстанс). В пятой версии такое поведение можно изменить используя новую аннотацию @TestInstance(Lifecycle.PER_CLASS).
Параметризированные тесты позволяют запускать тест несколько раз с различными входными данными.
@ParameterizedTest
@ValueSource(strings = { “Hello”, “World” })
void testWithStringParameter(String argument) {
assertNotNull(argument);
}
или
@ParameterizedTest
@ValueSource(strings = { “01.01.2017”, “31.12.2017” })
void testWithConverter(@JavaTimeConversionPattern(“dd.MM.yyyy”) LocalDate date) {
assertEquals(2017, date.getYear());
}или
@ParameterizedTest
@CsvSource({ “foo, 1”, “bar, 2”, “‘baz, qux’, 3” })
// или даже так: @CsvFileSource(resources = “/two-column.csv”)
void testWithCsvSource(String first, int second) {
assertNotNull(first);
assertNotEquals(0, second);
}
\пример с источником данных (это все параметризированные тесты)
@ParameterizedTest
@ArgumentsSource(MyArgumentsProvider.class)
void testWithArgumentsSource(String argument) {
assertNotNull(argument);
}
static class MyArgumentsProvider implements ArgumentsProvider { @Override public Stream extends Arguments> provideArguments(ExtensionContext context) { return Stream.of("foo", "bar").map(Arguments::of); } }
Аннотированные default методы в интерфейсах
TDD и BDD
*DD - стиль разработки, когда ты сначала пишешь тест, потом он проваливается, потом ты пишешь код, чтоб тест прошел
TDD
- пишем тесты - потом под них код, Лишь бы покрыть зеленым. потом рефакторинг
BDD
- пишем фичаспеки - это этап детализации более высокоуровневых требований. Затем пользовательские кейсы, потом под это код, пототм рефакторинг
DDT - когда в тестах много входных параметров
Log4j
final static Logger logger = Logger.getLogger(classname.class);
logger. debug(“This is debug”);
logger. error(“This is error : “ + parameter);
настройки в log4j.properties
SLF4J
является оберткой над logback
Уровни Тестирования
Модульное (unit) тест метода
Интеграционное тестирование взаимодействие методов
Системное наличие и исправность
функций системы
Операционное тестирование нужды пользователей
Приемочное тестирование эксплуатируем или нет