Oleg Šelajev

Oleg Šelajev

Testcontainers, AI, & Developer relations at Docker.


Oleg Šelajev is a developer advocate at Docker working mainly on developer productivity, Testcontainers, and improving how we set up local development environments and tests. Developer. Author. Speaker. Java Champion. Docker captain.
Loves all languages.


Area of Expertise

  • Information & Communications Technology


  • Tests
  • Docker
  • Containers
  • Cloud Native
  • testcontainers
  • DevOps
  • Java & JVM
  • GenAI
  • LLMs
  • Artificial Intelligence

Smooth Sailing in the Cloud-Native Storm: Tools for better confidence in microservices development

Starting with cloud-native app may represent a steep learning curve! It’s not only a matter of architecture or technology but also a paradigm shift on developer experience and workflow. Even before writing code, configuring your entire test environment might be intimidating! And after that you still have to figure out how to validate your microservices with great confidence to release them independently!

In this session, we’ll present tools to ease your life when setting up your development environment and testing with databases, middlewares, cloud services and your regular business services and API! Considering the diversity of styles and protocols - REST, gRPC, GraphQL, Async - and cloud-native stacks - this latter is not an easy task.

This session provides hands-on experience on: how to equip your team with a consistent and polyglot approach. And how to let them develop locally, but providing confidence with a unified policy between the inner and the outer loops.

Developer productivity for GenAI apps

The GenAI landscape has grown a ton in the last year with many technologies and approaches that application developers must master to include AI in their end-user and enterprise apps. However, more focus must be put into enabling standard software development workflows: testing, ensuring RAG correctness and efficiency, local development environment and CI setups, and security of LLM artifacts.
In this session, we look at how application developers can integration test their GenAI apps with local models, augmented with RAG both locally and in CI. You'll learn how the setups for GenAI apps in the inner development loop can be programmatically managed and how new tools can get into typical software development workflows without impairing developer productivity.

Simplified Inner and Outer cloud native developer loops

Despite the quality of modern cloud-native tools, the user experience for inner and outer developer loops are still radically different, which introduces friction and hampers developer productivity.

Development setups are app-centric, while production environments deal with deployments and tools required for operations teams to keep applications running. This session explores tools to simplify both side and improve developer productivity through a platform engineering and polyglot approach using a toolchain that:
Gives developers a standard set of app-level APIs to solve common distributed app challenges, using Dapr.
Equips developers and product teams with consistent, polyglot feature flags through OpenFeature.
Facilitates easy local development, outside of a Kubernetes cluster, with Testcontainers.

Attendees will walk away with a working demo showcasing a straightforward, lightweight and effective inner and outer dev loop, ensuring the seamless promotion of apps from dev to prod.

Velocity and happiness via tests

Flow state, cognitive load, and speed of feedback loops are three core dimensions of developer experience. Taken together, they encapsulate almost all friction encountered in the development process.

However, these can be hard to measure and sometimes straightforward to improve.

In this session, we show how tests, the test suites' quality, and running test experience cover all three core dimensions and enable high-performing teams.

We look at anti-patterns for tests and how they drastically increase the cognitive load required even for the most straightforward changes and slow down feedback loops.
Then we show how modern high-quality test setups ensure developer productivity and happiness and drive team velocity up and to the right.

Below is the small print and not part of the abstract:

Some useful materials:
* https://www.infoq.com/presentations/thoughtworks-high-performance-teams/
* https://martinfowler.com/articles/developer-effectiveness.html
* https://queue.acm.org/detail.cfm?id=3595878

We'll show testcontainers based setups for test -- ensuring environment parity, ease of running individual tests, flexibility of configuration, debuggability of the tests; talk about performance improvements to test suites, how higher level integration tests aren't too tied to implementation details allowing easier changes, and how they give a lot of confidence without requiring too much maintenance.

Libraries that make tests bring joy!

Tests are essential to developer productivity, but without proper care, they quickly stop being a fun way to know if the code is working and become a chore!

The best way to avoid this pitiful situation is to use libraries that simplify everyday tasks making working with tests a joy!

In this session, we'll look at a collection of libraries making tests enjoyable. Libraries that take care of the chores from environment setup, to generating test data, to working with asynchronous events without the silliness of timeouts, to fluently working with network queries, to mocking whole services like a pro!

Join us for a quick and fun overview of what libraries you should add to your projects and how they all combine to make tests bring joy!

JUnit 5 advanced features, awaitility, restassured, testcontainers
Working with data: instancio, synthesized tdk, wisser/jailer
Pi-test for mutation tests

Making your own Testcontainers module for fun and profit!

Testcontainers libraries are a de-facto standard for integration testing in the Java community. One of the reasons for its popularity is the ecosystem of the modules -- pre-defined abstractions for creating containerized services for your tests in a single line of code.

Testcontainers modules help to integrate with new technologies, hide setup complexity behind a neat abstraction, or use in-house Docker images without using lower-level API all the time.

In this lab, we'll go over the architecture of a module, see how one can implement it, and make a small but helpful module ourselves.

Whether you're working on a database technology, want to implement chaos engineering practices, or improve your team's productivity, creating a Testcontainers module is an excellent way to abstract away some of the complexity of your integration tests and contribute to the Java ecosystem.

Making a Testcontainers module can be a great exercise -- either adding a more complex topology (adding a chaos engineering proxy and hiding it behind an abstraction, supporting your in-house docker images, or a new technology -- all these are great use cases and you can contribute to the Java ecosystem in a nice standalone way (without taking on yourself a ton of responsibility for maintaining the project forever).

Testing cloud-native applications with ease!

Many applications rely on cloud solutions like AWS, Azure, and GCP. Testing such applications could be a nightmare of spare cloud accounts or never-ending environment setups.

Thanks to Testcontainers, we can run all the necessary services locally and even more programmatically control their configuration and lifecycle! It means you can improve your development feedback loop locally and test your cloud-native applications without spending a penny.

In this demo-heavy session, we’ll go over typical use cases cloud-native app developers struggle to test effectively, and look at how Testcontainers features enable working with S3, DynamoDB, Lambdas, Google Spanner, and others. Testing your cloud-native applications with Localstack and GCloud modules has never been this easy and reliable.

Quarkus & Testcontainers: Perfect Synergy for Cloud-Native Development!

Applications today don't exist in a vacuum. They typically communicate with other services, such as databases, message brokers, cache servers, and more. These interconnectivity requirements make it hard to do local/inner-loop development and testing efficiently, often forcing developers to write lots of code and configuration that never gets to production.

What if there was a better way? What if you didn’t need to write any extra code or configuration and things just worked out of the box, making your life simpler and easier?

This session will introduce Testcontainers and explore the synergy between Testcontainers and Quarkus, showcasing all the integration that has been done for you, the developer, so that you don’t need to worry about anything!

We did this session with Eric Deansdrea (Red Hat), and it turned out pretty well: https://www.youtube.com/watch?v=x44dL5jzaG4

Learning GenAI/LLM programming with langchain4j and Testcontainers

GenAI and LLMs are currently a big hype topic within the IT industry and beyond. And while we should always be critical about “The next big thing” style hype waves, we also need to stay curious and make up our own mind. And how to better understand a technology as a developer, than by using it in practice?

In this talk, we want to look at how to use langchain4j, the Open-Source Java variant of the popular LLM framework langchain, together with Ollama as a local LLM model runtime, to create a local development experience for building GenAI applications. And to top things off, we will utilize Testcontainers’ infrastructure-as-code capabilities to set up this LLM development environment on demand and without requiring manual fiddling around.

Adding GenAI to modern application development

Whether you're a big believer or skeptical of them, GenAI technologies can offer massive help to your end-users, so as an application developer, you need to know how to navigate the AI landscape and properly develop GenAI apps.
The latter is often an afterthought since new approaches don't focus on basic software development cycle needs, such as testing, security, and local development environment setup.
In this session, we look at the modern application development process and how to add GenAI to your regular application stack.
You'll learn how Langchain projects work with different LLMs, how to enrich your app with RAG patterns without sacrificing developer experience, how to test the LLM-based setups locally and in CI, and how to preserve your productivity in the inner loop development despite adding GenAI.

Oleg Šelajev

Testcontainers, AI, & Developer relations at Docker.


Please note that Sessionize is not responsible for the accuracy or validity of the data provided by speakers. If you suspect this profile to be fake or spam, please let us know.

Jump to top