SlideShare a Scribd company logo
Easy Java Integration
Testing with
Testcontainers
Simplifying Integration Tests for Enterprise Java
Fabio Turizo
Speaking Today
Fabio Turizo
Service Manager
@fabturizo
• Strategic Members of the Eclipse Foundation
• Project Management Committee member of Jakarta EE
Payara Services Helps Shape the
Future of the Industry
Integration Testing Basics
• A level above basic unit testing
• Multiple units come together to be tested
• Goal: Expose flaws in interface design
• Guarantee platform updates
• Test system dependencies
Integration Testing - Java
• Simple UT frameworks
• Junit, TestNG, Spock
• Highly dependable of the platform
• What about Mocking ?
• Good to simulate interactions
• Bad for real-time scenarios
Integration Testing - Java
• “Works in my machine” persists
• Lots of challenges for Enterprise Java
• Jakarta EE / MicroProfile lack proper tools
• Middleware size footprint has reduced a lot!
• … But complex environments have lots of dependencies 
• What about cloud-native applications?
Arquillian Framework
• Focus on testing Jakarta EE components
• Vendor-agnostic !
• Portable(*) Shrink-wrapped tests
• Container-specific adapters need to be written
• Added complexity in writing tests
Arquillian Sample (JUnit 4.x)
@RunWith(Arquillian.class)
public class PersonDaoTest {
@EJB
private PersonDao personDao;
@Inject TestData testData;
@Deployment
public static WebArchive createDeployment() {
return ShrinkWrap.create(WebArchive.class, "arquillian-example.war")
.addClass(Person.class)
.addClass(PersonDao.class)
.addAsResource("test-persistence.xml", "META-INF/persistence.xml");
}
Arquillian Sample (JUnit 4.x)
@Before
public void prepareTestData() {
testData.prepareForShouldReturnAllPerson();
}
@Test
public void shouldReturnAllPerson() throws Exception {
List<Person> personList = personDao.getAll();
assertNotNull(personList);
assertThat(personList.size(), is(1));
assertThat(personList.get(0).getName(), is("John"));
assertThat(personList.get(0).getLastName(), is("Malkovich"));
}
Arquillian Sample (JUnit 4.x)
@Dependent
public static class TestData {
@PersistenceContext
private EntityManager entityManager;
@Transactional
public void prepareForShouldReturnAllPerson() {
entityManager.persist(new Person("John", "Malkovich"));
}
}
}
Some Gaps to be Filled 
• Test issues:
• Assemble a *part of the application* to test it
• This includes code and resources
• The persistence layer is tested, but not the store
• No way to test different configurations
• Sadly, not a real-world test
Enter Testcontainers!
• Lightweight unit testing
• Based on Docker containers
• Ease up networking setup
• Data access layer tests support
• Fully* portable integration tests!
Testcontainers Benefits
• Effective black-box testing
• Tests are user-focused
• Run UA testing with little overhead
• Possible to audit security standards
• Identify flaws in specific technologies
Testcontainers Requirements
• Docker (only Linux containers, though)
• Test Frameworks
• Junit 4
• Junit 5
• Spock
• Maven/Gradle Dependencies
Getting Started – JUnit5
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.8.1</version>
<scope>test</scope>
</dependency>
Getting Started – TC + JUnit5
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers</artifactId>
<version>1.17.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>junit-jupiter</artifactId>
<version>1.17.3</version>
<scope>test</scope>
</dependency>
Testcontainer Setup
@TestContainers
public class BasicApplicationTest{
@Container
GenericContainer myappContainer = new
GenericContainer(DockerImageName.parse(“fturizo/myapp"))
.withExposedPorts(8080, 9009, 28080)
.withCommand(“./deploy-application.sh”);
@Test
public void test_running(){
assert(isTrue(myappcontainer.isRunning()));
}
}
Container Access - Boundary
@Test
public void test_application(){
String url = String.format(“http://%s:%s/%s”,
myappContainer.getHost(),
myappContainer.getMappedPort(8080), “/myapp”);
int status = http.get(url).response().status();
//Careful!
assertEquals(status, 200);
}
Waiting for Readiness - HTTP
@TestContainers
public class BasicApplicationTest{
@Container
GenericContainer myappContainer = new
GenericContainer(DockerImageName.parse(“fturizo/myapp"))
.withExposedPorts(8080, 9009, 28080)
.waitingFor(Wait.forHttp(“/myapp/ready”)
.forStatusCode(200));
}
Waiting for Readiness – Log Message
@TestContainers
public class BasicApplicationTest{
@Container
GenericContainer myappContainer = new
GenericContainer(DockerImageName.parse(“fturizo/myapp"))
.withExposedPorts(8080, 9009, 28080)
.waitingFor(Wait.forLogMessage(“.*Application
is ready.*”);
}
Dependency Configuration (1)
Network network = Network.newNetwork();
@Container
GenericContainer dbContainer = new
GenericContainer(DockerImageName.parse(“mysql:8.0"))
.withEnv(“MYSQL_ROOT_PASSWORD”, “rootPass”)
.withEnv(“MYSQL_USER”, “test”)
.withEnv(“MYSQL_PASSWORD”, “test”)
.withEnv(“MYSQL_DATABASE”, “testDB”)
.withNetwork(network)
.withNetworkAlias(“mysql_db”);
Dependency Configuration (2)
@Container
GenericContainer appContainer = new
GenericContainer(DockerImageName.parse(“fturizo/myapp"))
.withEnv(“DB_SERVER”, “mysql_db”)
.withEnv(“DB_USER”, “test”)
.withEnv(“DB_PASSWORD”, “test”)
.withEnv(“DB_NAME”, “testDB”)
.withNetwork(network)
.dependsOn(dbContainer)
…
Database Support
• Special objects for wrapped containers
• Popular market choices for:
• Relational: MySQL, MariaDB, OracleXE, DB2, Postgres
• NoSQL: Couchbase, MongoDB, Neo4J, Cassandra, OrientDB
• Easy instantiation and integration
MySQL Database Configuration
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>mysql</artifactId>
<version>1.15.0-rc1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
<scope>test</scope>
</dependency>
MySQL Testcontainer (1)
@Container
MySQLContainer mysqlContainer = new
MySQLContainer<>(DockerImageName.parse(“mysql:8.0”))
.withNetwork(network)
.withNetworkAliases(“mysql_db”);
MySQL Testcontainer (2)
@Container
GenericContainer appContainer = new
GenericContainer(DockerImageName.parse(“fturizo/myapp"))
.withEnv(“DB_SERVER”, “mysql_db”)
.withEnv(“DB_USER”, mysqlContainer.getUser())
.withEnv(“DB_PASSWORD”,
mysqlContainer.getPassword())
.withEnv(“DB_NAME”,
mysqlContainer.getDatabaseName())
.withNetwork(network)
.dependsOn(mysqlContainer)
…
MySQL Testcontainer (3)
String query = "select * from …”;
try(Connection connection =
DriverManager.getConnection(mysqlContainer.getJdbcUrl(),
mysqlContainer.getUsername(),
mysqlContainer.getPassword());
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(query))){
while(resultSet.next()) {
assertThat(resultSet.get(0), isEqual(“XYZ”));
}
} catch (SQLException e) {
assert false;
}
More Features!
• Docker Compose is supported, too:
DockerComposeContainer environment =
new DockerComposeContainer(new
File(“src/test/compose.yaml”))
.withExposedService(“mysql_1”, 3306)
.withExposedService(“myapp_1”, 8080);
More Features !
• Container support for popular solutions:
• ElasticSearch (Distributed Search)
• Apache Kafka (Distributed Messaging)
• RabbitMQ (JMS)
• Solr (Text Search)
• Nginx (Loadbalancing)
Testcontainers Caveats
• Docker adds an extra layer of processing
• More resources needed for full coverage
• Test time will increase overall!
• Middleware must be prepared for Docker*
• And so are its dependencies!
• Black-box testing is not suited for all software
Testcontainers Cloud
• Outsource your integration tests!
• https://www.testcontainers.cloud/
Demo Time
https://github.com/fturizo/ConferenceDemo
In Summary
• Testcontainers:
• Ease up writing tests
• Simplify dependency management
• Allow real-world testing
• Make true portability a priority
• Gives Enterprise Java a vendor-agnostic testing framework
Please visit us at:
payara.fish/join-us

More Related Content

What's hot

Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud GatewaySpring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
Iván López Martín
 
Spring Boot
Spring BootSpring Boot
Spring Boot
Jaydeep Kale
 
Testcontainers - Geekout EE 2017 presentation
Testcontainers - Geekout EE 2017 presentationTestcontainers - Geekout EE 2017 presentation
Testcontainers - Geekout EE 2017 presentation
Richard North
 
Jenkins CI presentation
Jenkins CI presentationJenkins CI presentation
Jenkins CI presentation
Jonathan Holloway
 
JMockit Framework Overview
JMockit Framework OverviewJMockit Framework Overview
JMockit Framework Overview
Mario Peshev
 
Test your microservices with REST-Assured
Test your microservices with REST-AssuredTest your microservices with REST-Assured
Test your microservices with REST-Assured
Michel Schudel
 
Lombok
LombokLombok
Spring Security
Spring SecuritySpring Security
Spring Security
Knoldus Inc.
 
[112]rest에서 graph ql과 relay로 갈아타기 이정우
[112]rest에서 graph ql과 relay로 갈아타기 이정우[112]rest에서 graph ql과 relay로 갈아타기 이정우
[112]rest에서 graph ql과 relay로 갈아타기 이정우
NAVER D2
 
JPA and Hibernate
JPA and HibernateJPA and Hibernate
JPA and Hibernate
elliando dias
 
REST APIs with Spring
REST APIs with SpringREST APIs with Spring
REST APIs with Spring
Joshua Long
 
JUnit & Mockito, first steps
JUnit & Mockito, first stepsJUnit & Mockito, first steps
JUnit & Mockito, first steps
Renato Primavera
 
Integrating Microservices with Apache Camel
Integrating Microservices with Apache CamelIntegrating Microservices with Apache Camel
Integrating Microservices with Apache Camel
Christian Posta
 
[오픈소스컨설팅] 서비스 메쉬(Service mesh)
[오픈소스컨설팅] 서비스 메쉬(Service mesh)[오픈소스컨설팅] 서비스 메쉬(Service mesh)
[오픈소스컨설팅] 서비스 메쉬(Service mesh)
Open Source Consulting
 
Spring Security 5
Spring Security 5Spring Security 5
Spring Security 5
Jesus Perez Franco
 
Web Services Automated Testing via SoapUI Tool
Web Services Automated Testing via SoapUI ToolWeb Services Automated Testing via SoapUI Tool
Web Services Automated Testing via SoapUI Tool
Sperasoft
 
Getting started with karate dsl
Getting started with karate dslGetting started with karate dsl
Getting started with karate dsl
Knoldus Inc.
 
BDD WITH CUCUMBER AND JAVA
BDD WITH CUCUMBER AND JAVABDD WITH CUCUMBER AND JAVA
BDD WITH CUCUMBER AND JAVA
Srinivas Katakam
 
Introduction to Spring Boot
Introduction to Spring BootIntroduction to Spring Boot
Introduction to Spring Boot
Purbarun Chakrabarti
 
Spring Boot & Actuators
Spring Boot & ActuatorsSpring Boot & Actuators
Spring Boot & Actuators
VMware Tanzu
 

What's hot (20)

Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud GatewaySpring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
 
Spring Boot
Spring BootSpring Boot
Spring Boot
 
Testcontainers - Geekout EE 2017 presentation
Testcontainers - Geekout EE 2017 presentationTestcontainers - Geekout EE 2017 presentation
Testcontainers - Geekout EE 2017 presentation
 
Jenkins CI presentation
Jenkins CI presentationJenkins CI presentation
Jenkins CI presentation
 
JMockit Framework Overview
JMockit Framework OverviewJMockit Framework Overview
JMockit Framework Overview
 
Test your microservices with REST-Assured
Test your microservices with REST-AssuredTest your microservices with REST-Assured
Test your microservices with REST-Assured
 
Lombok
LombokLombok
Lombok
 
Spring Security
Spring SecuritySpring Security
Spring Security
 
[112]rest에서 graph ql과 relay로 갈아타기 이정우
[112]rest에서 graph ql과 relay로 갈아타기 이정우[112]rest에서 graph ql과 relay로 갈아타기 이정우
[112]rest에서 graph ql과 relay로 갈아타기 이정우
 
JPA and Hibernate
JPA and HibernateJPA and Hibernate
JPA and Hibernate
 
REST APIs with Spring
REST APIs with SpringREST APIs with Spring
REST APIs with Spring
 
JUnit & Mockito, first steps
JUnit & Mockito, first stepsJUnit & Mockito, first steps
JUnit & Mockito, first steps
 
Integrating Microservices with Apache Camel
Integrating Microservices with Apache CamelIntegrating Microservices with Apache Camel
Integrating Microservices with Apache Camel
 
[오픈소스컨설팅] 서비스 메쉬(Service mesh)
[오픈소스컨설팅] 서비스 메쉬(Service mesh)[오픈소스컨설팅] 서비스 메쉬(Service mesh)
[오픈소스컨설팅] 서비스 메쉬(Service mesh)
 
Spring Security 5
Spring Security 5Spring Security 5
Spring Security 5
 
Web Services Automated Testing via SoapUI Tool
Web Services Automated Testing via SoapUI ToolWeb Services Automated Testing via SoapUI Tool
Web Services Automated Testing via SoapUI Tool
 
Getting started with karate dsl
Getting started with karate dslGetting started with karate dsl
Getting started with karate dsl
 
BDD WITH CUCUMBER AND JAVA
BDD WITH CUCUMBER AND JAVABDD WITH CUCUMBER AND JAVA
BDD WITH CUCUMBER AND JAVA
 
Introduction to Spring Boot
Introduction to Spring BootIntroduction to Spring Boot
Introduction to Spring Boot
 
Spring Boot & Actuators
Spring Boot & ActuatorsSpring Boot & Actuators
Spring Boot & Actuators
 

Similar to Easy Java Integration Testing with Testcontainers​

Level Up Your Integration Testing With Testcontainers
Level Up Your Integration Testing With TestcontainersLevel Up Your Integration Testing With Testcontainers
Level Up Your Integration Testing With Testcontainers
VMware Tanzu
 
JLove - Replicating production on your laptop using the magic of containers
JLove - Replicating production on your laptop using the magic of containersJLove - Replicating production on your laptop using the magic of containers
JLove - Replicating production on your laptop using the magic of containers
Grace Jansen
 
JBCN_Testing_With_Containers
JBCN_Testing_With_ContainersJBCN_Testing_With_Containers
JBCN_Testing_With_Containers
Grace Jansen
 
Devoxx UK 2013 Test-Driven Development with JavaEE 7, Arquillian and Embedded...
Devoxx UK 2013 Test-Driven Development with JavaEE 7, Arquillian and Embedded...Devoxx UK 2013 Test-Driven Development with JavaEE 7, Arquillian and Embedded...
Devoxx UK 2013 Test-Driven Development with JavaEE 7, Arquillian and Embedded...
Peter Pilgrim
 
Jakarta EE Test Strategies (2022)
Jakarta EE Test Strategies (2022)Jakarta EE Test Strategies (2022)
Jakarta EE Test Strategies (2022)
Ryan Cuprak
 
Performance Test Driven Development with Oracle Coherence
Performance Test Driven Development with Oracle CoherencePerformance Test Driven Development with Oracle Coherence
Performance Test Driven Development with Oracle Coherence
aragozin
 
JUnit5 and TestContainers
JUnit5 and TestContainersJUnit5 and TestContainers
JUnit5 and TestContainers
Sunghyouk Bae
 
How to Build Your Own Test Automation Framework?
How to Build Your Own Test Automation Framework?How to Build Your Own Test Automation Framework?
How to Build Your Own Test Automation Framework?
Dmitry Buzdin
 
JUDCON India 2014 Java EE 7 talk
JUDCON India 2014 Java EE 7 talkJUDCON India 2014 Java EE 7 talk
JUDCON India 2014 Java EE 7 talk
Vijay Nair
 
Building XWiki
Building XWikiBuilding XWiki
Building XWiki
Vincent Massol
 
Breaking Dependencies to Allow Unit Testing
Breaking Dependencies to Allow Unit TestingBreaking Dependencies to Allow Unit Testing
Breaking Dependencies to Allow Unit Testing
Steven Smith
 
Breaking Dependencies To Allow Unit Testing - Steve Smith | FalafelCON 2014
Breaking Dependencies To Allow Unit Testing - Steve Smith | FalafelCON 2014Breaking Dependencies To Allow Unit Testing - Steve Smith | FalafelCON 2014
Breaking Dependencies To Allow Unit Testing - Steve Smith | FalafelCON 2014
FalafelSoftware
 
Why jakarta ee matters (ConFoo 2021)
Why jakarta ee matters (ConFoo 2021)Why jakarta ee matters (ConFoo 2021)
Why jakarta ee matters (ConFoo 2021)
Ryan Cuprak
 
Test it! Unit, mocking and in-container Meet Arquillian!
Test it! Unit, mocking and in-container Meet Arquillian!Test it! Unit, mocking and in-container Meet Arquillian!
Test it! Unit, mocking and in-container Meet Arquillian!
Ivan Ivanov
 
Advanced Java Testing
Advanced Java TestingAdvanced Java Testing
Advanced Java Testing
Vincent Massol
 
Enterprise Persistence in OSGi - Mike Keith, Oracle
Enterprise Persistence in OSGi - Mike Keith, OracleEnterprise Persistence in OSGi - Mike Keith, Oracle
Enterprise Persistence in OSGi - Mike Keith, Oracle
mfrancis
 
Strudel: Framework for Transaction Performance Analyses on SQL/NoSQL Systems
Strudel: Framework for Transaction Performance Analyses on SQL/NoSQL SystemsStrudel: Framework for Transaction Performance Analyses on SQL/NoSQL Systems
Strudel: Framework for Transaction Performance Analyses on SQL/NoSQL Systems
tatemura
 
Haj 4328-java ee 7 overview
Haj 4328-java ee 7 overviewHaj 4328-java ee 7 overview
Haj 4328-java ee 7 overview
Kevin Sutter
 
190711_Testbirds_Selenium_eclipsecon_FINAL_0.ppt
190711_Testbirds_Selenium_eclipsecon_FINAL_0.ppt190711_Testbirds_Selenium_eclipsecon_FINAL_0.ppt
190711_Testbirds_Selenium_eclipsecon_FINAL_0.ppt
NaviAningi
 
KKSD_Testbirds_Selenium_eclipsecon_FINAL_0.ppt
KKSD_Testbirds_Selenium_eclipsecon_FINAL_0.pptKKSD_Testbirds_Selenium_eclipsecon_FINAL_0.ppt
KKSD_Testbirds_Selenium_eclipsecon_FINAL_0.ppt
Kiran Kumar SD
 

Similar to Easy Java Integration Testing with Testcontainers​ (20)

Level Up Your Integration Testing With Testcontainers
Level Up Your Integration Testing With TestcontainersLevel Up Your Integration Testing With Testcontainers
Level Up Your Integration Testing With Testcontainers
 
JLove - Replicating production on your laptop using the magic of containers
JLove - Replicating production on your laptop using the magic of containersJLove - Replicating production on your laptop using the magic of containers
JLove - Replicating production on your laptop using the magic of containers
 
JBCN_Testing_With_Containers
JBCN_Testing_With_ContainersJBCN_Testing_With_Containers
JBCN_Testing_With_Containers
 
Devoxx UK 2013 Test-Driven Development with JavaEE 7, Arquillian and Embedded...
Devoxx UK 2013 Test-Driven Development with JavaEE 7, Arquillian and Embedded...Devoxx UK 2013 Test-Driven Development with JavaEE 7, Arquillian and Embedded...
Devoxx UK 2013 Test-Driven Development with JavaEE 7, Arquillian and Embedded...
 
Jakarta EE Test Strategies (2022)
Jakarta EE Test Strategies (2022)Jakarta EE Test Strategies (2022)
Jakarta EE Test Strategies (2022)
 
Performance Test Driven Development with Oracle Coherence
Performance Test Driven Development with Oracle CoherencePerformance Test Driven Development with Oracle Coherence
Performance Test Driven Development with Oracle Coherence
 
JUnit5 and TestContainers
JUnit5 and TestContainersJUnit5 and TestContainers
JUnit5 and TestContainers
 
How to Build Your Own Test Automation Framework?
How to Build Your Own Test Automation Framework?How to Build Your Own Test Automation Framework?
How to Build Your Own Test Automation Framework?
 
JUDCON India 2014 Java EE 7 talk
JUDCON India 2014 Java EE 7 talkJUDCON India 2014 Java EE 7 talk
JUDCON India 2014 Java EE 7 talk
 
Building XWiki
Building XWikiBuilding XWiki
Building XWiki
 
Breaking Dependencies to Allow Unit Testing
Breaking Dependencies to Allow Unit TestingBreaking Dependencies to Allow Unit Testing
Breaking Dependencies to Allow Unit Testing
 
Breaking Dependencies To Allow Unit Testing - Steve Smith | FalafelCON 2014
Breaking Dependencies To Allow Unit Testing - Steve Smith | FalafelCON 2014Breaking Dependencies To Allow Unit Testing - Steve Smith | FalafelCON 2014
Breaking Dependencies To Allow Unit Testing - Steve Smith | FalafelCON 2014
 
Why jakarta ee matters (ConFoo 2021)
Why jakarta ee matters (ConFoo 2021)Why jakarta ee matters (ConFoo 2021)
Why jakarta ee matters (ConFoo 2021)
 
Test it! Unit, mocking and in-container Meet Arquillian!
Test it! Unit, mocking and in-container Meet Arquillian!Test it! Unit, mocking and in-container Meet Arquillian!
Test it! Unit, mocking and in-container Meet Arquillian!
 
Advanced Java Testing
Advanced Java TestingAdvanced Java Testing
Advanced Java Testing
 
Enterprise Persistence in OSGi - Mike Keith, Oracle
Enterprise Persistence in OSGi - Mike Keith, OracleEnterprise Persistence in OSGi - Mike Keith, Oracle
Enterprise Persistence in OSGi - Mike Keith, Oracle
 
Strudel: Framework for Transaction Performance Analyses on SQL/NoSQL Systems
Strudel: Framework for Transaction Performance Analyses on SQL/NoSQL SystemsStrudel: Framework for Transaction Performance Analyses on SQL/NoSQL Systems
Strudel: Framework for Transaction Performance Analyses on SQL/NoSQL Systems
 
Haj 4328-java ee 7 overview
Haj 4328-java ee 7 overviewHaj 4328-java ee 7 overview
Haj 4328-java ee 7 overview
 
190711_Testbirds_Selenium_eclipsecon_FINAL_0.ppt
190711_Testbirds_Selenium_eclipsecon_FINAL_0.ppt190711_Testbirds_Selenium_eclipsecon_FINAL_0.ppt
190711_Testbirds_Selenium_eclipsecon_FINAL_0.ppt
 
KKSD_Testbirds_Selenium_eclipsecon_FINAL_0.ppt
KKSD_Testbirds_Selenium_eclipsecon_FINAL_0.pptKKSD_Testbirds_Selenium_eclipsecon_FINAL_0.ppt
KKSD_Testbirds_Selenium_eclipsecon_FINAL_0.ppt
 

More from Payara

Payara Cloud - Cloud Native Jakarta EE.pptx
Payara Cloud - Cloud Native Jakarta EE.pptxPayara Cloud - Cloud Native Jakarta EE.pptx
Payara Cloud - Cloud Native Jakarta EE.pptx
Payara
 
Jakarta Concurrency: Present and Future
Jakarta Concurrency: Present and FutureJakarta Concurrency: Present and Future
Jakarta Concurrency: Present and Future
Payara
 
GlassFish Migration Webinar 2022 Current version.pptx
GlassFish Migration Webinar 2022 Current version.pptxGlassFish Migration Webinar 2022 Current version.pptx
GlassFish Migration Webinar 2022 Current version.pptx
Payara
 
10 Strategies for Developing Reliable Jakarta EE & MicroProfile Applications ...
10 Strategies for Developing Reliable Jakarta EE & MicroProfile Applications ...10 Strategies for Developing Reliable Jakarta EE & MicroProfile Applications ...
10 Strategies for Developing Reliable Jakarta EE & MicroProfile Applications ...
Payara
 
Securing Microservices with MicroProfile and Auth0v2
Securing Microservices with MicroProfile and Auth0v2Securing Microservices with MicroProfile and Auth0v2
Securing Microservices with MicroProfile and Auth0v2
Payara
 
Reactive features of MicroProfile you need to learn
Reactive features of MicroProfile you need to learnReactive features of MicroProfile you need to learn
Reactive features of MicroProfile you need to learn
Payara
 
Effective cloud-ready apps with MicroProfile
Effective cloud-ready apps with MicroProfileEffective cloud-ready apps with MicroProfile
Effective cloud-ready apps with MicroProfile
Payara
 
A step-by-step guide from traditional Java EE to reactive microservice design
A step-by-step guide from traditional Java EE to reactive microservice designA step-by-step guide from traditional Java EE to reactive microservice design
A step-by-step guide from traditional Java EE to reactive microservice design
Payara
 
Transactions in Microservices
Transactions in MicroservicesTransactions in Microservices
Transactions in Microservices
Payara
 
Fun with Kubernetes and Payara Micro 5
Fun with Kubernetes and Payara Micro 5Fun with Kubernetes and Payara Micro 5
Fun with Kubernetes and Payara Micro 5
Payara
 
What's new in Jakarta EE and Eclipse GlassFish (May 2019)
What's new in Jakarta EE and Eclipse GlassFish (May 2019)What's new in Jakarta EE and Eclipse GlassFish (May 2019)
What's new in Jakarta EE and Eclipse GlassFish (May 2019)
Payara
 
Previewing Payara Platform 5.192
Previewing Payara Platform 5.192Previewing Payara Platform 5.192
Previewing Payara Platform 5.192
Payara
 
Secure JAX-RS
Secure JAX-RSSecure JAX-RS
Secure JAX-RS
Payara
 
Gradual Migration to MicroProfile
Gradual Migration to MicroProfileGradual Migration to MicroProfile
Gradual Migration to MicroProfile
Payara
 
Monitor Microservices with MicroProfile Metrics
Monitor Microservices with MicroProfile MetricsMonitor Microservices with MicroProfile Metrics
Monitor Microservices with MicroProfile Metrics
Payara
 
Java2 days -_be_reactive_and_micro_with_a_microprofile_stack
Java2 days -_be_reactive_and_micro_with_a_microprofile_stackJava2 days -_be_reactive_and_micro_with_a_microprofile_stack
Java2 days -_be_reactive_and_micro_with_a_microprofile_stack
Payara
 
Java2 days 5_agile_steps_to_cloud-ready_apps
Java2 days 5_agile_steps_to_cloud-ready_appsJava2 days 5_agile_steps_to_cloud-ready_apps
Java2 days 5_agile_steps_to_cloud-ready_apps
Payara
 
Rapid development tools for java ee 8 and micro profile [GIDS]
Rapid development tools for java ee 8 and micro profile [GIDS] Rapid development tools for java ee 8 and micro profile [GIDS]
Rapid development tools for java ee 8 and micro profile [GIDS]
Payara
 
Ondrej mihalyi be reactive and micro with a micro profile stack
Ondrej mihalyi   be reactive and micro with a micro profile stackOndrej mihalyi   be reactive and micro with a micro profile stack
Ondrej mihalyi be reactive and micro with a micro profile stack
Payara
 
Bed con Quest for JavaEE
Bed con Quest for JavaEEBed con Quest for JavaEE
Bed con Quest for JavaEE
Payara
 

More from Payara (20)

Payara Cloud - Cloud Native Jakarta EE.pptx
Payara Cloud - Cloud Native Jakarta EE.pptxPayara Cloud - Cloud Native Jakarta EE.pptx
Payara Cloud - Cloud Native Jakarta EE.pptx
 
Jakarta Concurrency: Present and Future
Jakarta Concurrency: Present and FutureJakarta Concurrency: Present and Future
Jakarta Concurrency: Present and Future
 
GlassFish Migration Webinar 2022 Current version.pptx
GlassFish Migration Webinar 2022 Current version.pptxGlassFish Migration Webinar 2022 Current version.pptx
GlassFish Migration Webinar 2022 Current version.pptx
 
10 Strategies for Developing Reliable Jakarta EE & MicroProfile Applications ...
10 Strategies for Developing Reliable Jakarta EE & MicroProfile Applications ...10 Strategies for Developing Reliable Jakarta EE & MicroProfile Applications ...
10 Strategies for Developing Reliable Jakarta EE & MicroProfile Applications ...
 
Securing Microservices with MicroProfile and Auth0v2
Securing Microservices with MicroProfile and Auth0v2Securing Microservices with MicroProfile and Auth0v2
Securing Microservices with MicroProfile and Auth0v2
 
Reactive features of MicroProfile you need to learn
Reactive features of MicroProfile you need to learnReactive features of MicroProfile you need to learn
Reactive features of MicroProfile you need to learn
 
Effective cloud-ready apps with MicroProfile
Effective cloud-ready apps with MicroProfileEffective cloud-ready apps with MicroProfile
Effective cloud-ready apps with MicroProfile
 
A step-by-step guide from traditional Java EE to reactive microservice design
A step-by-step guide from traditional Java EE to reactive microservice designA step-by-step guide from traditional Java EE to reactive microservice design
A step-by-step guide from traditional Java EE to reactive microservice design
 
Transactions in Microservices
Transactions in MicroservicesTransactions in Microservices
Transactions in Microservices
 
Fun with Kubernetes and Payara Micro 5
Fun with Kubernetes and Payara Micro 5Fun with Kubernetes and Payara Micro 5
Fun with Kubernetes and Payara Micro 5
 
What's new in Jakarta EE and Eclipse GlassFish (May 2019)
What's new in Jakarta EE and Eclipse GlassFish (May 2019)What's new in Jakarta EE and Eclipse GlassFish (May 2019)
What's new in Jakarta EE and Eclipse GlassFish (May 2019)
 
Previewing Payara Platform 5.192
Previewing Payara Platform 5.192Previewing Payara Platform 5.192
Previewing Payara Platform 5.192
 
Secure JAX-RS
Secure JAX-RSSecure JAX-RS
Secure JAX-RS
 
Gradual Migration to MicroProfile
Gradual Migration to MicroProfileGradual Migration to MicroProfile
Gradual Migration to MicroProfile
 
Monitor Microservices with MicroProfile Metrics
Monitor Microservices with MicroProfile MetricsMonitor Microservices with MicroProfile Metrics
Monitor Microservices with MicroProfile Metrics
 
Java2 days -_be_reactive_and_micro_with_a_microprofile_stack
Java2 days -_be_reactive_and_micro_with_a_microprofile_stackJava2 days -_be_reactive_and_micro_with_a_microprofile_stack
Java2 days -_be_reactive_and_micro_with_a_microprofile_stack
 
Java2 days 5_agile_steps_to_cloud-ready_apps
Java2 days 5_agile_steps_to_cloud-ready_appsJava2 days 5_agile_steps_to_cloud-ready_apps
Java2 days 5_agile_steps_to_cloud-ready_apps
 
Rapid development tools for java ee 8 and micro profile [GIDS]
Rapid development tools for java ee 8 and micro profile [GIDS] Rapid development tools for java ee 8 and micro profile [GIDS]
Rapid development tools for java ee 8 and micro profile [GIDS]
 
Ondrej mihalyi be reactive and micro with a micro profile stack
Ondrej mihalyi   be reactive and micro with a micro profile stackOndrej mihalyi   be reactive and micro with a micro profile stack
Ondrej mihalyi be reactive and micro with a micro profile stack
 
Bed con Quest for JavaEE
Bed con Quest for JavaEEBed con Quest for JavaEE
Bed con Quest for JavaEE
 

Recently uploaded

Biomedical Knowledge Graphs for Data Scientists and Bioinformaticians
Biomedical Knowledge Graphs for Data Scientists and BioinformaticiansBiomedical Knowledge Graphs for Data Scientists and Bioinformaticians
Biomedical Knowledge Graphs for Data Scientists and Bioinformaticians
Neo4j
 
"$10 thousand per minute of downtime: architecture, queues, streaming and fin...
"$10 thousand per minute of downtime: architecture, queues, streaming and fin..."$10 thousand per minute of downtime: architecture, queues, streaming and fin...
"$10 thousand per minute of downtime: architecture, queues, streaming and fin...
Fwdays
 
Apps Break Data
Apps Break DataApps Break Data
Apps Break Data
Ivo Velitchkov
 
Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |
AstuteBusiness
 
AWS Certified Solutions Architect Associate (SAA-C03)
AWS Certified Solutions Architect Associate (SAA-C03)AWS Certified Solutions Architect Associate (SAA-C03)
AWS Certified Solutions Architect Associate (SAA-C03)
HarpalGohil4
 
Must Know Postgres Extension for DBA and Developer during Migration
Must Know Postgres Extension for DBA and Developer during MigrationMust Know Postgres Extension for DBA and Developer during Migration
Must Know Postgres Extension for DBA and Developer during Migration
Mydbops
 
Lee Barnes - Path to Becoming an Effective Test Automation Engineer.pdf
Lee Barnes - Path to Becoming an Effective Test Automation Engineer.pdfLee Barnes - Path to Becoming an Effective Test Automation Engineer.pdf
Lee Barnes - Path to Becoming an Effective Test Automation Engineer.pdf
leebarnesutopia
 
Y-Combinator seed pitch deck template PP
Y-Combinator seed pitch deck template PPY-Combinator seed pitch deck template PP
Y-Combinator seed pitch deck template PP
c5vrf27qcz
 
Harnessing the Power of NLP and Knowledge Graphs for Opioid Research
Harnessing the Power of NLP and Knowledge Graphs for Opioid ResearchHarnessing the Power of NLP and Knowledge Graphs for Opioid Research
Harnessing the Power of NLP and Knowledge Graphs for Opioid Research
Neo4j
 
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
Jason Yip
 
The Microsoft 365 Migration Tutorial For Beginner.pptx
The Microsoft 365 Migration Tutorial For Beginner.pptxThe Microsoft 365 Migration Tutorial For Beginner.pptx
The Microsoft 365 Migration Tutorial For Beginner.pptx
operationspcvita
 
From Natural Language to Structured Solr Queries using LLMs
From Natural Language to Structured Solr Queries using LLMsFrom Natural Language to Structured Solr Queries using LLMs
From Natural Language to Structured Solr Queries using LLMs
Sease
 
"Scaling RAG Applications to serve millions of users", Kevin Goedecke
"Scaling RAG Applications to serve millions of users",  Kevin Goedecke"Scaling RAG Applications to serve millions of users",  Kevin Goedecke
"Scaling RAG Applications to serve millions of users", Kevin Goedecke
Fwdays
 
Discover the Unseen: Tailored Recommendation of Unwatched Content
Discover the Unseen: Tailored Recommendation of Unwatched ContentDiscover the Unseen: Tailored Recommendation of Unwatched Content
Discover the Unseen: Tailored Recommendation of Unwatched Content
ScyllaDB
 
Getting the Most Out of ScyllaDB Monitoring: ShareChat's Tips
Getting the Most Out of ScyllaDB Monitoring: ShareChat's TipsGetting the Most Out of ScyllaDB Monitoring: ShareChat's Tips
Getting the Most Out of ScyllaDB Monitoring: ShareChat's Tips
ScyllaDB
 
Christine's Supplier Sourcing Presentaion.pptx
Christine's Supplier Sourcing Presentaion.pptxChristine's Supplier Sourcing Presentaion.pptx
Christine's Supplier Sourcing Presentaion.pptx
christinelarrosa
 
ScyllaDB Tablets: Rethinking Replication
ScyllaDB Tablets: Rethinking ReplicationScyllaDB Tablets: Rethinking Replication
ScyllaDB Tablets: Rethinking Replication
ScyllaDB
 
inQuba Webinar Mastering Customer Journey Management with Dr Graham Hill
inQuba Webinar Mastering Customer Journey Management with Dr Graham HillinQuba Webinar Mastering Customer Journey Management with Dr Graham Hill
inQuba Webinar Mastering Customer Journey Management with Dr Graham Hill
LizaNolte
 
Session 1 - Intro to Robotic Process Automation.pdf
Session 1 - Intro to Robotic Process Automation.pdfSession 1 - Intro to Robotic Process Automation.pdf
Session 1 - Intro to Robotic Process Automation.pdf
UiPathCommunity
 
PRODUCT LISTING OPTIMIZATION PRESENTATION.pptx
PRODUCT LISTING OPTIMIZATION PRESENTATION.pptxPRODUCT LISTING OPTIMIZATION PRESENTATION.pptx
PRODUCT LISTING OPTIMIZATION PRESENTATION.pptx
christinelarrosa
 

Recently uploaded (20)

Biomedical Knowledge Graphs for Data Scientists and Bioinformaticians
Biomedical Knowledge Graphs for Data Scientists and BioinformaticiansBiomedical Knowledge Graphs for Data Scientists and Bioinformaticians
Biomedical Knowledge Graphs for Data Scientists and Bioinformaticians
 
"$10 thousand per minute of downtime: architecture, queues, streaming and fin...
"$10 thousand per minute of downtime: architecture, queues, streaming and fin..."$10 thousand per minute of downtime: architecture, queues, streaming and fin...
"$10 thousand per minute of downtime: architecture, queues, streaming and fin...
 
Apps Break Data
Apps Break DataApps Break Data
Apps Break Data
 
Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |
 
AWS Certified Solutions Architect Associate (SAA-C03)
AWS Certified Solutions Architect Associate (SAA-C03)AWS Certified Solutions Architect Associate (SAA-C03)
AWS Certified Solutions Architect Associate (SAA-C03)
 
Must Know Postgres Extension for DBA and Developer during Migration
Must Know Postgres Extension for DBA and Developer during MigrationMust Know Postgres Extension for DBA and Developer during Migration
Must Know Postgres Extension for DBA and Developer during Migration
 
Lee Barnes - Path to Becoming an Effective Test Automation Engineer.pdf
Lee Barnes - Path to Becoming an Effective Test Automation Engineer.pdfLee Barnes - Path to Becoming an Effective Test Automation Engineer.pdf
Lee Barnes - Path to Becoming an Effective Test Automation Engineer.pdf
 
Y-Combinator seed pitch deck template PP
Y-Combinator seed pitch deck template PPY-Combinator seed pitch deck template PP
Y-Combinator seed pitch deck template PP
 
Harnessing the Power of NLP and Knowledge Graphs for Opioid Research
Harnessing the Power of NLP and Knowledge Graphs for Opioid ResearchHarnessing the Power of NLP and Knowledge Graphs for Opioid Research
Harnessing the Power of NLP and Knowledge Graphs for Opioid Research
 
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
 
The Microsoft 365 Migration Tutorial For Beginner.pptx
The Microsoft 365 Migration Tutorial For Beginner.pptxThe Microsoft 365 Migration Tutorial For Beginner.pptx
The Microsoft 365 Migration Tutorial For Beginner.pptx
 
From Natural Language to Structured Solr Queries using LLMs
From Natural Language to Structured Solr Queries using LLMsFrom Natural Language to Structured Solr Queries using LLMs
From Natural Language to Structured Solr Queries using LLMs
 
"Scaling RAG Applications to serve millions of users", Kevin Goedecke
"Scaling RAG Applications to serve millions of users",  Kevin Goedecke"Scaling RAG Applications to serve millions of users",  Kevin Goedecke
"Scaling RAG Applications to serve millions of users", Kevin Goedecke
 
Discover the Unseen: Tailored Recommendation of Unwatched Content
Discover the Unseen: Tailored Recommendation of Unwatched ContentDiscover the Unseen: Tailored Recommendation of Unwatched Content
Discover the Unseen: Tailored Recommendation of Unwatched Content
 
Getting the Most Out of ScyllaDB Monitoring: ShareChat's Tips
Getting the Most Out of ScyllaDB Monitoring: ShareChat's TipsGetting the Most Out of ScyllaDB Monitoring: ShareChat's Tips
Getting the Most Out of ScyllaDB Monitoring: ShareChat's Tips
 
Christine's Supplier Sourcing Presentaion.pptx
Christine's Supplier Sourcing Presentaion.pptxChristine's Supplier Sourcing Presentaion.pptx
Christine's Supplier Sourcing Presentaion.pptx
 
ScyllaDB Tablets: Rethinking Replication
ScyllaDB Tablets: Rethinking ReplicationScyllaDB Tablets: Rethinking Replication
ScyllaDB Tablets: Rethinking Replication
 
inQuba Webinar Mastering Customer Journey Management with Dr Graham Hill
inQuba Webinar Mastering Customer Journey Management with Dr Graham HillinQuba Webinar Mastering Customer Journey Management with Dr Graham Hill
inQuba Webinar Mastering Customer Journey Management with Dr Graham Hill
 
Session 1 - Intro to Robotic Process Automation.pdf
Session 1 - Intro to Robotic Process Automation.pdfSession 1 - Intro to Robotic Process Automation.pdf
Session 1 - Intro to Robotic Process Automation.pdf
 
PRODUCT LISTING OPTIMIZATION PRESENTATION.pptx
PRODUCT LISTING OPTIMIZATION PRESENTATION.pptxPRODUCT LISTING OPTIMIZATION PRESENTATION.pptx
PRODUCT LISTING OPTIMIZATION PRESENTATION.pptx
 

Easy Java Integration Testing with Testcontainers​

  • 1. Easy Java Integration Testing with Testcontainers Simplifying Integration Tests for Enterprise Java Fabio Turizo
  • 3. • Strategic Members of the Eclipse Foundation • Project Management Committee member of Jakarta EE Payara Services Helps Shape the Future of the Industry
  • 4. Integration Testing Basics • A level above basic unit testing • Multiple units come together to be tested • Goal: Expose flaws in interface design • Guarantee platform updates • Test system dependencies
  • 5. Integration Testing - Java • Simple UT frameworks • Junit, TestNG, Spock • Highly dependable of the platform • What about Mocking ? • Good to simulate interactions • Bad for real-time scenarios
  • 6. Integration Testing - Java • “Works in my machine” persists • Lots of challenges for Enterprise Java • Jakarta EE / MicroProfile lack proper tools • Middleware size footprint has reduced a lot! • … But complex environments have lots of dependencies  • What about cloud-native applications?
  • 7. Arquillian Framework • Focus on testing Jakarta EE components • Vendor-agnostic ! • Portable(*) Shrink-wrapped tests • Container-specific adapters need to be written • Added complexity in writing tests
  • 8. Arquillian Sample (JUnit 4.x) @RunWith(Arquillian.class) public class PersonDaoTest { @EJB private PersonDao personDao; @Inject TestData testData; @Deployment public static WebArchive createDeployment() { return ShrinkWrap.create(WebArchive.class, "arquillian-example.war") .addClass(Person.class) .addClass(PersonDao.class) .addAsResource("test-persistence.xml", "META-INF/persistence.xml"); }
  • 9. Arquillian Sample (JUnit 4.x) @Before public void prepareTestData() { testData.prepareForShouldReturnAllPerson(); } @Test public void shouldReturnAllPerson() throws Exception { List<Person> personList = personDao.getAll(); assertNotNull(personList); assertThat(personList.size(), is(1)); assertThat(personList.get(0).getName(), is("John")); assertThat(personList.get(0).getLastName(), is("Malkovich")); }
  • 10. Arquillian Sample (JUnit 4.x) @Dependent public static class TestData { @PersistenceContext private EntityManager entityManager; @Transactional public void prepareForShouldReturnAllPerson() { entityManager.persist(new Person("John", "Malkovich")); } } }
  • 11. Some Gaps to be Filled  • Test issues: • Assemble a *part of the application* to test it • This includes code and resources • The persistence layer is tested, but not the store • No way to test different configurations • Sadly, not a real-world test
  • 12. Enter Testcontainers! • Lightweight unit testing • Based on Docker containers • Ease up networking setup • Data access layer tests support • Fully* portable integration tests!
  • 13. Testcontainers Benefits • Effective black-box testing • Tests are user-focused • Run UA testing with little overhead • Possible to audit security standards • Identify flaws in specific technologies
  • 14. Testcontainers Requirements • Docker (only Linux containers, though) • Test Frameworks • Junit 4 • Junit 5 • Spock • Maven/Gradle Dependencies
  • 15. Getting Started – JUnit5 <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.8.1</version> <scope>test</scope> </dependency>
  • 16. Getting Started – TC + JUnit5 <dependency> <groupId>org.testcontainers</groupId> <artifactId>testcontainers</artifactId> <version>1.17.3</version> <scope>test</scope> </dependency> <dependency> <groupId>org.testcontainers</groupId> <artifactId>junit-jupiter</artifactId> <version>1.17.3</version> <scope>test</scope> </dependency>
  • 17. Testcontainer Setup @TestContainers public class BasicApplicationTest{ @Container GenericContainer myappContainer = new GenericContainer(DockerImageName.parse(“fturizo/myapp")) .withExposedPorts(8080, 9009, 28080) .withCommand(“./deploy-application.sh”); @Test public void test_running(){ assert(isTrue(myappcontainer.isRunning())); } }
  • 18. Container Access - Boundary @Test public void test_application(){ String url = String.format(“http://%s:%s/%s”, myappContainer.getHost(), myappContainer.getMappedPort(8080), “/myapp”); int status = http.get(url).response().status(); //Careful! assertEquals(status, 200); }
  • 19. Waiting for Readiness - HTTP @TestContainers public class BasicApplicationTest{ @Container GenericContainer myappContainer = new GenericContainer(DockerImageName.parse(“fturizo/myapp")) .withExposedPorts(8080, 9009, 28080) .waitingFor(Wait.forHttp(“/myapp/ready”) .forStatusCode(200)); }
  • 20. Waiting for Readiness – Log Message @TestContainers public class BasicApplicationTest{ @Container GenericContainer myappContainer = new GenericContainer(DockerImageName.parse(“fturizo/myapp")) .withExposedPorts(8080, 9009, 28080) .waitingFor(Wait.forLogMessage(“.*Application is ready.*”); }
  • 21. Dependency Configuration (1) Network network = Network.newNetwork(); @Container GenericContainer dbContainer = new GenericContainer(DockerImageName.parse(“mysql:8.0")) .withEnv(“MYSQL_ROOT_PASSWORD”, “rootPass”) .withEnv(“MYSQL_USER”, “test”) .withEnv(“MYSQL_PASSWORD”, “test”) .withEnv(“MYSQL_DATABASE”, “testDB”) .withNetwork(network) .withNetworkAlias(“mysql_db”);
  • 22. Dependency Configuration (2) @Container GenericContainer appContainer = new GenericContainer(DockerImageName.parse(“fturizo/myapp")) .withEnv(“DB_SERVER”, “mysql_db”) .withEnv(“DB_USER”, “test”) .withEnv(“DB_PASSWORD”, “test”) .withEnv(“DB_NAME”, “testDB”) .withNetwork(network) .dependsOn(dbContainer) …
  • 23. Database Support • Special objects for wrapped containers • Popular market choices for: • Relational: MySQL, MariaDB, OracleXE, DB2, Postgres • NoSQL: Couchbase, MongoDB, Neo4J, Cassandra, OrientDB • Easy instantiation and integration
  • 25. MySQL Testcontainer (1) @Container MySQLContainer mysqlContainer = new MySQLContainer<>(DockerImageName.parse(“mysql:8.0”)) .withNetwork(network) .withNetworkAliases(“mysql_db”);
  • 26. MySQL Testcontainer (2) @Container GenericContainer appContainer = new GenericContainer(DockerImageName.parse(“fturizo/myapp")) .withEnv(“DB_SERVER”, “mysql_db”) .withEnv(“DB_USER”, mysqlContainer.getUser()) .withEnv(“DB_PASSWORD”, mysqlContainer.getPassword()) .withEnv(“DB_NAME”, mysqlContainer.getDatabaseName()) .withNetwork(network) .dependsOn(mysqlContainer) …
  • 27. MySQL Testcontainer (3) String query = "select * from …”; try(Connection connection = DriverManager.getConnection(mysqlContainer.getJdbcUrl(), mysqlContainer.getUsername(), mysqlContainer.getPassword()); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(query))){ while(resultSet.next()) { assertThat(resultSet.get(0), isEqual(“XYZ”)); } } catch (SQLException e) { assert false; }
  • 28. More Features! • Docker Compose is supported, too: DockerComposeContainer environment = new DockerComposeContainer(new File(“src/test/compose.yaml”)) .withExposedService(“mysql_1”, 3306) .withExposedService(“myapp_1”, 8080);
  • 29. More Features ! • Container support for popular solutions: • ElasticSearch (Distributed Search) • Apache Kafka (Distributed Messaging) • RabbitMQ (JMS) • Solr (Text Search) • Nginx (Loadbalancing)
  • 30. Testcontainers Caveats • Docker adds an extra layer of processing • More resources needed for full coverage • Test time will increase overall! • Middleware must be prepared for Docker* • And so are its dependencies! • Black-box testing is not suited for all software
  • 31. Testcontainers Cloud • Outsource your integration tests! • https://www.testcontainers.cloud/
  • 33. In Summary • Testcontainers: • Ease up writing tests • Simplify dependency management • Allow real-world testing • Make true portability a priority • Gives Enterprise Java a vendor-agnostic testing framework
  • 34. Please visit us at: payara.fish/join-us