Junit Flashcards Preview

Java > Junit > Flashcards

Flashcards in Junit Deck (18)
Loading flashcards...
1

Чем стаб (stub) отличается от мока (mock)?

Stub – объекты, которые предоставляют заранее заготовленные ответы на вызовы во время выполнения теста и обычно не отвечающие ни на какие другие вызовы, которые не требуются в тесте. Также могут запоминать какую-то дополнительную информацию о количестве вызовов, параметрах и возвращать их потом тесту для проверки. Используется для "затычки" сервисов, методов, классов и т.д. Абсолютно все равно что они вернут при работе или сколько раз произойдет вызов.
Mock – объекты, которые заменяют реальный объект в условиях теста и позволяют проверять вызовы своих членов как часть системы или unit-теста. Содержат заранее запрограммированные ожидания вызовов, которые они ожидают получить. Применяются в основном для т.н. interaction (behavioral) testing. Используется для подмены результатов вызова функций в юнит тестах (важен результат), для учета количества вызовов функций и просто ожидания их вызовов. Используется в области Assert юнит теста.

2

unit testing?

Модульное тестирование или unit testing — процесс проверки на корректность функционирования отдельных частей исходного кода программы путем запуска тестов в искусственной среде.

3

Что такое Фикстуры?

Фикстура (Fixture) — состояние среды тестирования, которое требуется для успешного выполнения тестового метода. Может быть представлено набором каких-либо объектов, состоянием базы данных, наличием определенных файлов, соединений и проч.

4

Какие есть аннотации фикстур?

Предусмотрено четыре аннотации фикстур — две для фикстур уровня класса и две для фикстур уровня метода.
• @BeforeClass — запускается только один раз при запуске теста.
• @Before — запускается перед каждым тестовым методом.
• @After — запускается после каждого метода.
• @AfterClass — запускается после того, как отработали все тестовые методы.

5

Для чего нужна Аннотация @Ignore?

Аннотация @Ignore заставляет инфраструктуру тестирования проигнорировать данный тестовый метод. Аннотация предусматривает наличие комментария о причине игнорирования теста, полезного при следующем к нему обращении.

6

Что такое интеграционные тесты?

Что такое интеграционные тесты?
Интеграционные тесты — это тесты, проверяющие работоспособность двух или более модулей системы, но в совокупности — то есть нескольких объектов как единого блока.

7

Как все работает

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)); } }

8

Команды - проверки результата

- assertEquals(int1, int2) или утверждение эквивалентности. Проверяет на равенство двух значений любого примитивного типа;
- assertFalse, assertTrue(condition) или булевые утверждения. Вместо “condition” необходимо вставить проверяемое условие;
- assertNull, assertNotNull(obj) относятся к Null утверждениям и проверяет содержимое объектной переменной на Null значение;
- assertSame(obj1, obj2) утверждение позволяет сравнивать объектные переменные.

9

как затестировать выброс Exception

@Test(expected = Exception.class)
“expected = Exception.class” означает, что мы ждем появление исключения Exception. Если исключение не будет выброшено, то такое поведение тестируемой функции будет неверным и тест провалится.

10

ОТличие @BeforeClass от @Before

@BeforeClass - используется при однократном вызове фикстур

11

НОвовведения 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 методы в интерфейсах

12

TDD и BDD

*DD - стиль разработки, когда ты сначала пишешь тест, потом он проваливается, потом ты пишешь код, чтоб тест прошел

TDD
- пишем тесты - потом под них код, Лишь бы покрыть зеленым. потом рефакторинг

BDD
- пишем фичаспеки - это этап детализации более высокоуровневых требований. Затем пользовательские кейсы, потом под это код, пототм рефакторинг

DDT - когда в тестах много входных параметров

13

Log4j

final static Logger logger = Logger.getLogger(classname.class);
logger.debug("This is debug");
logger.error("This is error : " + parameter);

настройки в log4j.properties

14

SLF4J

является оберткой над logback

15

Уровни Тестирования

Модульное (unit) тест метода
Интеграционное тестирование взаимодействие методов
Системное наличие и исправность
функций системы
Операционное тестирование нужды пользователей
Приемочное тестирование эксплуатируем или нет

16

Stub (заглушка) для интерфейса

interface Service {
String doSomething();
}

class ServiceStub implements Service {
public String doSomething(){
return "my stubbed return";
}
}

17

Stub (заглушка) для класса

class Service {
public String doSomething(){
// interact with external service
// make some heavy computation
return "real result";
}
}

class ServiceStub extends Service {
@Override
public String doSomething(){
return "stubbed result";
}
}

18

аннотации

@Test определяет что метод method() является тестовым.
@Before указывает на то, что метод будет выполнятся перед каждым тестируемым методом @Test.
@After указывает на то что метод будет выполнятся после каждого тестируемого метода @Test
@BeforeClass указывает на то, что метод будет выполнятся в начале всех тестов, а точней в момент запуска тестов(перед всеми тестами @Test).
@AfterClass указывает на то, что метод будет выполнятся после всех тестов.
@Ignore говорит, что метод будет проигнорирован в момент проведения тестирования.
@Test (expected = Exception.class) (expected = Exception.class) – указывает на то, что в данном тестовом методе вы преднамеренно ожидается Exception.
@Test (timeout=100) (timeout=100) – указывает, что тестируемый метод не должен занимать больше чем 100 миллисекунд.