2. О себе
Образование:
2005-2011 МГТУ им. Баумана - магистр
2011- ? МГТУ им.Баумана - аспирант
2011 - 2013 Open University Skolkovo
Ключевой поворот:
2011 - Mail.Ru Games (Allods Team)
Senior QA Engineer, команда сервера Skyforge
2
Saturday, October 19, 13
3. Содержание лекции
1. Контроль качества разрабатываемого
программного обеспечения
2. Юнит-тесты
3. Функциональные тесты
4. Нагрузочные тесты
5. Профилирование: сервера, памяти, контента
3
Saturday, October 19, 13
4. QA
Не волнуйтесь, если что-то не работает. Если бы всё работало, вас бы уволили.
Mosher’s Law of Soſtware Engineering
Критерии качества разрабатываемого ПО
Оценка качества разрабатываемого ПО
Формальные проверки
4
Saturday, October 19, 13
6. Виды тестов
Unit тесты
Пишут все программисты
Перед коммитом изменения проверяются
самим программистом
После коммита изменения проверяются системой CI
Метрика - покрытие кода тестами
6
Saturday, October 19, 13
7. Виды тестов
Функциональные тесты
Пишутся для ключевых элементов
Проверяют, что сервер запускается
и аватар может
убить моба программистом
7
Saturday, October 19, 13
8. Виды тестов
Нагрузочное тестирование
Проверяют, выдерживает ли сервер заявленное число пользователей
Выявление наиболее популярных и наиболее редких багов
Метрика - максимальное число пользователей в один момент времени (CCU)
8
Saturday, October 19, 13
9. UnitTest
Лучше написать и выполнить неполные тесты,
чем не выполнить полные.
Мартин Фаулер
9
Saturday, October 19, 13
17. UnitTest
Hello, world!
Среда тестирования: 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");
}
16
Saturday, October 19, 13
18. UnitTest
Простейший Unit тест
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());
}
17
Saturday, October 19, 13
19. UnitTest
Какие Unit тесты нужны вам?
Mock Frontend
Page Generator
Балансировщик
Message System
18
Saturday, October 19, 13
23. FunctionalTest
Selenium
Без единой строки кода
(plugin Firefox)
Много кода на Java
Быстро
Не так быстро
Слабо контролируемо
Полный контроль
Несерьезно
Путь джедая
22
Saturday, October 19, 13
26. FunctionalTest
Реализация тестирования аутентификации
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();
}
25
Saturday, October 19, 13
28. LoadTest
[robic]: привет, нужно просетапить сервер чтоб держал нагрузку
[robic]: нужен mysql и apache
[ad_minic]: какая нагрузка?
[robic]: большая
[ad_minic]: круто
[ad_minic]: тогда ставь большой апач и большой мускуль на большой сервер
bash.org
27
Saturday, October 19, 13
33. LoadTest
Как происходит?
Формируется список активностей гейммеханики
Формируются параметры игрового дизайна
Реализуется бот
Проводится испытание
Анализируются результаты
32
Saturday, October 19, 13
35. LoadTest
Параметры игрового дизайна
Танк должен ехать 4 секунды из 5
Танк должен стрелять раз в 5 секунд
Танк должен умирать раз в 10 секунд
Танк НЕ обязан делать это осознанно
34
Saturday, October 19, 13
38. LoadTest
Анализируются результаты
lo
Бы от ad
ко
ва
1. Потребление CPU, %
Hi
gh
2. Диск (iowait)
3. Сеть, Mb/s
4. Время отклика, ms
Text
5. CCU, users
6. Load, parrots
7. Использование памяти, МБ
37
Saturday, October 19, 13
39. LoadTest
CCU, users
private Map<Integer, Avatar> avatars = new HashMap<>();
public final int getTotalAvatars() {
return avatars.size();
}
38
Saturday, October 19, 13
47. Garbage Collector
Если бы в Java действительно работала сборка мусора,
большинство программ бы удаляли сами себя при первом
же запуске.
Robert Sewell
46
Saturday, October 19, 13
48. Garbage Collector
Garbage collector (GC)
Поиск недостежимых объектов
Освобождение памяти
Stack
Heap
Типы ссылок
Strong references
Weak references
Soſt references
Phantom references
47
Saturday, October 19, 13
50. Garbage Collector
Soſt References
Объект удаляется...если нужна память
Учитывает количество ссылок
Используется для memory-sensitive cache
new SoſtReference(T obj);
49
Saturday, October 19, 13
51. Garbage Collector
Weak References
Объект удаляется
Атомарно очищает все слабые ссылки на объект
Если надо, помещает объекты на финализацию
Перед использовать - проверять на NULL
WeakHashMap
new WeakReference(T obj);
50
Saturday, October 19, 13
54. Garbage Collector
HotSpot JVM
Permanent Generation
Heap
New Generation
Eden
Survivor
Old Generation
Survivor
t
-XX:PermSize
-XX:MaxPermSize
-Xms
-Xmx
53
Saturday, October 19, 13