Upload
technopark
View
146
Download
1
Embed Size (px)
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
1. Refactor -> Extract -> Interface
2. Public methods
getAddress
doGet
doPost
run
3. @Mock
Простейший Mock для Frontend
UnitTest
59
Saturday, October 19, 13