Slide 1

Slide 1 text

Меркушев Кирилл Руководитель группы автоматизации тестирования ДАЁШЬ СВОЙ ПЕРВЫЙ АВТОТЕСТ!

Slide 2

Slide 2 text

Получаем Запускаем Правим Сохраняем

Slide 3

Slide 3 text

3 Правим Получаем, запускаем - . . . - Сохраняем

Slide 4

Slide 4 text

@Test
 public void testOk() {
 //шаги 1-2
 List users = createNumberOfUsers(100);
 registerAndGoToAnotherServiceWithPhoneToAllUsersHavingNoPhoneYet(users, randomPhone);
 //шаги 3-4
 identity = create();
 params.put(ID, identity);
 params.put(IGNORE, "1");
 params.put(NUMBER, format(random));
 callAndAfterThatCheckResponse(params, POST, responseIsOKOrMaybeNot());
 identity.update();
 
 if(identity.getName() == null) { assertTrue(identity.getName() != null);
 for(String param : params) { 
 //шаги 5-7
 params1.put(random, param);
 callAndCheckResponse(params, GET, respSpecSomethingNotExpected());
 identity.update();
 }
 assertFalse(identity.updated());
 
 //шаги 8-10
 goToNextPageAndDoLotOfWorkWithNumberOfUsersWePreviouslyRegistered(user);
 
 assertTrue(itsOk());
 assertFalse(itsNotOk());
 4 Правим код - Что При неграмотном автотестировании

Slide 5

Slide 5 text

@Test public void shouldProvideCity() { Weather weather = new WeatherService(clientFor(CITY)) .getWeather(CITY, REGION);
 assumeThat(«weather», weather, notNullValue()); assertThat(«city», weather.getCity(), equalTo(CITY)); } @Test
 public void testOk() {
 //шаги 1-2
 List users = createNumberOfUsers(100);
 registerAndGoToAnotherServiceWithPhoneToAllUsersHavingNoPhoneYet(users, randomPhone);
 //шаги 3-4
 identity = create();
 params.put(ID, identity);
 params.put(IGNORE, "1");
 params.put(NUMBER, format(random));
 callAndAfterThatCheckResponse(params, POST, responseIsOKOrMaybeNot());
 identity.update();
 
 if(identity.getName() == null) { assertTrue(identity.getName() != null);
 for(String param : params) { 
 //шаги 5-7
 params1.put(random, param);
 callAndCheckResponse(params, GET, respSpecSomethingNotExpected());
 identity.update();
 }
 assertFalse(identity.updated());
 
 //шаги 8-10
 goToNextPageAndDoLotOfWorkWithNumberOfUsersWePreviouslyRegistered(user);
 
 assertTrue(itsOk());
 assertFalse(itsNotOk());
 5 Правим код - Что При развитом автотестировании При неграмотном автотестировании

Slide 6

Slide 6 text

6 проекта структура Правим код - Что структура класса

Slide 7

Slide 7 text

7 Правим код - Что структура класса Линейность Понятность Краткость

Slide 8

Slide 8 text

public class TestClass {
 
 private static final String DONT_MATTER = "string";
 
 private static TemporaryFolder classvar = new TemporaryFolder();
 
 private File instancevar;
 
 @Test
 public void shouldDo() throws Exception {
 }
 
 @Test
 public void expectWhen() throws Exception {
 }
 } 8 Правим код - Что структура класса

Slide 9

Slide 9 text

9 Правим код - Что public class TestClass { // объединение
 
 private static final String DONT_MATTER = "string";
 
 private static TemporaryFolder classvar = new TemporaryFolder();
 
 private File instancevar;
 
 @Test
 public void shouldDo() throws Exception {
 }
 
 @Test
 public void expectWhen() throws Exception {
 }
 } структура класса

Slide 10

Slide 10 text

10 public class TestClass {
 // постоянное значение с именем собственным
 private static final String DONT_MATTER = "string";
 
 private static TemporaryFolder classvar = new TemporaryFolder();
 
 private File instancevar;
 
 @Test
 public void shouldDo() throws Exception {
 }
 
 @Test
 public void expectWhen() throws Exception {
 }
 структура класса Правим код - Что

Slide 11

Slide 11 text

11 public class TestClass {
 
 private static final String DONT_MATTER = "string"; 
 // свойственно всем экземплярам
 private static TemporaryFolder classvar = new TemporaryFolder();
 
 private File instancevar;
 
 @Test
 public void shouldDo() throws Exception {
 }
 
 @Test
 public void expectWhen() throws Exception {
 }
 структура класса Правим код - Что

Slide 12

Slide 12 text

12 public class TestClass {
 
 private static final String DONT_MATTER = "string";
 
 private static TemporaryFolder classvar = new TemporaryFolder(); 
 // свойство конкретного экземпляра
 private File instancevar;
 
 @Test
 public void shouldDo() throws Exception {
 }
 
 @Test
 public void expectWhen() throws Exception {
 }
 структура класса Правим код - Что

Slide 13

Slide 13 text

13 Правим код - Что - Структура класса static String убеждение = коммунизм

Slide 14

Slide 14 text

14 Правим код - Что - Структура класса Пётр Люда Иван name:

Slide 15

Slide 15 text

15 public class TestClass {
 
 private static final String DONT_MATTER = "string";
 
 private static TemporaryFolder classvar = new TemporaryFolder();
 
 private File instancevar;
 // магия java reflection
 @Test
 public void shouldDo() throws Exception {
 }
 
 @Test
 public void expectWhen() throws Exception {
 }
 структура класса Правим код - Что

Slide 16

Slide 16 text

16 public class TestClass {
 
 private static final String DONT_MATTER = "string";
 
 private static TemporaryFolder classvar = new TemporaryFolder();
 
 private File instancevar;
 
 @Test // то что мы не контроллируем
 public void shouldDo() throws Exception { }
 
 @Test
 public void expectWhen() throws Exception {
 }
 структура класса Правим код - Что

Slide 17

Slide 17 text

17 public class TestClass { 
 // модификаторы доступа - это важно
 private static final String DONT_MATTER = "string";
 
 private static TemporaryFolder classvar = new TemporaryFolder();
 
 private File instancevar;
 
 @Test
 public void shouldDo() throws Exception {
 }
 
 @Test
 public void expectWhen() throws Exception {
 }
 структура класса Правим код - Что

Slide 18

Slide 18 text

18 Правим код - Что Поведение и свойства проектируй НЕ fункции

Slide 19

Slide 19 text

public class UserSteps {
 public UserSteps walkTo(String street) {}
 public UserSteps ordersCoffee() {} public UserSteps pays() {} public UserSteps shouldSeeCup() {} } @Test user().walkTo(«Садовая») .ordersCoffee() .pays().shouldSeeCup(); 19 проекта структура Правим код - Что ШАГАМИ В ТЕСТАХ МАНИПУЛИРУЙ

Slide 20

Slide 20 text

20 проекта структура Правим код - Что src /main /java /ru/yandex/…/*.java /resources /test /java … pom.xml

Slide 21

Slide 21 text

21 проекта структура Правим код - Что src /main /java /ru/yandex/…/*.java /resources /test /java … pom.xml

Slide 22

Slide 22 text

22 проекта структура Правим код - Что src /main /java /ru/yandex/…/*.java /resources /test /java … pom.xml src /main /java /ru/yandex/…/*.java /resources /test /java … pom.xml core commons pom.xml

Slide 23

Slide 23 text

23 проекта структура Правим код - Что src /main /java /ru/yandex/…/*.java /resources /test /java … pom.xml src /main /java /ru/yandex/…/*.java /resources /test /java … pom.xml core TESTS pom.xml

Slide 24

Slide 24 text

24 проекта структура Правим код - Что Технология Фича Работа с датой со строкой константы Авторизация Биллинг

Slide 25

Slide 25 text

25 проекта структура Правим код - Что Фича Технология константы даты Авториз-я Биллинг

Slide 26

Slide 26 text

26 Правим код - Как Полезности Рулы Матчеры параметризация

Slide 27

Slide 27 text

private DBResource db = new DBResource(); @ClassRule // Перед всеми/после всех public static TestRule beforeAll = new LogClassStart(); @Rule // Перед каждым/после каждого public ExternalResource prepare = new ExternalResource() { @Override public void before() throws Exception { db.open(); } } 27 Правим код - Как Рулы

Slide 28

Slide 28 text

28 Правим код - Как Рулы bit.ly/junit4-rules

Slide 29

Slide 29 text

29 Правим код - Как Рулы Матчеры параметризация

Slide 30

Slide 30 text

assertThat( lenin, is(locatedIn(location(equalTo(THE_MAUSOLEUM)))) ); 30 Правим код - Как Матчеры

Slide 31

Slide 31 text

31 Правим код - Как Матчеры bit.ly/video-matchers

Slide 32

Slide 32 text

32 Правим код - Как Рулы Матчеры параметризация

Slide 33

Slide 33 text

33 Правим код - Как параметризация @RunWith(DataProviderRunner.class) public class LocalizationPageTest { //. . . @Test @UseDataProvider({«ru», «en», «tr»}) public void shouldLoadPageForLang(String displayLanguage) {
 user().opensPageWithLang(displayLanguage) .shouldSeeLang(displayLanguage); }

Slide 34

Slide 34 text

34 Правим код - Как параметризация bit.ly/tng-params

Slide 35

Slide 35 text

Правим код 35

Slide 36

Slide 36 text

Правим код - Чем 36 IDE - ДРУГ, СЛУГА и ЛОПАТА

Slide 37

Slide 37 text

Правим код - Чем 37 ПО HOTKEY’Ю ВСЕМ КОМАНДАМ

Slide 38

Slide 38 text

Получаем Запускаем . . . - Правим - Сохраняем 38

Slide 39

Slide 39 text

Получаем, запускаем 39 контроль версий

Slide 40

Slide 40 text

Получаем, запускаем 40 контроль версий ~/prj$ git clone ssh://git_server/repo.git repo_dir ~/prj$ cd repo_dir ~/prj/repo_dir$ git checkout -b feature

Slide 41

Slide 41 text

Получаем, запускаем 41 контроль версий try.github.io bit.ly/learn-git-branching

Slide 42

Slide 42 text

Получаем, запускаем 42 Языковые средства

Slide 43

Slide 43 text

43 Управленец Получаем, запускаем

Slide 44

Slide 44 text

44 Получаем, запускаем - управленец Жизненный цикл clean compile test install deploy

Slide 45

Slide 45 text

45 Получаем, запускаем - управленец Жизненный цикл clean compile test install deploy maven-compiler-plugin maven-surefire-plugin maven-deploy-plugin . . .

Slide 46

Slide 46 text

46 Получаем, запускаем - управленец Жизненный цикл MVN TEST

Slide 47

Slide 47 text

47 Получаем, запускаем - управленец

Slide 48

Slide 48 text

48 Управленец Получаем, запускаем

Slide 49

Slide 49 text

49 Управленец Получаем, запускаем

Slide 50

Slide 50 text

Получаем, запускаем - Правим - . . . 50 Сохраняем

Slide 51

Slide 51 text

51 Сохраняем свою работу COMMIT формулируй четко!

Slide 52

Slide 52 text

52 Сохраняем свою работу GITMERGE REBASE

Slide 53

Slide 53 text

53 Сохраняем свою работу CODE REVIEW нужно тебе, товарищ!

Slide 54

Slide 54 text

54 Сохраняем свою работу CI-СЕРВЕР сохранит историю

Slide 55

Slide 55 text

[email protected] Меркушев Кирилл @delnariel lanwen