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

[RU] Codegeneration in Java as way to solve aut...

[RU] Codegeneration in Java as way to solve autotest problems

It was presented on Heisenbug 2017 (June) in Saint-Petersburg

Merkushev Kirill

June 04, 2017
Tweet

More Decks by Merkushev Kirill

Other Decks in Programming

Transcript

  1. 10 5 причин попробовать 2 способа сделать больше Откуда дети

    исходники Процессор аннотаций Мавен плагин
  2. 13 $ cloc 50459 (600 files) Яндекс Паспорт (500+ эндпоинтов,

    400 объектов) 20730 (220 files) До После Java
  3. 27 По матчеру assertThat( someOwner, both(withEmail(containsString(«@»))) .and(withUid(is(uid)) ); в каждую

    семью для email для uid java.lang.AssertionError: Expected: email a string containing «@» but: email was null полная свобода
  4. 28

  5. 29

  6. 33 #%RAML 0.8 title: Tickets baseUri: https://api.example.com /ticket: /{uuid}: get:

    displayName: fetch ApiTickets.tickets(ticketsConfig()) .ticket() .uuid().withUuid("1") .fetch(identity()).prettyPeek();
  7. 34 #%RAML 0.8 title: Tickets baseUri: https://api.example.com /ticket: /{uuid}: get:

    displayName: fetch ApiTickets.tickets(ticketsConfig()) .ticket() .uuid().withUuid("1") .fetch(identity()).prettyPeek();
  8. 35 #%RAML 0.8 title: Tickets baseUri: https://api.example.com /ticket: /{uuid}: get:

    displayName: fetch ApiTickets.tickets(ticketsConfig()) .ticket() .uuid().withUuid("1") .fetch(identity()).prettyPeek();
  9. 36 #%RAML 0.8 title: Tickets baseUri: https://api.example.com /ticket: /{uuid}: get:

    displayName: fetch ApiTickets.tickets(ticketsConfig()) .ticket() .uuid().withUuid("1") .fetch(identity()).prettyPeek();
  10. 42 Почему не kotlin/ groovy/scala/go … ? Нельзя! Уже есть

    схема Кодогенерация - не только про бины
  11. 43 Почему не kotlin/ groovy/scala/go … ? Нельзя! Уже есть

    схема Кодогенерация - не только про бины lanwen/heisenbug17
  12. 57 Тестовые методы списком констант public final class TestMethodConsts {

    psf String TEST_METHOD_shouldCreate = "ru.lanwen.heisenbug.EticketResourceTest#shouldCreate"; } КОНСТАНТА = "полный.референс#метода"
  13. 62 public final class TestMethodConsts { public static final String

    TEST_METHOD_shouldCreate = "ru.lanwen.heisenbug.ETest#shouldCreate"; }
  14. 78 public final class Project { public static final String

    VERSION = "1.0.0"; } Версия проекта константой
  15. 81 Maven plugin @Mojo( name = "generate-client", defaultPhase = LifecyclePhase.GENERATE_SOURCES

    ) @Execute(goal = "generate-client") public class RestClientGenerateMojo extends AbstractMojo { } bit.ly/mvn-plugin-dev
  16. 82 @Parameter( required = true, readonly = true, defaultValue =

    "${project}" ) private MavenProject project; Знания мавена Maven plugin bit.ly/mvn-plugin-dev
  17. 83 . . . private MavenProject project; @Override public void

    execute() { new Codegen().generate(); project.addCompileSourceRoot(outputDir); } Магия генерации Maven plugin bit.ly/mvn-plugin-dev
  18. 88 Огромное количество готовых инструментов lanwen/heisenbug17 Хватит это терпеть писать

    toString/equals вручную! Есть слабые стороны, при большой выгоде