Slide 1

Slide 1 text

TestContainers Docker Docker Docker… и тесты Sergei @bsideup Egorov

Slide 2

Slide 2 text

Про меня • Работаю в Uvita GmbH, Berlin • Apache Groovy committer • Участник проекта TestContainers • Использую Docker с 2013 года @bsideup

Slide 3

Slide 3 text

О чем поговорим сегодня? @bsideup

Slide 4

Slide 4 text

План •Поговорим о Docker-е! @bsideup

Slide 5

Slide 5 text

План •Поговорим о Docker-е! •Обсудим тестирование с помощью Docker-а @bsideup

Slide 6

Slide 6 text

План •Поговорим о Docker-е! •Обсудим тестирование с помощью Docker-а •Используем Docker из Java @bsideup

Slide 7

Slide 7 text

План •Поговорим о Docker-е! •Обсудим тестирование с помощью Docker-а •Используем Docker из Java •Пошлём всё на GUI сервера автоматизации @bsideup

Slide 8

Slide 8 text

План •Поговорим о Docker-е! •Обсудим тестирование с помощью Docker-а •Используем Docker из Java •Пошлём всё на GUI сервера автоматизации •Не забудем сделать фотографии и постить их в Twitter @bsideup

Slide 9

Slide 9 text

План •Поговорим о Docker-е! •Обсудим тестирование с помощью Docker-а •Используем Docker из Java •Пошлём всё на GUI сервера автоматизации •Не забудем сделать фотографии и постить их в Twitter @bsideup

Slide 10

Slide 10 text

О чем НЕ поговорим сегодня? •Как установить Docker @bsideup

Slide 11

Slide 11 text

О чем НЕ поговорим сегодня? •Как установить Docker •Как завернуть ваш EAR внутри IBM WebSphere в Docker контейнер @bsideup

Slide 12

Slide 12 text

О чем НЕ поговорим сегодня? •Как установить Docker •Как завернуть ваш EAR внутри IBM WebSphere в Docker контейнер •Насколько сложно мыть дреды @bsideup

Slide 13

Slide 13 text

@bsideup

Slide 14

Slide 14 text

@bsideup

Slide 15

Slide 15 text

@bsideup

Slide 16

Slide 16 text

@bsideup

Slide 17

Slide 17 text

@bsideup

Slide 18

Slide 18 text

Абстракция @bsideup

Slide 19

Slide 19 text

CI friendly @bsideup

Slide 20

Slide 20 text

Кросс-платформенный @bsideup

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

Как я встретил вашу Docker @bsideup

Slide 23

Slide 23 text

@bsideup Я кодил на PHP…

Slide 24

Slide 24 text

@bsideup Я кодил на PHP…

Slide 25

Slide 25 text

@bsideup Без тестов…

Slide 26

Slide 26 text

@bsideup Тестировал “в проде”…

Slide 27

Slide 27 text

@bsideup Но потом…

Slide 28

Slide 28 text

@bsideup Я открыл для себя Java…

Slide 29

Slide 29 text

@bsideup Начал писать Unit тесты…

Slide 30

Slide 30 text

@bsideup И стал “мокать” базы данных >_<

Slide 31

Slide 31 text

@bsideup 21 век на дворе!

Slide 32

Slide 32 text

@bsideup Image Я

Slide 33

Slide 33 text

Tooling @bsideup

Slide 34

Slide 34 text

+Tooling @bsideup

Slide 35

Slide 35 text

Docker Compose рулит! redis:
 image: redis
 ports:
 - "6379:6379"
 postgres:
 image: postgres
 ports:
 - "5432:5432"
 elasticsearch:
 image: elasticsearch:5.0.0
 ports:
 - "9200:9200"
 @bsideup

Slide 36

Slide 36 text

Но…

Slide 37

Slide 37 text

Декларативный YAML redis:
 image: redis
 ports:
 - "6379:6379"
 postgres:
 image: postgres
 ports:
 - "5432:5432"
 elasticsearch:
 image: elasticsearch:5.0.0
 ports:
 - "9200:9200"
 @bsideup

Slide 38

Slide 38 text

Фиксированные порты redis:
 image: redis
 ports:
 - "6379:6379"
 postgres:
 image: postgres
 ports:
 - "5432:5432"
 elasticsearch:
 image: elasticsearch:5.0.0
 ports:
 - "9200:9200"
 @bsideup

Slide 39

Slide 39 text

Подмножества контейнеров? redis:
 image: redis
 ports:
 - "6379:6379"
 postgres:
 image: postgres
 ports:
 - "5432:5432"
 elasticsearch:
 image: elasticsearch:5.0.0
 ports:
 - "9200:9200"
 @bsideup

Slide 40

Slide 40 text

Запуск из IDE? @bsideup

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

TestContainers • http://github.com/testcontainers/testcontainers-java • Обёртка вокруг docker-java library • Работает везде где есть Docker (Win, Mac, Linux) • Останавливает контейнеры при JVM shutdown @bsideup

Slide 43

Slide 43 text

Проще некуда! new PostgreSQLContainer() new BrowserWebDriverContainer() .withDesiredCapabilities(DesiredCapabilities.chrome())
 
 new GenericContainer(“redis:3”) new DockerComposeContainer(“docker-compose.yml”) @bsideup

Slide 44

Slide 44 text

Кто использует

Slide 45

Slide 45 text

Пример: Docker как Selenium драйвер • Selenium/Selenide тесты • Не требуется устанавливать Chrome/Firefox/etc • CI friendly @bsideup

Slide 46

Slide 46 text

@Rule public BrowserWebDriverContainer chrome = new BrowserWebDriverContainer() .withDesiredCapabilities(DesiredCapabilities.chrome()) .withRecordingMode(RECORD_ALL, new File("target")); @bsideup

Slide 47

Slide 47 text

@Rule public BrowserWebDriverContainer chrome = new BrowserWebDriverContainer() .withDesiredCapabilities(DesiredCapabilities.chrome()) .withRecordingMode(RECORD_ALL, new File("target")); RemoteWebDriver driver = chrome.getWebDriver(); driver.get("https://wikipedia.org"); WebElement searchInput = driver.findElementByName("search"); searchInput.sendKeys("Rick Astley"); searchInput.submit(); WebElement otherPage = driver.findElementByLinkText("Rickrolling"); otherPage.click(); boolean expectedTextFound = driver.findElementsByCssSelector("p") .stream() .anyMatch(element -> element.getText().contains("meme")); assertTrue("The word 'meme' is found on a page about rickrolling", expectedTextFound); @bsideup

Slide 48

Slide 48 text

@Rule public BrowserWebDriverContainer chrome = new BrowserWebDriverContainer() .withDesiredCapabilities(DesiredCapabilities.chrome()) .withRecordingMode(RECORD_ALL, new File("target")); RemoteWebDriver driver = chrome.getWebDriver(); driver.get("https://wikipedia.org"); WebElement searchInput = driver.findElementByName("search"); searchInput.sendKeys("Rick Astley"); searchInput.submit(); WebElement otherPage = driver.findElementByLinkText("Rickrolling"); otherPage.click(); boolean expectedTextFound = driver.findElementsByCssSelector("p") .stream() .anyMatch(element -> element.getText().contains("meme")); assertTrue("The word 'meme' is found on a page about rickrolling", expectedTextFound); import org.openqa.selenium.remote.RemoteWebDriver; @bsideup

Slide 49

Slide 49 text

@Rule public BrowserWebDriverContainer chrome = new BrowserWebDriverContainer() .withDesiredCapabilities(DesiredCapabilities.chrome()); RemoteWebDriver driver = chrome.getWebDriver(); driver.get("https://wikipedia.org"); WebElement searchInput = driver.findElementByName("search"); searchInput.sendKeys("Rick Astley"); searchInput.submit(); driver.findElementByLinkText("Rickrolling").click(); assert driver.findElementsByCssSelector("p") .stream() .anyMatch(element -> element.getText().contains("meme")); @bsideup

Slide 50

Slide 50 text

Demo

Slide 51

Slide 51 text

• http://testcontainers.org • testcontainers/testcontainers-java-examples • Docker отлично подходит для тестирования • И для разработки, и для CI @bsideup

Slide 52

Slide 52 text

Вопросы?

Slide 53

Slide 53 text

@bsideup bsideup

Slide 54

Slide 54 text

https://commons.wikimedia.org/wiki/File:Thats_all_folks.svg