Занятие №11

Тестирование в Spring

Владимир

Лебедко

Что такое тестирование?

Тестирование программного обеспечения

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

Худший вариант

Стоимость исправления

Время обнаружения ошибки

t

Компилятор + Статический анализатор

Автоматизированный тест

QA инженер

Клиент

Разработчик

Test Driven Development

Автоматизированное тестирование

  • Модульное (Unit) тестирование 

  • Интеграционной тестирование

  • Функциональное тестирование

Модульное (Unit) тестирование

Требования к Unit тесту

  • Быстрый
  • Изолированный
  • Повторяемый
  • Самопроверяющий

AAA

Int a = 5
Int b = 10

Calculator calc = new Calculator();

Arrange

Act

int actual = calc.sum(a,b);

Assert

assertEqual(15,actual)

Framework

Gradle

Зависимости

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

Команды

gradlew test

Аннотации

  • @BeforeClass
  • @Before
  • @Test
  • @After
  • @AfterClass

Соглашение о структуре

Assertion базовые

  • assertEqual
  • assertNotEquals
  • assertTrue
  • assertFalse
  • assertArrayEquals
Assert.

Assertion Hamcrest

Hamcrest

assertThat(actual,is(not(equal(matcher)))
assertThat(T actual, Matcher<? super T> matcher)

Интерфейс

testCompile group: 'org.hamcrest', name: 'hamcrest-library', version:'1.3'
testCompile group: 'org.hamcrest', name: 'hamcrest-core', version:'1.3'

Зависимости

Advanced Assertions

Shazamcrest

testCompile group: 'com.shazam', name: 'shazamcrest', version: '0.11'
assertThat(
  actualPerson,
  sameBeanAs(expectedPerson)
  	.with("address.streetName", startsWith("Via"));

Mockito

@Mock

@InjectMock

@Spy

testCompile group: 'org.mockito', name: 'mockito-all', version: '1.10.19'

Аннотации

Dependency

Mockito Binding

when(user.getName()).thenReturn("John");
doReturn(true).when(user).getName());

when - then

doReturn - then

Argument Capture

ArgumentCaptor<SomeData> captor;
captor = ArgumentCaptor.forClass(SomeData.class);
verify(other, times(1))
		.doSomething(captor.capture());

// Assert the argument
SomeData actual = captor.getValue();
assertEquals("Some inner data", actual.innerData);

Интеграционное тестирование

MockMvc

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {TestDrivenApplication.class})
@WebAppConfiguration
public class ProductDiscountControllerTest {

    @Autowired
    WebApplicationContext wac; 
    MockMvc mockMvc;
    
    @Before
    public void setup() {
        this.mockMvc = MockMvcBuilders.
        				webAppContextSetup(this.wac)
                        .dispatchOptions(true).build();
    }

    @Test
    public void getDiscount() throws Exception {
        mockMvc.perform( MockMvcRequestBuilders
                .get("/api/discount/1?clientId=2")
                .accept(MediaType.ALL))
                .andDo(print())
                .andExpect(MockMvcResultMatchers.status().isOk());
    }

Сколько должно быть тестов?

Полезные ссылки

Занятие 11

By Сибирские интеграционные системы