Junit Flashcards

1
Q

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

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

unit testing?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

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

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

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

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

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

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

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

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

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

A
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)); } }
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

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

A
  • assertEquals(int1, int2) или утверждение эквивалентности. Проверяет на равенство двух значений любого примитивного типа;
  • assertFalse, assertTrue(condition) или булевые утверждения. Вместо “condition” необходимо вставить проверяемое условие;
  • assertNull, assertNotNull(obj) относятся к Null утверждениям и проверяет содержимое объектной переменной на Null значение;
  • assertSame(obj1, obj2) утверждение позволяет сравнивать объектные переменные.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

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

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

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

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

НОвовведения Junit5

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

TDD и BDD

A

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

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

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

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Log4j

A

final static Logger logger = Logger.getLogger(classname.class);

logger. debug(“This is debug”);
logger. error(“This is error : “ + parameter);

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

SLF4J

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

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

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

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

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

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

A
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
Q

аннотации

A

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