60
Углубленное программирование на Java Лекция 5 / 1 «QA и всё такое» Александр Акбашев Saturday, October 19, 13

Java осень 2013 лекция 5-1

Embed Size (px)

Citation preview

Page 1: Java осень 2013 лекция 5-1

Углубленное программирование

на JavaЛекция 5 / 1

«QA и всё такое»

Александр Акбашев

Saturday, October 19, 13

Page 2: Java осень 2013 лекция 5-1

О себе

2

2005-2011 МГТУ им. Баумана - магистр

2011- ? МГТУ им.Баумана - аспирант

2011 - 2013 Open University Skolkovo

Образование:

2011 - Mail.Ru Games (Allods Team)Ключевой поворот:

Senior QA Engineer, команда сервера Skyforge

Saturday, October 19, 13

Page 3: Java осень 2013 лекция 5-1

Содержание лекции

3

1. Контроль качества разрабатываемого программного обеспечения

2. Юнит-тесты

3. Функциональные тесты

4. Нагрузочные тесты

5. Профилирование: сервера, памяти, контента

Saturday, October 19, 13

Page 4: Java осень 2013 лекция 5-1

QA

4

Критерии качества разрабатываемого ПО

Оценка качества разрабатываемого ПО

Формальные проверки

Не волнуйтесь, если что-то не работает. Если бы всё работало, вас бы уволили.

Mosher’s Law of Sostware Engineering

Saturday, October 19, 13

Page 5: Java осень 2013 лекция 5-1

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

5

Черный ящик Белый ящик

ничего не знаем знаем всё

QA/тестировщики разработчики

Saturday, October 19, 13

Page 6: Java осень 2013 лекция 5-1

Unit тесты

Виды тестов

6

Пишут все программисты

Перед коммитом изменения проверяются самим программистом

После коммита изменения проверяются системой CI

Метрика - покрытие кода тестами

Saturday, October 19, 13

Page 7: Java осень 2013 лекция 5-1

Функциональные тесты

Виды тестов

7

Пишутся для ключевых элементов

Проверяют, что сервер запускается и аватар может убить моба программистом

Saturday, October 19, 13

Page 8: Java осень 2013 лекция 5-1

Нагрузочное тестирование

Виды тестов

8

Проверяют, выдерживает ли сервер заявленное число пользователей

Выявление наиболее популярных и наиболее редких багов

Метрика - максимальное число пользователей в один момент времени (CCU)

Saturday, October 19, 13

Page 9: Java осень 2013 лекция 5-1

Лучше написать и выполнить неполные тесты, чем не выполнить полные.

Мартин Фаулер

UnitTest

9

Saturday, October 19, 13

Page 10: Java осень 2013 лекция 5-1

UnitTest

10

Проверка отдельных модулей

Saturday, October 19, 13

Page 11: Java осень 2013 лекция 5-1

UnitTest

11

Безопасный рефакторинг

Saturday, October 19, 13

Page 12: Java осень 2013 лекция 5-1

UnitTest

12

Совместимость модулей

Saturday, October 19, 13

Page 13: Java осень 2013 лекция 5-1

UnitTest

13

Mock-объекты для тестов

Saturday, October 19, 13

Page 14: Java осень 2013 лекция 5-1

UnitTest

13

Mock-объекты для тестов

Saturday, October 19, 13

Page 15: Java осень 2013 лекция 5-1

UnitTest

14

Защита от повторения ошибок

Saturday, October 19, 13

Page 16: Java осень 2013 лекция 5-1

UnitTest

15

Test Driven Development

Saturday, October 19, 13

Page 17: Java осень 2013 лекция 5-1

Hello, world!

UnitTest

16

Среда тестирования: JUnitВ IDEA: Navigate -> Test

public class simpleTest { @Before public void setUp() throws Exception { }

@After public void tearDown() throws Exception { }

@Test public void test() { fail("Not yet implemented"); }}

Saturday, October 19, 13

Page 18: Java осень 2013 лекция 5-1

Простейший Unit тест

UnitTest

17

public class Math { private int a; private int b;

public Math (int a, int b) { this.a = a; this.b = b; }

public int getSum() { return this.a + this.b; }

public int getDiv() { return this.a % this.b; }}

public class simpleTest { private Math math; private int a = 3; private int b = 1; @Before public void setUp() throws Exception { math = new Math(a, b); } @Test public void testGood() { assertEqual(a+b, math.getSum()); } @Test public void testBad() { assertEqual(a/b, math.getDiv()); }

Saturday, October 19, 13

Page 19: Java осень 2013 лекция 5-1

Какие Unit тесты нужны вам?

UnitTest

18

Mock Frontend

Page Generator

Балансировщик

Message System

Saturday, October 19, 13

Page 20: Java осень 2013 лекция 5-1

<dependency>

<groupId>org.mockito</groupId>

<artifactId>mockito-all</artifactId>

<version>1.8.4</version>

</dependency>

Устанавливаем Mockito

UnitTest

19

Saturday, October 19, 13

Page 21: Java осень 2013 лекция 5-1

FunctionalTest

20

Необходимое, но недостаточное условие работоспособности.

Практика

Saturday, October 19, 13

Page 22: Java осень 2013 лекция 5-1

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

FunctionalTest

21

Реализует ли требуемый функционал

Поднимается ли сервер?

Можно ли зайти в игру?

Можно ли играть?

Ручное тестирование должно быть более глубоким

Saturday, October 19, 13

Page 23: Java осень 2013 лекция 5-1

Selenium

FunctionalTest

22

Без единой строки кода (plugin Firefox)

Много кода на Java

Быстро

Слабо контролируемо

Несерьезно

Не так быстро

Полный контроль

Путь джедая

Saturday, October 19, 13

Page 24: Java осень 2013 лекция 5-1

Установка Selenium

FunctionalTest

23

<dependency>

<groupId>org.seleniumhq.selenium</groupId>

<artifactId>selenium-java</artifactId>

<version>2.4.0</version>

</dependency>

Saturday, October 19, 13

Page 25: Java осень 2013 лекция 5-1

Схема работы теста

FunctionalTest

24

Вход на страницу

Заполнение формы

Отправка

Получение IDWin!

Saturday, October 19, 13

Page 26: Java осень 2013 лекция 5-1

Реализация тестирования аутентификации

FunctionalTest

25

public void testLogin(@NotNull String url,@NotNull String username,@NotNull String password) {

}

WebDriver driver = new HtmlUnitDriver(true); driver.get(url); // Find the text input element by its name WebElement element = driver.findElement(By.name(“userName")); element.sendKeys(username); WebElement element = driver.findElement(By.name(“password")); element.sendKeys(password);

// Now submit the form. WebDriver will find the form for us from the element element.submit();

// Wait for the page to load, timeout after 10 seconds (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() { @Override @NotNull public Boolean apply(@NotNull WebDriver d) { final int id = d.findElement(By.name(“id”)); return id != 0; } }); driver.quit();

Saturday, October 19, 13

Page 27: Java осень 2013 лекция 5-1

Домашнее задание

FunctionalTest

26

завести тест с помощью Selenium

3 unit теста на каждый разработанный модуль

Saturday, October 19, 13

Page 28: Java осень 2013 лекция 5-1

LoadTest

27

[robic]: привет, нужно просетапить сервер чтоб держал нагрузку

[robic]: нужен mysql и apache

[ad_minic]: какая нагрузка?

[robic]: большая

[ad_minic]: круто

[ad_minic]: тогда ставь большой апач и большой мускуль на большой сервер

bash.org

Saturday, October 19, 13

Page 29: Java осень 2013 лекция 5-1

LoadTest

28

Моделирование

Saturday, October 19, 13

Page 30: Java осень 2013 лекция 5-1

Ожидаемое использование

LoadTest

29

Saturday, October 19, 13

Page 31: Java осень 2013 лекция 5-1

LoadTest

30

Нескольких пользователей

Saturday, October 19, 13

Page 32: Java осень 2013 лекция 5-1

LoadTest

31

Одновременно

Saturday, October 19, 13

Page 33: Java осень 2013 лекция 5-1

Как происходит?

LoadTest

32

Формируется список активностей гейммеханики

Формируются параметры игрового дизайна

Реализуется бот

Проводится испытание

Анализируются результаты

Saturday, October 19, 13

Page 34: Java осень 2013 лекция 5-1

Список активностей гейммеханики

LoadTest

33

Танк должен ехать вправо/влево/вниз/вверх

Танк должен стрелять

Танк должен умирать

Saturday, October 19, 13

Page 35: Java осень 2013 лекция 5-1

Параметры игрового дизайна

LoadTest

34

Танк должен ехать 4 секунды из 5

Танк должен стрелять раз в 5 секунд

Танк должен умирать раз в 10 секунд

Танк НЕ обязан делать это осознанно

Saturday, October 19, 13

Page 36: Java осень 2013 лекция 5-1

Проводится испытание

LoadTest

35

Час

Два

8 часов

Сутки

Неделю

?

Saturday, October 19, 13

Page 37: Java осень 2013 лекция 5-1

Рекомендуемые инструменты

LoadTest

36

jMeter

LoadBalancer

Yandex-tanki

Saturday, October 19, 13

Page 38: Java осень 2013 лекция 5-1

Анализируются результаты

LoadTest

37

1. Потребление CPU, %

2. Диск (iowait)

3. Сеть, Mb/s

4. Время отклика, ms

5. CCU, users

6. Load, parrots

7. Использование памяти, МБ

TextHi

ghload

от

Быкова

Saturday, October 19, 13

Page 39: Java осень 2013 лекция 5-1

CCU, users

LoadTest

38

private Map<Integer, Avatar> avatars = new HashMap<>();

public final int getTotalAvatars() { return avatars.size();}

Saturday, October 19, 13

Page 40: Java осень 2013 лекция 5-1

Server FPS

LoadTest

39

Инициализация

Обработка данных

Обновление состояния

Освобождение ресурсов

Входные данные

Выходные данные

Тик сервера

Saturday, October 19, 13

Page 41: Java осень 2013 лекция 5-1

Load [parrots]

LoadTest

40

public void run () { while(true) { msgSystem.execForAbonent(this); Thread.sleep(100); // фиксированное время ожидания потока }}

private static final int TICK_TIME = 20; public void run () { while(true) { long startTime = System.currentTimeMillis(); msgSystem.execForAbonent(this); int deltaTime = System.currentTimeMillis() - startTime; float load = deltaTime / TICK_TIME; if (load < 1) // динамическое время ожидания потока Thread.sleep( TICK_TIME - deltaTime ); }}

Saturday, October 19, 13

Page 42: Java осень 2013 лекция 5-1

Многопоточность

LoadTest

41

Не спать вредно

Много спать тоже вредно

Чем больше нагрузка на CPU, тем лучше

Saturday, October 19, 13

Page 43: Java осень 2013 лекция 5-1

Нагрузка на процессор

LoadTest

42

Saturday, October 19, 13

Page 44: Java осень 2013 лекция 5-1

Нагрузка на процессор

LoadTest

43

Saturday, October 19, 13

Page 45: Java осень 2013 лекция 5-1

Память

LoadTest

44

long free = Runtime.getRuntime().freeMemory();long max = Runtime.getRuntime().maxMemory();

Saturday, October 19, 13

Page 46: Java осень 2013 лекция 5-1

Углубленное программирование

на JavaЛекция 5 / 2

«Вся правда о GC»

Александр Акбашев

Saturday, October 19, 13

Page 47: Java осень 2013 лекция 5-1

Garbage Collector

46

Если бы в Java действительно работала сборка мусора, большинство программ бы удаляли сами себя при первом

же запуске.Robert Sewell

Saturday, October 19, 13

Page 48: Java осень 2013 лекция 5-1

Garbage Collector

47

Garbage collector (GC)

Типы ссылок

Поиск недостежимых объектов

Освобождение памяти Stack Heap

Strong references

Weak references

Sost references

Phantom references

Saturday, October 19, 13

Page 49: Java осень 2013 лекция 5-1

Strong ReferencesОбъект не удаляется

Garbage Collector

48

Saturday, October 19, 13

Page 50: Java осень 2013 лекция 5-1

Sost References

Объект удаляется...если нужна памятьУчитывает количество ссылок

Используется для memory-sensitive cache

new SostReference(T obj);

Garbage Collector

49

Saturday, October 19, 13

Page 51: Java осень 2013 лекция 5-1

Weak References

Атомарно очищает все слабые ссылки на объект

Если надо, помещает объекты на финализацию

Перед использовать - проверять на NULL

WeakHashMap

new WeakReference(T obj);

Garbage Collector

50

Объект удаляется

Saturday, October 19, 13

Page 52: Java осень 2013 лекция 5-1

Phantom References

Не использовать в домашних условиях

Garbage Collector

51

Saturday, October 19, 13

Page 53: Java осень 2013 лекция 5-1

Немного о потреблении памяти

Garbage Collector

52

Saturday, October 19, 13

Page 54: Java осень 2013 лекция 5-1

Garbage Collector

53

 Permanent Generation

Heap 

HotSpot JVM

-XX:PermSize -XX:MaxPermSize

Old Generation New Generation

Eden  Survivor  Survivor

-Xms -Xmx

t

Saturday, October 19, 13

Page 55: Java осень 2013 лекция 5-1

Garbage Collector

54

Eden  Survivor

Copy Collection

Mark-compact algorithm

Saturday, October 19, 13

Page 56: Java осень 2013 лекция 5-1

Garbage Collector

55

Saturday, October 19, 13

Page 57: Java осень 2013 лекция 5-1

Что делать? Как настраивать?

Garbage Collector

56

jvisualvm входит в JDK

Saturday, October 19, 13

Page 58: Java осень 2013 лекция 5-1

Домашнее задание

Итого

57

MemoryUsage

CCU

Load

http://www.highcharts.com/

http://www.oracle.com/

Saturday, October 19, 13

Page 59: Java осень 2013 лекция 5-1

Спасибо за внимание

Акбашев Александр, [email protected]

Saturday, October 19, 13

Page 60: Java осень 2013 лекция 5-1

1. Refactor -> Extract -> Interface

2. Public methods

getAddress

doGet

doPost

run

3. @Mock

Простейший Mock для Frontend

UnitTest

59

Saturday, October 19, 13