Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
TestContainers - Heisenbug Moscow 2017
Search
Sergei Egorov
December 13, 2017
Programming
200
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
TestContainers - Heisenbug Moscow 2017
https://heisenbug-moscow.ru/talks/2017/msk/5jkoam6i9o4482geewoy4w/
Sergei Egorov
December 13, 2017
More Decks by Sergei Egorov
See All by Sergei Egorov
SnowOne 2020: Jabel – retrofitting Java Compiler by instrumenting it!
bsideup
1
410
JUGBB2020: Testcontainers - Past, Present, Future
bsideup
1
260
Presentation: Reactive: Do. Or do not. There is no try.
bsideup
1
1.5k
Devoxx MA: Testcontainers deep dive
bsideup
1
190
Jokerconf 2019: Testcontainers: a year-in-review
bsideup
1
340
GeekOut 2019: Don’t be Homer Simpson with your Reactor!
bsideup
0
950
DevClub Tallinn: How to Make Your OSS Project Successful
bsideup
1
770
Pivotal Toronto 2019: Don’t be Homer Simpson with your Reactor!
bsideup
0
160
GeeCON 2019: Testcontainers: a year-in-review
bsideup
1
2.7k
Other Decks in Programming
See All in Programming
tsc.rip を支える技術 / Kyoto.なんか #8
susisu
0
3.8k
Press start. Python's next generation.
willingc
PRO
3
250
ソフトウェアラスタライザ
fadis
1
720
Webエンジニアなのにブラウザの仕組みがわからないので、Pythonで自作してみた
tatsuki12
4
1.1k
Hello, Hiroshima Geospatial Data! — Exploring DoboX with Python
ra0kley
0
110
Deep dive into the select statement (GopherCon UK)
jespino
0
150
Cloudflare is Agents
chimame
0
180
ALB ログから Trace を気合で繋げる技術
fohte
7
770
Oxlintはいいぞ(続)
yug1224
1
480
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
3
240
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
220
プロポーザルを書いてもらう
pvcresin
0
590
Featured
See All Featured
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
950
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.4k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.3k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
480
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.3k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.5k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
4 Signs Your Business is Dying
shpigford
187
23k
Bash Introduction
62gerente
615
220k
The browser strikes back
jonoalderson
0
1.6k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
Transcript
TestContainers Docker Docker Docker… и тесты Sergei @bsideup Egorov
Про меня • Работаю в Uvita GmbH, Berlin • Apache
Groovy committer • Участник проекта TestContainers • Использую Docker с 2013 года @bsideup
О чем поговорим сегодня? @bsideup
План •Поговорим о Docker-е! @bsideup
План •Поговорим о Docker-е! •Обсудим тестирование с помощью Docker-а @bsideup
План •Поговорим о Docker-е! •Обсудим тестирование с помощью Docker-а •Используем
Docker из Java @bsideup
План •Поговорим о Docker-е! •Обсудим тестирование с помощью Docker-а •Используем
Docker из Java •Пошлём всё на GUI сервера автоматизации @bsideup
План •Поговорим о Docker-е! •Обсудим тестирование с помощью Docker-а •Используем
Docker из Java •Пошлём всё на GUI сервера автоматизации •Не забудем сделать фотографии и постить их в Twitter @bsideup
План •Поговорим о Docker-е! •Обсудим тестирование с помощью Docker-а •Используем
Docker из Java •Пошлём всё на GUI сервера автоматизации •Не забудем сделать фотографии и постить их в Twitter @bsideup
О чем НЕ поговорим сегодня? •Как установить Docker @bsideup
О чем НЕ поговорим сегодня? •Как установить Docker •Как завернуть
ваш EAR внутри IBM WebSphere в Docker контейнер @bsideup
О чем НЕ поговорим сегодня? •Как установить Docker •Как завернуть
ваш EAR внутри IBM WebSphere в Docker контейнер •Насколько сложно мыть дреды @bsideup
@bsideup
@bsideup
@bsideup
@bsideup
@bsideup
Абстракция @bsideup
CI friendly @bsideup
Кросс-платформенный @bsideup
None
Как я встретил вашу Docker @bsideup
@bsideup Я кодил на PHP…
@bsideup Я кодил на PHP…
@bsideup Без тестов…
@bsideup Тестировал “в проде”…
@bsideup Но потом…
@bsideup Я открыл для себя Java…
@bsideup Начал писать Unit тесты…
@bsideup И стал “мокать” базы данных >_<
@bsideup 21 век на дворе!
@bsideup Image Я
Tooling @bsideup
+Tooling @bsideup
Docker Compose рулит! redis: image: redis ports: - "6379:6379" postgres:
image: postgres ports: - "5432:5432" elasticsearch: image: elasticsearch:5.0.0 ports: - "9200:9200" @bsideup
Но…
Декларативный YAML redis: image: redis ports: - "6379:6379" postgres: image:
postgres ports: - "5432:5432" elasticsearch: image: elasticsearch:5.0.0 ports: - "9200:9200" @bsideup
Фиксированные порты redis: image: redis ports: - "6379:6379" postgres: image:
postgres ports: - "5432:5432" elasticsearch: image: elasticsearch:5.0.0 ports: - "9200:9200" @bsideup
Подмножества контейнеров? redis: image: redis ports: - "6379:6379" postgres: image:
postgres ports: - "5432:5432" elasticsearch: image: elasticsearch:5.0.0 ports: - "9200:9200" @bsideup
Запуск из IDE? @bsideup
None
TestContainers • http://github.com/testcontainers/testcontainers-java • Обёртка вокруг docker-java library • Работает
везде где есть Docker (Win, Mac, Linux) • Останавливает контейнеры при JVM shutdown @bsideup
Проще некуда! new PostgreSQLContainer() new BrowserWebDriverContainer() .withDesiredCapabilities(DesiredCapabilities.chrome()) new GenericContainer(“redis:3”)
new DockerComposeContainer(“docker-compose.yml”) @bsideup
Кто использует
Пример: Docker как Selenium драйвер • Selenium/Selenide тесты • Не
требуется устанавливать Chrome/Firefox/etc • CI friendly @bsideup
@Rule public BrowserWebDriverContainer chrome = new BrowserWebDriverContainer() .withDesiredCapabilities(DesiredCapabilities.chrome()) .withRecordingMode(RECORD_ALL, new
File("target")); @bsideup
@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
@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
@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
Demo
• http://testcontainers.org • testcontainers/testcontainers-java-examples • Docker отлично подходит для тестирования
• И для разработки, и для CI @bsideup
Вопросы?
@bsideup bsideup
https://commons.wikimedia.org/wiki/File:Thats_all_folks.svg