Slide 1

Slide 1 text

Kotlintest и все-все-все Паша Финкельштейн, Jetbrains

Slide 2

Slide 2 text

Twitter @asm0di0 @snowone_conf @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 2

Slide 3

Slide 3 text

Кто я Разработчик Люблю тестировать Люблю изучать новое Люблю Kotlin @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 3

Slide 4

Slide 4 text

О чём это Для тестирования используется множество инструментов В джаве богатая экосистема И «проверенные годами» инструменты @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 4

Slide 5

Slide 5 text

Что дал миру JVM Kotlin DSL Extension methods Функции — first-class citizens @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 5

Slide 6

Slide 6 text

И множество новых библиотек! @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 6

Slide 7

Slide 7 text

Но зачем? @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 7

Slide 8

Slide 8 text

Структура Сейчас как-то так: class MyVeryImportantTest { @Test void feature_should_work_somehow(){ /*snip*/ } @Test void feature_should_work_somehow2(){ /*snip*/ } @Test void feature_should_work_somehow3(){ /*snip*/ } } @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 8

Slide 9

Slide 9 text

Добро пожаловать в плоский мир @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 9

Slide 10

Slide 10 text

А хочется прекрасного passwordService { shouldHash { length { /* snip */ } salt { /* snip */ } } shouldCheck { validPasswords() invalidPasswords() } } @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 10

Slide 11

Slide 11 text

Parametrized tests TestNG @DataProvider(name = "test1") public static Object[][] primeNumbers() { return new Object[][] { {2, true}, {6, false}, {19, true}, {22, false}, {23, true}}; } @Test(dataProvider = "test1") void testPrimeNumberChecker(Integer inputNumber, Boolean expectedResult){ /* snip */} @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 11

Slide 12

Slide 12 text

Parametrized tests JUnit 5 static Stream stringIntAndListProvider() { return Stream.of( arguments("apple", 1, Arrays.asList("a", "b")), arguments("lemon", 2, Arrays.asList("x", "y")) ); } @ParameterizedTest @MethodSource("stringIntAndListProvider") void testWithMultiArgMethodSource(String str, int num, List list) {/* snip */} @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 12

Slide 13

Slide 13 text

Всё ещё шумновато Аннотации Arrays.asList (в новой джаве лучше) Строки, в которых можно ошибиться Отдельные методы @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 13

Slide 14

Slide 14 text

Тесты должны читаться легко @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 14

Slide 15

Slide 15 text

Сага о безопасности 15

Slide 16

Slide 16 text

Безопасность на лесопилке Надо хранить пароли. Но как? Plain MD5(plain) MD5(plain+salt) MD5(md5(plain)+salt) Быстро! 200 GH/s @ 8x Nvidia GTX 1080 Founders Edition with Hashcat @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 16

Slide 17

Slide 17 text

И что делать? Плакать Или использовать bcrypt/scrypt Хэш начинается с магического $2a$10 $2a — версия bcrypt $10 — количество раундов «соления» Они очень медленные (100/1000 в секунду) @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 17

Slide 18

Slide 18 text

Kotlintest It's demo time! @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 18

Slide 19

Slide 19 text

Но есть и проблемы Property-based тесты не имеют уникального идентификатора (но в пути) В jqwik сделано лучше В репортах логгируется только последняя текстовая часть теста В IDEA поддержка так себе: тесты нельзя запускать по одному @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 19

Slide 20

Slide 20 text

Что надо запомнить Kotlintest решает для нас проблемы Структурирования Параметризованных тестов Property-based тестирования @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 20

Slide 21

Slide 21 text

Спасибо! Вопросы? asm0di0 @ Twitter asm0dey @ Telegram it.asm0dey.ru @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 21