Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kotlintest и все-все-все. Что Kotlin принёс в м...

Michael Storozhilov
February 29, 2020
380

Kotlintest и все-все-все. Что Kotlin принёс в мир тестирования

Пишете на Kotlin, но всё ещё используете Java-инфраструктуру для тестирования? А ведь вместе с экосистемой Kotlin растёт и количество инструментов для тестирования на нём.

Поговорим о том, как Kotlin может облегчить жизнь разработчику тестов независимо от того, кто он: разработчик, QA или кто-то ещё, сравним с популярными фреймворками тестирования, а так же немного заглянем под капот и посмотрим, как он устроен.

Michael Storozhilov

February 29, 2020
Tweet

More Decks by Michael Storozhilov

Transcript

  1. О чём это Для тестирования используется множество инструментов В джаве

    богатая экосистема И «проверенные годами» инструменты @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 4
  2. Что дал миру JVM Kotlin DSL Extension methods Функции —

    first-class citizens @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 5
  3. Структура Сейчас как-то так: 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
  4. А хочется прекрасного passwordService { shouldHash { length { /*

    snip */ } salt { /* snip */ } } shouldCheck { validPasswords() invalidPasswords() } } @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 10
  5. 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
  6. Parametrized tests JUnit 5 static Stream<Arguments> 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<String> list) {/* snip */} @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 12
  7. Всё ещё шумновато Аннотации Arrays.asList (в новой джаве лучше) Строки,

    в которых можно ошибиться Отдельные методы @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 13
  8. Безопасность на лесопилке Надо хранить пароли. Но как? 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
  9. И что делать? Плакать Или использовать bcrypt/scrypt Хэш начинается с

    магического $2a$10 $2a — версия bcrypt $10 — количество раундов «соления» Они очень медленные (100/1000 в секунду) @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 17
  10. Но есть и проблемы Property-based тесты не имеют уникального идентификатора

    (но в пути) В jqwik сделано лучше В репортах логгируется только последняя текстовая часть теста В IDEA поддержка так себе: тесты нельзя запускать по одному @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 19
  11. Что надо запомнить Kotlintest решает для нас проблемы Структурирования Параметризованных

    тестов Property-based тестирования @asm0di0 at Twitter @asm0dey at Telegram @snowone_conf 20