Занятие №10
Тестирование в 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());
}
Сколько должно быть тестов?
Полезные ссылки
JavaSIS #3.20 Занятие 10
By lvm444
JavaSIS #3.20 Занятие 10
Тестирование в Spring
- 258