java осень 2013 лекция 5-1
TRANSCRIPT
![Page 1: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/1.jpg)
Углубленное программирование
на JavaЛекция 5 / 1
«QA и всё такое»
Александр Акбашев
Saturday, October 19, 13
![Page 2: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/2.jpg)
О себе
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](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/3.jpg)
Содержание лекции
3
1. Контроль качества разрабатываемого программного обеспечения
2. Юнит-тесты
3. Функциональные тесты
4. Нагрузочные тесты
5. Профилирование: сервера, памяти, контента
Saturday, October 19, 13
![Page 4: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/4.jpg)
QA
4
Критерии качества разрабатываемого ПО
Оценка качества разрабатываемого ПО
Формальные проверки
Не волнуйтесь, если что-то не работает. Если бы всё работало, вас бы уволили.
Mosher’s Law of Sostware Engineering
Saturday, October 19, 13
![Page 5: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/5.jpg)
Тестирование
5
Черный ящик Белый ящик
ничего не знаем знаем всё
QA/тестировщики разработчики
Saturday, October 19, 13
![Page 6: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/6.jpg)
Unit тесты
Виды тестов
6
Пишут все программисты
Перед коммитом изменения проверяются самим программистом
После коммита изменения проверяются системой CI
Метрика - покрытие кода тестами
Saturday, October 19, 13
![Page 7: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/7.jpg)
Функциональные тесты
Виды тестов
7
Пишутся для ключевых элементов
Проверяют, что сервер запускается и аватар может убить моба программистом
Saturday, October 19, 13
![Page 8: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/8.jpg)
Нагрузочное тестирование
Виды тестов
8
Проверяют, выдерживает ли сервер заявленное число пользователей
Выявление наиболее популярных и наиболее редких багов
Метрика - максимальное число пользователей в один момент времени (CCU)
Saturday, October 19, 13
![Page 9: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/9.jpg)
Лучше написать и выполнить неполные тесты, чем не выполнить полные.
Мартин Фаулер
UnitTest
9
Saturday, October 19, 13
![Page 10: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/10.jpg)
UnitTest
10
Проверка отдельных модулей
Saturday, October 19, 13
![Page 11: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/11.jpg)
UnitTest
11
Безопасный рефакторинг
Saturday, October 19, 13
![Page 12: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/12.jpg)
UnitTest
12
Совместимость модулей
Saturday, October 19, 13
![Page 13: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/13.jpg)
UnitTest
13
Mock-объекты для тестов
Saturday, October 19, 13
![Page 14: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/14.jpg)
UnitTest
13
Mock-объекты для тестов
Saturday, October 19, 13
![Page 15: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/15.jpg)
UnitTest
14
Защита от повторения ошибок
Saturday, October 19, 13
![Page 16: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/16.jpg)
UnitTest
15
Test Driven Development
Saturday, October 19, 13
![Page 17: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/17.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/18.jpg)
Простейший 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](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/19.jpg)
Какие Unit тесты нужны вам?
UnitTest
18
Mock Frontend
Page Generator
Балансировщик
Message System
Saturday, October 19, 13
![Page 20: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/20.jpg)
<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](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/21.jpg)
FunctionalTest
20
Необходимое, но недостаточное условие работоспособности.
Практика
Saturday, October 19, 13
![Page 22: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/22.jpg)
Функциональное тестирование
FunctionalTest
21
Реализует ли требуемый функционал
Поднимается ли сервер?
Можно ли зайти в игру?
Можно ли играть?
Ручное тестирование должно быть более глубоким
Saturday, October 19, 13
![Page 23: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/23.jpg)
Selenium
FunctionalTest
22
Без единой строки кода (plugin Firefox)
Много кода на Java
Быстро
Слабо контролируемо
Несерьезно
Не так быстро
Полный контроль
Путь джедая
Saturday, October 19, 13
![Page 24: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/24.jpg)
Установка 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](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/25.jpg)
Схема работы теста
FunctionalTest
24
Вход на страницу
Заполнение формы
Отправка
Получение IDWin!
Saturday, October 19, 13
![Page 26: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/26.jpg)
Реализация тестирования аутентификации
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](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/27.jpg)
Домашнее задание
FunctionalTest
26
завести тест с помощью Selenium
3 unit теста на каждый разработанный модуль
Saturday, October 19, 13
![Page 28: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/28.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/29.jpg)
LoadTest
28
Моделирование
Saturday, October 19, 13
![Page 30: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/30.jpg)
Ожидаемое использование
LoadTest
29
Saturday, October 19, 13
![Page 31: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/31.jpg)
LoadTest
30
Нескольких пользователей
Saturday, October 19, 13
![Page 32: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/32.jpg)
LoadTest
31
Одновременно
Saturday, October 19, 13
![Page 33: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/33.jpg)
Как происходит?
LoadTest
32
Формируется список активностей гейммеханики
Формируются параметры игрового дизайна
Реализуется бот
Проводится испытание
Анализируются результаты
Saturday, October 19, 13
![Page 34: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/34.jpg)
Список активностей гейммеханики
LoadTest
33
Танк должен ехать вправо/влево/вниз/вверх
Танк должен стрелять
Танк должен умирать
Saturday, October 19, 13
![Page 35: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/35.jpg)
Параметры игрового дизайна
LoadTest
34
Танк должен ехать 4 секунды из 5
Танк должен стрелять раз в 5 секунд
Танк должен умирать раз в 10 секунд
Танк НЕ обязан делать это осознанно
Saturday, October 19, 13
![Page 36: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/36.jpg)
Проводится испытание
LoadTest
35
Час
Два
8 часов
Сутки
Неделю
?
Saturday, October 19, 13
![Page 37: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/37.jpg)
Рекомендуемые инструменты
LoadTest
36
jMeter
LoadBalancer
Yandex-tanki
Saturday, October 19, 13
![Page 38: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/38.jpg)
Анализируются результаты
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](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/39.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/40.jpg)
Server FPS
LoadTest
39
Инициализация
Обработка данных
Обновление состояния
Освобождение ресурсов
Входные данные
Выходные данные
Тик сервера
Saturday, October 19, 13
![Page 41: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/41.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/42.jpg)
Многопоточность
LoadTest
41
Не спать вредно
Много спать тоже вредно
Чем больше нагрузка на CPU, тем лучше
Saturday, October 19, 13
![Page 43: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/43.jpg)
Нагрузка на процессор
LoadTest
42
Saturday, October 19, 13
![Page 44: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/44.jpg)
Нагрузка на процессор
LoadTest
43
Saturday, October 19, 13
![Page 45: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/45.jpg)
Память
LoadTest
44
long free = Runtime.getRuntime().freeMemory();long max = Runtime.getRuntime().maxMemory();
Saturday, October 19, 13
![Page 46: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/46.jpg)
Углубленное программирование
на JavaЛекция 5 / 2
«Вся правда о GC»
Александр Акбашев
Saturday, October 19, 13
![Page 47: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/47.jpg)
Garbage Collector
46
Если бы в Java действительно работала сборка мусора, большинство программ бы удаляли сами себя при первом
же запуске.Robert Sewell
Saturday, October 19, 13
![Page 48: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/48.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/49.jpg)
Strong ReferencesОбъект не удаляется
Garbage Collector
48
Saturday, October 19, 13
![Page 50: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/50.jpg)
Sost References
Объект удаляется...если нужна памятьУчитывает количество ссылок
Используется для memory-sensitive cache
new SostReference(T obj);
Garbage Collector
49
Saturday, October 19, 13
![Page 51: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/51.jpg)
Weak References
Атомарно очищает все слабые ссылки на объект
Если надо, помещает объекты на финализацию
Перед использовать - проверять на NULL
WeakHashMap
new WeakReference(T obj);
Garbage Collector
50
Объект удаляется
Saturday, October 19, 13
![Page 52: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/52.jpg)
Phantom References
Не использовать в домашних условиях
Garbage Collector
51
Saturday, October 19, 13
![Page 53: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/53.jpg)
Немного о потреблении памяти
Garbage Collector
52
Saturday, October 19, 13
![Page 54: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/54.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/55.jpg)
Garbage Collector
54
Eden Survivor
Copy Collection
Mark-compact algorithm
Saturday, October 19, 13
![Page 56: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/56.jpg)
Garbage Collector
55
Saturday, October 19, 13
![Page 57: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/57.jpg)
Что делать? Как настраивать?
Garbage Collector
56
jvisualvm входит в JDK
Saturday, October 19, 13
![Page 58: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/58.jpg)
Домашнее задание
Итого
57
MemoryUsage
CCU
Load
http://www.highcharts.com/
http://www.oracle.com/
Saturday, October 19, 13
![Page 60: Java осень 2013 лекция 5-1](https://reader033.vdocuments.pub/reader033/viewer/2022042607/55935d241a28ab54648b4644/html5/thumbnails/60.jpg)
1. Refactor -> Extract -> Interface
2. Public methods
getAddress
doGet
doPost
run
3. @Mock
Простейший Mock для Frontend
UnitTest
59
Saturday, October 19, 13