티스토리 수익 글 보기
The Seven Deadly Sins of Test Automation
I’ve spent a significant part of my career building and maintaining test automation suites, and I’ve learned one thing for certain: a test suite that isn’t trusted is worse than no test suite at all. We’ve all felt that familiar dread of a CI/CD pipeline that’s constantly red, where the team spends more time debugging flaky tests than shipping features. If you’re a test automation engineer or a developer feeling the pressure of a complex and fragile test suite, this post is for you. It’s a confession, a guide, and a collection of hard-won lessons I’ve learned throughout my career on how to pull our test suites back from the brink.
Transactions Aren’t Enough: The Need For End-To-End Thinking
Even the strongest safety properties implemented in today’s top databases are not enough to prevent data loss or corruption in all scenarios. We have learned to rely on mechanisms such as serializable ACID transactions, but they are not bulletproof. Let’s explore some issues that can come up when we no longer focus just on the database’s perspective, but zoom out and consider our entire system.
Quickstart: Run an MCP Server on JVM and Integrate with Copilot
Are you looking for a way to extend the capabilities of LLMs with your own tools? Wondering how to run an MCP (Model Context Protocol) server on the JVM and make it available directly in Copilot? Curious about how to expose custom business logic to AI models using the latest Spring AI features? If you want to see how to quickly set up such an integration and test it locally, this guide is for you.
AI Between Progress and Responsibility – 3 Lessons from the World AI Summit
Disclaimer: Written by Human Intelligence. Human Intelligence can make mistakes, including about people, so double-check it.
Test-Driven Christmas — A Guide to the Advent of Code Mastery
It’s 6:00 AM on a dark, cold December morning. For many, the only motivation is the first cup of coffee. For me, it’s the quiet, thrilling anticipation of a gift about to arrive. My screen glows in the dark, not with work emails, but with the day’s new puzzle from the Advent of Code. As a Senior Test Automation Engineer, my career is built on a foundation of structure, quality, and a healthy obsession with finding flaws before they become problems. As a Christmas enthusiast, I believe the season is about joy, tradition, and persistence. Most people would see these two worlds as separate. I discovered they are the secret ingredients to a top-10 finish in the world’s most beloved coding challenge. My 7th place finish in 2024 wasn’t a holiday miracle — it was the result of a “Test-Driven Christmas”, a methodology that fuses professional discipline with festive passion. This guide will break down that approach and show you how a tester’s mindset can help you master the daily puzzles and embrace the true spirit of the event.
From complexity to simplicity: How to write integrations with external services
Integration with external services, regardless of their type, is the backbone of modern microservices architecture. The era of huge monolithic applications with a single database is over. Today, implementing even a small business process requires cooperation with other services.
Unit testing revisited
Have you ever found yourself in a situation where a small change in the code breaks tests in a completely different, seemingly unrelated part of the system? Or maybe you‘ve inherited a test suite that is slow, hard to read, and nobody wants to touch it? At Allegro, we believe that good tests are the foundation of high-quality software. In this article, we’d like to share some practices that help us write tests that are not a burden, but a real asset.
Taming AI Chaos: A Structured Agent Workflow for Predictable Coding
I once spent an hour debugging AI-generated code that insisted on using a method that hadn’t existed in a library for three years. Like many developers, I’ve been on a rollercoaster with AI coding assistants. One moment they generate flawless code; the next, they’re confidently hallucinating. After many trials, I’ve landed on a structured workflow that brings predictability and power back to the developer. This isn’t about finding one “perfect prompt.” It’s about creating a universal, repeatable process that uses specialized AI agents to guide collaboration. The goal is to augment your skills and let you focus on architecture, not just have the AI write code for you.
JavaZone 2025 report
This is a summary of the JavaZone 2025 conference I attended in early September. It’s a conference focused on developers that I enjoyed and highly recommend.
How the Garbage Collector Works in Go and How It Affects Your Programs
Have you ever wondered what happens with the variables you define in your Golang (Go) programs? Do they exist forever, or are they recycled at some point? Where do they live in memory and how are they managed?
Popular Gradle mistakes (and how to avoid them) – part 3
In the previous post – part 2, we covered more common Gradle mistakes and how to fix them. In the last part of this triplet, we will share our favorite Gradle plugins that can help you avoid some of the mistakes we discussed in the previous posts!
How to call a REST API in integration tests
Have you ever struggled to identify which REST API is being tested in your integration tests? In this article, you’ll learn a clean and readable way to call REST APIs within your integration tests. The goal is to make the WHEN section of the test clearly show which API is called and in what context, while hiding all technical details.
Unlock faster data processing for Machine Learning: reducing pivoting time from hours to minutes
Training Machine Learning models on big data isn’t just about fitting the model itself — it’s about efficiency at every stage of the process. While much attention is given to optimizing model training itself, the earlier phases can be just as, if not more, critical to the overall performance. In this article, we take a deep dive into what happens before we actually invoke model.fit(), focusing on the data pivoting stage. We are taking you on a journey through various pivoting solutions, exploring both pitfalls and interesting optimizations. The goal is simple: make this process highly efficient — in terms of processing time and memory usage. So, buckle up!
Popular Gradle mistakes (and how to avoid them) – part 2
In the previous post – part 1, we covered common Gradle mistakes and how to fix them. After a review and feedback from the community, we decided to extend the list with more tips and best practices.
How to create a synthetic annotator? The process of developing a domain-specific LLM-as-a-Judge.
In this blogpost we want to introduce the topic of using a Large Language Model (LLM) as an evaluator — a novel approach to tackling the complexities of evaluating advanced machine learning systems, particularly in tasks like Automatic Summarization, Text Generation, and Machine Translation, where traditional metrics struggle to capture nuances like cross-lingual accuracy and bias detection.
The AI dual-use dilemma using the example of China
This article discusses the dual-use dilemma of AI, focusing on China’s approach and the challenges of balancing innovation with security risks, particularly the blurred lines between civilian and military applications.
How we saved over 60% of k8s resources in our frontend platform
In this article, we want to share our journey of searching for optimizations in one of Allegro’s main microservices: opbox-web. You’ll read about the issues we had to deal with and how we managed to overcome them — together with a few surprises along the way and even one golden rule broken.
Automating Periodic Data Transfer from an Operational Database to a Data Warehouse
Many companies face the challenge of efficiently processing large datasets for analytics. Using an operational database for such purposes can lead to performance issues or, in extreme cases, system failures. This highlights the need to transfer data from operational databases to data warehouses. This approach allows heavy analytical queries without overburdening transactional systems and supports shorter retention periods in production databases.
Circuit Breaker not only for HTTP calls! (based on resilience4j)
When we think about the Circuit Breaker pattern, we instantly associate it with the HTTP client. Just make some annotation or wrapper and proceed with coding. In this article, I will encourage you to use this pattern to resolve business problems. Based on a live example from Allegro I will show you how to use the implementation of CircuitBreaker from Resilience4j library for cases other than HTTP calls.
Popular Gradle mistakes (and how to avoid them)
As part of Allegro Hacktoberfest celebrations, Andamio Task Force (the team responsible for Andamio, a set of common libraries used by most JVM projects at Allegro) posted the following message on our social platform…
Do repeat yourself! What is responsibility in code?
Did you know that in October this year, DRY principle will celebrate its 25th anniversary? It was proposed by Andrew Hunt and David Thomas in The Pragmatic Programmer book in 1999. 25th birthday is quite a good reason to celebrate, isn’t it? At least, it’s a good opportunity to bring this principle back into the spotlight and to discuss how to use it properly.
Automating Code Migrations at Scale
At Allegro, we continuously improve our development processes to maintain high code quality and efficiency standards. One of the significant challenges we encounter is managing code migrations at scale, especially with breaking changes in our internal libraries or workflows. Manual code migration is a severe burden, with over 2000 services (and their repositories). We need to introduce some kind of code migration management.
Accelerate test execution in Groovy and Spock
In one of our core services, the execution of a single unit test took approximately 30 seconds, while a single integration test ranged between 65 and 70 seconds. Running the entire test suite took circa 6 minutes.
How to get back to programming after a more than 1.5 year gap – subjective thoughts and tips
Hi, I am Magda and I will tell you a story about coming back to work after a break of 21 months and 2 days. Everything here will be a subjective perspective about my experience.
Migrating Selenium to Playwright in Java – evolution, not revolution
Are you, as a test automation engineer, tired of Selenium’s flakiness? Are you seeking a better tool to automate your end-to-end tests? Have you heard of Playwright? Perhaps you’ve encountered opinions that it is only worth using within a Node.js environment. I have. And as a tester, I decided to verify if this is true. If you’re interested in the results, I encourage you to read the following article.