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

Preview:

Citation preview

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

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

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

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

Saturday, October 19, 13

О себе

2

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

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

2011 - 2013 Open University Skolkovo

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

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

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

Saturday, October 19, 13

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

3

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

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

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

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

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

Saturday, October 19, 13

QA

4

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

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

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

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

Mosher’s Law of Sostware Engineering

Saturday, October 19, 13

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

5

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

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

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

Saturday, October 19, 13

Unit тесты

Виды тестов

6

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

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

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

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

Saturday, October 19, 13

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

Виды тестов

7

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

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

Saturday, October 19, 13

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

Виды тестов

8

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

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

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

Saturday, October 19, 13

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

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

UnitTest

9

Saturday, October 19, 13

UnitTest

10

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

Saturday, October 19, 13

UnitTest

11

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

Saturday, October 19, 13

UnitTest

12

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

Saturday, October 19, 13

UnitTest

13

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

Saturday, October 19, 13

UnitTest

13

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

Saturday, October 19, 13

UnitTest

14

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

Saturday, October 19, 13

UnitTest

15

Test Driven Development

Saturday, October 19, 13

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

Простейший 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

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

UnitTest

18

Mock Frontend

Page Generator

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

Message System

Saturday, October 19, 13

<dependency>

<groupId>org.mockito</groupId>

<artifactId>mockito-all</artifactId>

<version>1.8.4</version>

</dependency>

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

UnitTest

19

Saturday, October 19, 13

FunctionalTest

20

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

Практика

Saturday, October 19, 13

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

FunctionalTest

21

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

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

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

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

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

Saturday, October 19, 13

Selenium

FunctionalTest

22

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

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

Быстро

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

Несерьезно

Не так быстро

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

Путь джедая

Saturday, October 19, 13

Установка Selenium

FunctionalTest

23

<dependency>

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

<artifactId>selenium-java</artifactId>

<version>2.4.0</version>

</dependency>

Saturday, October 19, 13

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

FunctionalTest

24

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

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

Отправка

Получение IDWin!

Saturday, October 19, 13

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

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

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

FunctionalTest

26

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

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

Saturday, October 19, 13

LoadTest

27

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

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

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

[robic]: большая

[ad_minic]: круто

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

bash.org

Saturday, October 19, 13

LoadTest

28

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

Saturday, October 19, 13

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

LoadTest

29

Saturday, October 19, 13

LoadTest

30

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

Saturday, October 19, 13

LoadTest

31

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

Saturday, October 19, 13

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

LoadTest

32

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

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

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

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

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

Saturday, October 19, 13

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

LoadTest

33

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

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

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

Saturday, October 19, 13

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

LoadTest

34

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

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

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

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

Saturday, October 19, 13

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

LoadTest

35

Час

Два

8 часов

Сутки

Неделю

?

Saturday, October 19, 13

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

LoadTest

36

jMeter

LoadBalancer

Yandex-tanki

Saturday, October 19, 13

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

LoadTest

37

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

2. Диск (iowait)

3. Сеть, Mb/s

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

5. CCU, users

6. Load, parrots

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

TextHi

ghload

от

Быкова

Saturday, October 19, 13

CCU, users

LoadTest

38

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

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

Saturday, October 19, 13

Server FPS

LoadTest

39

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

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

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

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

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

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

Тик сервера

Saturday, October 19, 13

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

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

LoadTest

41

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

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

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

Saturday, October 19, 13

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

LoadTest

42

Saturday, October 19, 13

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

LoadTest

43

Saturday, October 19, 13

Память

LoadTest

44

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

Saturday, October 19, 13

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

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

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

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

Saturday, October 19, 13

Garbage Collector

46

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

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

Saturday, October 19, 13

Garbage Collector

47

Garbage collector (GC)

Типы ссылок

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

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

Strong references

Weak references

Sost references

Phantom references

Saturday, October 19, 13

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

Garbage Collector

48

Saturday, October 19, 13

Sost References

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

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

new SostReference(T obj);

Garbage Collector

49

Saturday, October 19, 13

Weak References

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

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

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

WeakHashMap

new WeakReference(T obj);

Garbage Collector

50

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

Saturday, October 19, 13

Phantom References

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

Garbage Collector

51

Saturday, October 19, 13

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

Garbage Collector

52

Saturday, October 19, 13

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

Garbage Collector

54

Eden  Survivor

Copy Collection

Mark-compact algorithm

Saturday, October 19, 13

Garbage Collector

55

Saturday, October 19, 13

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

Garbage Collector

56

jvisualvm входит в JDK

Saturday, October 19, 13

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

Итого

57

MemoryUsage

CCU

Load

http://www.highcharts.com/

http://www.oracle.com/

Saturday, October 19, 13

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

Акбашев Александр, a.akbashev@corp.mail.ru

Saturday, October 19, 13

1. Refactor -> Extract -> Interface

2. Public methods

getAddress

doGet

doPost

run

3. @Mock

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

UnitTest

59

Saturday, October 19, 13