SlideShare a Scribd company logo
1 of 50
Download to read offline
Take Control of your
Integration Testing with
TestContainers
Naresha K
@naresha_k

https://blog.nareshak.com/
About me
Developer, Architect &
Tech Excellence Coach
Founder & Organiser
Bangalore Groovy User
Group
Integration Testing?
Infrastructure as Code
Infrastructure as Code
Infrastructure as Code
Immutable Infrastructure
TestContainers
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.2'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.2'
runtimeOnly 'mysql:mysql-connector-java:8.0.22'
testImplementation "org.testcontainers:junit-jupiter:1.15.1"
testCompile "org.testcontainers:mysql:1.15.1"
build.gradle dependencies
@Testcontainers
public class SampleMySqlTest {
@Container
private MySQLContainer mySQLContainer = new
MySQLContainer(DockerImageName.parse("mysql:8"))
.withDatabaseName("foo")
.withUsername("foo")
.withPassword("secret");
@Test
void test1() {
// invoke SUT && assert
assertTrue(mySQLContainer.isRunning());
}
@Test
void test2() {
// invoke SUT && assert
assertTrue(mySQLContainer.isRunning());
}
}
@Testcontainers
public class SampleMySqlTest {
@Container
private MySQLContainer mySQLContainer = new
MySQLContainer(DockerImageName.parse("mysql:8"))
.withDatabaseName("foo")
.withUsername("foo")
.withPassword("secret");
@Test
void test1() {
// invoke SUT && assert
assertTrue(mySQLContainer.isRunning());
}
@Test
void test2() {
// invoke SUT && assert
assertTrue(mySQLContainer.isRunning());
}
}
@Testcontainers
@Container
@Testcontainers
public class SampleMySqlTest {
@Container
private static MySQLContainer mySQLContainer = new
MySQLContainer(DockerImageName.parse("mysql:8"))
.withDatabaseName("foo")
.withUsername("foo")
.withPassword("secret");
@Test
void test1() {
// invoke SUT && assert
assertTrue(mySQLContainer.isRunning());
}
@Test
void test2() {
// invoke SUT && assert
assertTrue(mySQLContainer.isRunning());
}
}
@Testcontainers
public class MySqlTest {
@Container
protected static final MySQLContainer mySQLContainer;
static {
mySQLContainer = new
MySQLContainer(DockerImageName.parse("mysql:8"))
.withDatabaseName("foo")
.withUsername("foo")
.withPassword("secret");
mySQLContainer.start();
}
}
@Testcontainers
public class MySqlTestSuite1 extends MySqlTest {
@Test
void test1() {
assertTrue(mySQLContainer.isRunning());
}
@Test
void test2() {
assertTrue(mySQLContainer.isRunning());
}
}
Case Study #1
@Transactional
class ConferenceService {
def getConferencesInCities(List<String> cities) {
Conference.where {
city in cities
}.list()
}
}
select
this_.id as id1_0_0_, 

this_.version as version2_0_0_, 

this_.name as name3_0_0_, 

this_.city as city4_0_0_
from conference this_
where this_.city in ()
hibernate:
cache:
queries: false
use_second_level_cache: false
use_query_cache: false
dataSource:
pooled: true
jmxExport: true
driverClassName: org.h2.Driver
username: sa
password: ''
logSql: true
environments:
development:
dataSource:
dbCreate: create-drop
url: jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
test:
dataSource:
dbCreate: update
url: jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
Application.yml (Test with H2)
dataSource:
pooled: true
jmxExport: true
driverClassName: com.mysql.jdbc.Driver
username: root
password: secret
logSql: true
environments:
development:
dataSource:
dbCreate: create-drop
url: jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
test:
dataSource:
dbCreate: update
url: jdbc:mysql://localhost:3306/testapp
Application.yml (Test with MySQL)
testCompile platform('org.testcontainers:testcontainers-bom:1.12.5')
testCompile 'org.testcontainers:spock'
testCompile 'org.testcontainers:mysql'
build.gradle
dataSource:
pooled: true
jmxExport: true
driverClassName: org.testcontainers.jdbc.ContainerDatabaseDriver
logSql: true
environments:
test:
dataSource:
dbCreate: update
url: jdbc:tc:mysql:8://somehostname:someport/databasename
Application.yml (Test with TestContainers)
@Integration
@Rollback
@Testcontainers
class ConferenceTestContainerSpec extends Specification {
@Shared
MySQLContainer mySQLContainer = new MySQLContainer(
DockerImageName.parse("mysql:8"))
.withDatabaseName("testapp")
.withUsername("user")
.withPassword("secret")
ConferenceService conferenceService
void "should return empty list"() {
given:
List<String> cities = []
when:
List<Conference> conferences =
conferenceService.getConferencesInCities(cities)
then:
conferences.size() == 0
}
@Integration
@Rollback
@Testcontainers
class ConferenceTestContainerSpec extends Specification {
@Shared
MySQLContainer mySQLContainer = new MySQLContainer()
.withDatabaseName("testapp")
.withUsername("user")
.withPassword("secret")
ConferenceService conferenceService
void "should return empty list"() {
// test code
}
}
dataSource:
driverClassName: org.testcontainers.jdbc.ContainerDatabaseDriver
environments:
test:
dataSource:
dbCreate: update
url: jdbc:tc:mysql:8://somehostname:someport/databasename
Case Study #2
testCompile platform('org.testcontainers:testcontainers-bom:1.15.1')
testCompile 'org.testcontainers:spock'
testCompile 'org.testcontainers:mysql'
testCompile "org.testcontainers:localstack"
build.gradle
@Integration
@Testcontainers
class FileStorageSpec extends Specification {
public static final String TARGET_BUCKET = "testbucket"
AmazonS3Service amazonS3Service
FileStorageService fileStorageService
@Shared
public LocalStackContainer localstack = new LocalStackContainer(
DockerImageName.parse("localstack/localstack:0.11.2"))
.withServices(S3)
void setup() {
AmazonS3 s3 = AmazonS3ClientBuilder
.standard()
.withEndpointConfiguration(
localstack.getEndpointConfiguration(S3))
.withCredentials(
localstack.getDefaultCredentialsProvider())
.build();
amazonS3Service.client = s3
amazonS3Service.createBucket(TARGET_BUCKET)
}
def "file can be stored in s3 storage and read"() {
given:
def filePath = Paths.get("src/test/resources/car.jpg")
InputStream stream = Files.newInputStream(filePath)
when:
fileStorageService.storeFile(TARGET_BUCKET, "vehicles/123.jpg", stream)
then:
amazonS3Service.exists(TARGET_BUCKET, "vehicles/123.jpg")
when:
File file = fileStorageService.readFile(TARGET_BUCKET, "vehicles/123.jpg",
Files.createTempFile(null, null).toAbsolutePath().toString())
then:
file
and:
file.newInputStream().bytes == filePath.bytes
}
https://www.testcontainers.org/modules/databases/
https://www.testcontainers.org/modules/localstack/
@Testcontainers
public class GenericContainerTest {
@Container
private static GenericContainer<?> redis =
new GenericContainer<>(
DockerImageName.parse("redis:6"))
.withExposedPorts(6379);
@Test
void testRedisOps() {
assertTrue(redis.isRunning());
}
}
@Testcontainers
public class GenericContainerTest {
@Container
private static GenericContainer<?> redis =
new GenericContainer<>(
DockerImageName.parse("redis:6"))
.withExposedPorts(6379);
@Test
void testRedisOps() {
assertTrue(redis.isRunning());
}
}
//get host port
redis.getMappedPort(6379)
@Container
private static GenericContainer<?> tomcat = new
GenericContainer<>(
DockerImageName.parse("tomcat:8.5.8-jre8"))
.withExposedPorts(8080);
@Container
private static GenericContainer<?> tomcat = new
GenericContainer<>(
DockerImageName.parse("tomcat:8.5.8-jre8"))
.withExposedPorts(8080)
.withStartupTimeout(Duration.ofMinutes(2));
@Container
private static GenericContainer<?> tomcat = new
GenericContainer<>(
DockerImageName.parse("tomcat:8.5.8-jre8"))
.withExposedPorts(8080)
.waitingFor(Wait.forHttp("/"));
@Container
private static GenericContainer<?> tomcat = new
GenericContainer<>(
DockerImageName.parse("tomcat:8.5.8-jre8"))
.withExposedPorts(8080)
.waitingFor(Wait.forHttp("/")
.forStatusCode(200));
https://www.testcontainers.org/features/startup_and_waits/
web:
image: "tomcat:8.5.50-jdk8-adoptopenjdk-hotspot"
ports:
- "8080:8080"
redis:
image: "redis:6"
docker-compose.yml
@Container
private DockerComposeContainer<?> container = new
DockerComposeContainer<>(
new File("src/test/resources/docker-compose.yml"))
.withExposedService("web_1", 8080)
.withExposedService("redis_1", 6379);
Integration Tests
are not replacements for
Unit Tests
References
https://github.com/naresha/java2days2020testcontainers
https://www.testcontainers.org/
https://www2.slideshare.net/nareshak
Thank You

More Related Content

What's hot

Automated Python Test Frameworks for Hardware Verification and Validation
Automated Python Test Frameworks for Hardware Verification and ValidationAutomated Python Test Frameworks for Hardware Verification and Validation
Automated Python Test Frameworks for Hardware Verification and Validation
Barbara Jones
 

What's hot (9)

Ch5 v70 cfc_en
Ch5 v70 cfc_enCh5 v70 cfc_en
Ch5 v70 cfc_en
 
DEXCS2022 for preCICE
DEXCS2022 for preCICEDEXCS2022 for preCICE
DEXCS2022 for preCICE
 
IBM Ported Tools for z/OS: Supplementary Toolkit for z/OS Feature User's Guid...
IBM Ported Tools for z/OS: Supplementary Toolkit for z/OS Feature User's Guid...IBM Ported Tools for z/OS: Supplementary Toolkit for z/OS Feature User's Guid...
IBM Ported Tools for z/OS: Supplementary Toolkit for z/OS Feature User's Guid...
 
DEXCS2022OF_Install.pdf
DEXCS2022OF_Install.pdfDEXCS2022OF_Install.pdf
DEXCS2022OF_Install.pdf
 
Automated Python Test Frameworks for Hardware Verification and Validation
Automated Python Test Frameworks for Hardware Verification and ValidationAutomated Python Test Frameworks for Hardware Verification and Validation
Automated Python Test Frameworks for Hardware Verification and Validation
 
Ch3 v70 project_structure_en
Ch3 v70 project_structure_enCh3 v70 project_structure_en
Ch3 v70 project_structure_en
 
SIMATIC S7-1200: Easily adapted to suit your needs easy book en-us
SIMATIC S7-1200: Easily adapted to suit your needs easy book en-usSIMATIC S7-1200: Easily adapted to suit your needs easy book en-us
SIMATIC S7-1200: Easily adapted to suit your needs easy book en-us
 
USENIX LISA11 Tutorial: ZFS a
USENIX LISA11 Tutorial: ZFS a USENIX LISA11 Tutorial: ZFS a
USENIX LISA11 Tutorial: ZFS a
 
G120 cu250 s2_kba1_0414_eng_en-us
G120 cu250 s2_kba1_0414_eng_en-usG120 cu250 s2_kba1_0414_eng_en-us
G120 cu250 s2_kba1_0414_eng_en-us
 

Similar to Take Control of your Integration Testing with TestContainers

Rediscovering Spring with Spring Boot(1)
Rediscovering Spring with Spring Boot(1)Rediscovering Spring with Spring Boot(1)
Rediscovering Spring with Spring Boot(1)
Gunith Devasurendra
 
Nuxeo - OpenSocial
Nuxeo - OpenSocialNuxeo - OpenSocial
Nuxeo - OpenSocial
Thomas Roger
 

Similar to Take Control of your Integration Testing with TestContainers (20)

Test Automation for NoSQL Databases
Test Automation for NoSQL DatabasesTest Automation for NoSQL Databases
Test Automation for NoSQL Databases
 
Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!
 
Divide and Conquer – Microservices with Node.js
Divide and Conquer – Microservices with Node.jsDivide and Conquer – Microservices with Node.js
Divide and Conquer – Microservices with Node.js
 
Testing your application on Google App Engine
Testing your application on Google App EngineTesting your application on Google App Engine
Testing your application on Google App Engine
 
Testing Your Application On Google App Engine
Testing Your Application On Google App EngineTesting Your Application On Google App Engine
Testing Your Application On Google App Engine
 
Web UI test automation instruments
Web UI test automation instrumentsWeb UI test automation instruments
Web UI test automation instruments
 
GeeCON 2017 - TestContainers. Integration testing without the hassle
GeeCON 2017 - TestContainers. Integration testing without the hassleGeeCON 2017 - TestContainers. Integration testing without the hassle
GeeCON 2017 - TestContainers. Integration testing without the hassle
 
using Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API'susing Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API's
 
Integration testing for microservices with Spring Boot
Integration testing for microservices with Spring BootIntegration testing for microservices with Spring Boot
Integration testing for microservices with Spring Boot
 
In the Brain of Hans Dockter: Gradle
In the Brain of Hans Dockter: GradleIn the Brain of Hans Dockter: Gradle
In the Brain of Hans Dockter: Gradle
 
Designing REST API automation tests in Kotlin
Designing REST API automation tests in KotlinDesigning REST API automation tests in Kotlin
Designing REST API automation tests in Kotlin
 
Rediscovering Spring with Spring Boot(1)
Rediscovering Spring with Spring Boot(1)Rediscovering Spring with Spring Boot(1)
Rediscovering Spring with Spring Boot(1)
 
Gradle
GradleGradle
Gradle
 
Integration Testing With ScalaTest and MongoDB
Integration Testing With ScalaTest and MongoDBIntegration Testing With ScalaTest and MongoDB
Integration Testing With ScalaTest and MongoDB
 
Spring and Cloud Foundry; a Marriage Made in Heaven
Spring and Cloud Foundry; a Marriage Made in HeavenSpring and Cloud Foundry; a Marriage Made in Heaven
Spring and Cloud Foundry; a Marriage Made in Heaven
 
Deploying windows containers with kubernetes
Deploying windows containers with kubernetesDeploying windows containers with kubernetes
Deploying windows containers with kubernetes
 
Antons Kranga Building Agile Infrastructures
Antons Kranga   Building Agile InfrastructuresAntons Kranga   Building Agile Infrastructures
Antons Kranga Building Agile Infrastructures
 
Efficient JavaScript Unit Testing, May 2012
Efficient JavaScript Unit Testing, May 2012Efficient JavaScript Unit Testing, May 2012
Efficient JavaScript Unit Testing, May 2012
 
Nuxeo - OpenSocial
Nuxeo - OpenSocialNuxeo - OpenSocial
Nuxeo - OpenSocial
 
Gradle 2.2, 2.3 news #jggug
Gradle 2.2, 2.3 news #jggugGradle 2.2, 2.3 news #jggug
Gradle 2.2, 2.3 news #jggug
 

More from Naresha K

More from Naresha K (20)

The Groovy Way of Testing with Spock
The Groovy Way of Testing with SpockThe Groovy Way of Testing with Spock
The Groovy Way of Testing with Spock
 
Evolving with Java - How to Remain Effective
Evolving with Java - How to Remain EffectiveEvolving with Java - How to Remain Effective
Evolving with Java - How to Remain Effective
 
Implementing Resilience with Micronaut
Implementing Resilience with MicronautImplementing Resilience with Micronaut
Implementing Resilience with Micronaut
 
Take Control of your Integration Testing with TestContainers
Take Control of your Integration Testing with TestContainersTake Control of your Integration Testing with TestContainers
Take Control of your Integration Testing with TestContainers
 
Favouring Composition - The Groovy Way
Favouring Composition - The Groovy WayFavouring Composition - The Groovy Way
Favouring Composition - The Groovy Way
 
Effective Java with Groovy - How Language Influences Adoption of Good Practices
Effective Java with Groovy - How Language Influences Adoption of Good PracticesEffective Java with Groovy - How Language Influences Adoption of Good Practices
Effective Java with Groovy - How Language Influences Adoption of Good Practices
 
What's in Groovy for Functional Programming
What's in Groovy for Functional ProgrammingWhat's in Groovy for Functional Programming
What's in Groovy for Functional Programming
 
Effective Java with Groovy & Kotlin - How Languages Influence Adoption of Goo...
Effective Java with Groovy & Kotlin - How Languages Influence Adoption of Goo...Effective Java with Groovy & Kotlin - How Languages Influence Adoption of Goo...
Effective Java with Groovy & Kotlin - How Languages Influence Adoption of Goo...
 
Effective Java with Groovy & Kotlin How Languages Influence Adoption of Good ...
Effective Java with Groovy & Kotlin How Languages Influence Adoption of Good ...Effective Java with Groovy & Kotlin How Languages Influence Adoption of Good ...
Effective Java with Groovy & Kotlin How Languages Influence Adoption of Good ...
 
Eclipse Collections, Java Streams & Vavr - What's in them for Functional Pro...
Eclipse Collections, Java Streams & Vavr - What's in them for  Functional Pro...Eclipse Collections, Java Streams & Vavr - What's in them for  Functional Pro...
Eclipse Collections, Java Streams & Vavr - What's in them for Functional Pro...
 
Implementing Cloud-Native Architectural Patterns with Micronaut
Implementing Cloud-Native Architectural Patterns with MicronautImplementing Cloud-Native Architectural Patterns with Micronaut
Implementing Cloud-Native Architectural Patterns with Micronaut
 
Groovy - Why and Where?
Groovy  - Why and Where?Groovy  - Why and Where?
Groovy - Why and Where?
 
Leveraging Micronaut on AWS Lambda
Leveraging Micronaut on AWS LambdaLeveraging Micronaut on AWS Lambda
Leveraging Micronaut on AWS Lambda
 
Groovy Refactoring Patterns
Groovy Refactoring PatternsGroovy Refactoring Patterns
Groovy Refactoring Patterns
 
Implementing Cloud-native Architectural Patterns with Micronaut
Implementing Cloud-native Architectural Patterns with MicronautImplementing Cloud-native Architectural Patterns with Micronaut
Implementing Cloud-native Architectural Patterns with Micronaut
 
Effective Java with Groovy
Effective Java with GroovyEffective Java with Groovy
Effective Java with Groovy
 
Evolving with Java - How to remain Relevant and Effective
Evolving with Java - How to remain Relevant and EffectiveEvolving with Java - How to remain Relevant and Effective
Evolving with Java - How to remain Relevant and Effective
 
Effective Java with Groovy - How Language can Influence Good Practices
Effective Java with Groovy - How Language can Influence Good PracticesEffective Java with Groovy - How Language can Influence Good Practices
Effective Java with Groovy - How Language can Influence Good Practices
 
Beyond Lambdas & Streams - Functional Fluency in Java
Beyond Lambdas & Streams - Functional Fluency in JavaBeyond Lambdas & Streams - Functional Fluency in Java
Beyond Lambdas & Streams - Functional Fluency in Java
 
GORM - The polyglot data access toolkit
GORM - The polyglot data access toolkitGORM - The polyglot data access toolkit
GORM - The polyglot data access toolkit
 

Recently uploaded

+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
Health
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
VishalKumarJha10
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
mohitmore19
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
VictorSzoltysek
 

Recently uploaded (20)

Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
10 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 202410 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 2024
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTV
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 

Take Control of your Integration Testing with TestContainers