<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged qa</title>
<link>https://coderlegion.com/tag/qa</link>
<description>Powered by Question2Answer</description>
<item>
<title>Black-Box Testing with AI Agents: Test the Rules, Not the Code</title>
<link>https://coderlegion.com/32502/black-box-testing-with-ai-agents-test-the-rules-not-the-code</link>
<description>&lt;p&gt;An AI agent that reads your code writes tests that confirm your bugs. In this video I show how to use AI agents for black-box testing instead: generate test cases from the business rules alone, run them against the real system, and get a findings report that lists every rule the application breaks. It covers why code access weakens AI-generated tests, the four-step pipeline with the prompts and the workspace layout, and when this approach is the wrong tool.&lt;/p&gt;
&lt;p&gt;📝 Full article: &lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/soaresdiogo/black-box-testing-with-ai-agents-test-the-rules-not-the-code-17j8&quot;&gt;https://dev.to/soaresdiogo/black-box-testing-with-ai-agents-test-the-rules-not-the-code-17j8&lt;/a&gt;&lt;br&gt;
📸 Instagram: &lt;a rel=&quot;nofollow&quot; href=&quot;https://instagram.com/diogosoares.dev&quot;&gt;https://instagram.com/diogosoares.dev&lt;/a&gt;&lt;br&gt;
💼 LinkedIn: &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/in/diogoschmidtsoares&quot;&gt;https://www.linkedin.com/in/diogoschmidtsoares&lt;/a&gt;&lt;br&gt;
🌐 Website: &lt;a rel=&quot;nofollow&quot; href=&quot;https://diogosoares.dev&quot;&gt;https://diogosoares.dev&lt;/a&gt;&lt;/p&gt;
</description>
<category>Videos</category>
<guid isPermaLink="true">https://coderlegion.com/32502/black-box-testing-with-ai-agents-test-the-rules-not-the-code</guid>
<pubDate>Mon, 26 Oct 2026 12:01:41 +0000</pubDate>
</item>
<item>
<title>STOP reproducing bugs twice. Record once, get both a Markdown Bug Report and a Playwright Regression</title>
<link>https://coderlegion.com/30910/stop-reproducing-bugs-twice-record-once-get-both-markdown-report-playwright-regression</link>
<description>&lt;p&gt;📝Every QA engineer and developer knows the drill:&lt;br&gt;
You find a bug. You manually write down steps to reproduce, take screenshots, and format a ticket for Jira or GitHub. Then, you open your IDE and write the exact same steps all over again in code for your automated regression suite.&lt;/p&gt;
&lt;p&gt;Why do the same work twice?&lt;/p&gt;
&lt;p&gt;I built QA Bug → Regression Test to bridge the gap between manual reporting and automated regression testing. 🎯&lt;/p&gt;
&lt;p&gt;💡 How It Works:&lt;br&gt;
Record the Issue: Click Start Bug Session in your browser and reproduce the bug naturally. Clicks, inputs, navigation, and timing are recorded cleanly.&lt;br&gt;
Capture Inline Assertions: Highlight the visible error message, banner, or missing element right on the page to insert an immediate assertion.&lt;/p&gt;
&lt;p&gt;Instant Dual Output:&lt;br&gt;
🐞 Markdown Bug Report: Clean, formatted steps to reproduce with environment details and evidence, ready for GitHub Issues, Jira, or Linear.&lt;/p&gt;
&lt;p&gt;⚡ Playwright Test (.spec.ts): Production-ready code using resilient locators (getByRole, getByLabel, getByText) that drops straight into your test repository.&lt;/p&gt;
&lt;p&gt;🔒 Built for Privacy &amp;amp; Real-World QA:&lt;br&gt;
Zero-Leak Redaction: Passwords, API keys, and session tokens are automatically detected and replaced with REPLACE_WITH_TEST_VALUE in code and [REDACTED] in reports.&lt;br&gt;
100% Local &amp;amp; Offline-First: Manifest V3 compliant. Zero external tracking or servers—everything runs entirely inside your browser.&lt;/p&gt;
&lt;p&gt;🔗 Chrome Web Store: &lt;a rel=&quot;nofollow&quot; href=&quot;https://chromewebstore.google.com/detail/qa-bug-%E2%86%92-regression-test/khoelciicbkdeieibchdndccdncpelbg?authuser=1&amp;amp;hl=tr&quot;&gt;https://chromewebstore.google.com/detail/qa-bug-→-regression-test/khoelciicbkdeieibchdndccdncpelbg?authuser=1&amp;amp;hl=tr&lt;/a&gt;&lt;br&gt;
🎬 Quick Demo (YouTube): &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.youtube.com/watch?v=GrtotYTfhbg&quot;&gt;https://www.youtube.com/watch?v=GrtotYTfhbg&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I’d love to hear your feedback on how this fits into your daily QA/developer workflow! Try it out and let me know your thoughts below! 👇&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/30910/stop-reproducing-bugs-twice-record-once-get-both-markdown-report-playwright-regression</guid>
<pubDate>Tue, 13 Oct 2026 08:53:10 +0000</pubDate>
</item>
<item>
<title>What I Wish I Knew When I Started in QA</title>
<link>https://coderlegion.com/26539/what-i-wish-i-knew-when-i-started-in-qa</link>
<description>&lt;p&gt;When I started my first QA job, I had already spent around twenty years working in mechanical engineering and manufacturing.&lt;/p&gt;
&lt;p&gt;I had technical experience. I had programmed CNC machines. I had used Linux for years. I had even studied programming as a kid.&lt;/p&gt;
&lt;p&gt;And yet, when I entered software development, I quickly discovered how much I didn't understand.&lt;/p&gt;
&lt;p&gt;I remember being confused by things that seem completely normal to me today. DEV, QA, STG, PROD. The way a pull request moved through a team. What happened before testing, what happened after it, and who was responsible for what.&lt;/p&gt;
&lt;p&gt;I was lucky to have a patient buddy who helped me through those first months. Eventually, I became the person mentoring a new colleague.&lt;/p&gt;
&lt;p&gt;Looking back, there are a few things I wish I had understood earlier.&lt;/p&gt;
&lt;h3 id=&quot;you-don-t-need-to-understand-the-whole-system-on-day-one&quot;&gt;You don't need to understand the whole system on day one&lt;/h3&gt;
&lt;p&gt;When you're new, it's easy to look around and assume everyone else understands everything.&lt;/p&gt;
&lt;p&gt;Developers discuss architecture. DevOps talks about deployments. QA engineers know the product. Someone mentions a database migration or a production incident, and you feel like you've missed an entire chapter.&lt;/p&gt;
&lt;p&gt;The truth is that everyone learned those things somewhere.&lt;/p&gt;
&lt;p&gt;You don't need to understand the whole system immediately. You need to start building a mental map of it.&lt;/p&gt;
&lt;p&gt;Where does the code live? How does it reach a test environment? Where do the logs go? Who owns the service? What happens when a build fails?&lt;/p&gt;
&lt;p&gt;One answer usually leads to another question. That's how the map grows.&lt;/p&gt;
&lt;h3 id=&quot;ask-the-question-even-when-it-feels-basic&quot;&gt;Ask the question, even when it feels basic&lt;/h3&gt;
&lt;p&gt;I was fortunate to have Ventsislav as my buddy at SolarWinds. I still remember his patience.&lt;/p&gt;
&lt;p&gt;When you're changing careers, there are moments when you don't even know how to formulate what you don't understand. That can be uncomfortable, especially when you've already spent years being competent in another profession.&lt;/p&gt;
&lt;p&gt;But pretending to understand something doesn't make you better at your job.&lt;/p&gt;
&lt;p&gt;Asking does.&lt;/p&gt;
&lt;p&gt;I would rather ask a basic question and understand the system than stay quiet and make decisions based on an assumption.&lt;/p&gt;
&lt;p&gt;And if you're the experienced person in the room, remember what those first months felt like. The way you answer a beginner's question can influence whether they ask the next one.&lt;/p&gt;
&lt;h3 id=&quot;learn-how-the-product-works-not-just-how-to-execute-a-test&quot;&gt;Learn how the product works, not just how to execute a test&lt;/h3&gt;
&lt;p&gt;At the beginning, it's tempting to focus on the assigned test case.&lt;/p&gt;
&lt;p&gt;Open the application. Follow the steps. Compare the actual result with the expected result. Report a defect if something doesn't match.&lt;/p&gt;
&lt;p&gt;That's useful work, but it's only part of QA.&lt;/p&gt;
&lt;p&gt;The more you understand the product, the more useful your testing becomes.&lt;/p&gt;
&lt;p&gt;What is the user trying to achieve? Which parts of the system depend on this feature? What happens when an API fails? What data is involved? What would make this change risky?&lt;/p&gt;
&lt;p&gt;A tester who understands the product can ask questions that aren't written in the test case.&lt;/p&gt;
&lt;p&gt;And those questions often matter more than another perfectly executed checklist.&lt;/p&gt;
&lt;h3 id=&quot;don-t-treat-developers-as-the-other-side&quot;&gt;Don't treat developers as the other side&lt;/h3&gt;
&lt;p&gt;Early in a QA career, it can be easy to fall into a pattern where developers build things and testers find what's wrong with them.&lt;/p&gt;
&lt;p&gt;But QA and development aren't opposing teams.&lt;/p&gt;
&lt;p&gt;You're working on the same product.&lt;/p&gt;
&lt;p&gt;A good bug report helps a developer understand the problem. A good conversation with a developer helps QA understand the implementation and the risks. A good developer can teach you a lot about how the system works, and a good tester can reveal assumptions the developer hadn't considered.&lt;/p&gt;
&lt;p&gt;Some of the most useful things I've learned came from asking developers to explain why something behaved the way it did.&lt;/p&gt;
&lt;p&gt;Not to prove that I was right.&lt;/p&gt;
&lt;p&gt;To understand it better.&lt;/p&gt;
&lt;h3 id=&quot;automation-isn-t-a-different-species-of-engineering&quot;&gt;Automation isn't a different species of engineering&lt;/h3&gt;
&lt;p&gt;For a long time, I admired colleagues who worked with automation.&lt;/p&gt;
&lt;p&gt;I could change parameters and make smaller adjustments, but writing automated tests myself felt like another level.&lt;/p&gt;
&lt;p&gt;Then I took a Python course and started building my own projects.&lt;/p&gt;
&lt;p&gt;Gradually, automation stopped being something other people did.&lt;/p&gt;
&lt;p&gt;It became code I could understand, debug, and write.&lt;/p&gt;
&lt;p&gt;If you're a manual QA engineer who wants to learn automation, you don't need to start by building a complete framework.&lt;/p&gt;
&lt;p&gt;Start with a small script. Make an API request. Parse a response. Write one test. Run it. Break it. Fix it.&lt;/p&gt;
&lt;p&gt;Then learn why it works.&lt;/p&gt;
&lt;p&gt;The important part is not how quickly you can copy a framework from a tutorial. It's whether you can understand and maintain what you've written.&lt;/p&gt;
&lt;h3 id=&quot;learn-the-tools-around-your-tests&quot;&gt;Learn the tools around your tests&lt;/h3&gt;
&lt;p&gt;I wish I had looked beyond the test itself earlier.&lt;/p&gt;
&lt;p&gt;APIs, databases, logs, Linux, Git, CI/CD, and environment configuration all became increasingly useful as I moved deeper into automation.&lt;/p&gt;
&lt;p&gt;You don't need to become an expert in every one of those areas.&lt;/p&gt;
&lt;p&gt;But knowing how to inspect an API response, read a log, understand a pipeline failure, or check whether a service is running can save you hours of guessing.&lt;/p&gt;
&lt;p&gt;A failed test doesn't always mean an application defect.&lt;/p&gt;
&lt;p&gt;Sometimes the environment is broken. Sometimes the test data is wrong. Sometimes a dependency is unavailable. Sometimes the test itself is wrong.&lt;/p&gt;
&lt;p&gt;Understanding the surrounding system helps you find the difference.&lt;/p&gt;
&lt;h3 id=&quot;quality-is-bigger-than-the-number-of-bugs-you-find&quot;&gt;Quality is bigger than the number of bugs you find&lt;/h3&gt;
&lt;p&gt;Finding a serious bug before production is satisfying. It can save a team a lot of trouble.&lt;/p&gt;
&lt;p&gt;But the number of bugs you report isn't a complete measure of your value as a QA engineer.&lt;/p&gt;
&lt;p&gt;Sometimes your most valuable contribution is asking a question before development starts.&lt;/p&gt;
&lt;p&gt;Sometimes it's improving a test that everyone has stopped trusting.&lt;/p&gt;
&lt;p&gt;Sometimes it's identifying an environment problem that causes repeated false failures.&lt;/p&gt;
&lt;p&gt;Sometimes it's helping the team understand a release risk that no individual test can capture.&lt;/p&gt;
&lt;p&gt;Over time, I stopped thinking of QA only as finding defects.&lt;/p&gt;
&lt;p&gt;I started thinking of it as helping the team understand quality and risk.&lt;/p&gt;
&lt;p&gt;That change in perspective has stayed with me.&lt;/p&gt;
&lt;h3 id=&quot;your-previous-career-is-not-wasted&quot;&gt;Your previous career is not wasted&lt;/h3&gt;
&lt;p&gt;This is something I would tell anyone entering IT later in life.&lt;/p&gt;
&lt;p&gt;I spent roughly twenty years in mechanical engineering, working as a designer and technologist and programming CNC machines.&lt;/p&gt;
&lt;p&gt;At first, that experience felt separate from my new QA career.&lt;/p&gt;
&lt;p&gt;Today I see a lot of connections.&lt;/p&gt;
&lt;p&gt;Precision. Processes. Root-cause analysis. Understanding dependencies. Thinking about what happens before and after your part of the work.&lt;/p&gt;
&lt;p&gt;Those habits followed me into software engineering.&lt;/p&gt;
&lt;p&gt;You may need to learn a new technology stack, but you don't necessarily need to start your professional identity from zero.&lt;/p&gt;
&lt;p&gt;Your previous experience can become an advantage once you learn how to apply it.&lt;/p&gt;
&lt;h3 id=&quot;you-will-eventually-become-the-person-who-explains-it&quot;&gt;You will eventually become the person who explains it&lt;/h3&gt;
&lt;p&gt;One of my favorite memories from my first QA job is becoming a buddy for a new colleague.&lt;/p&gt;
&lt;p&gt;I had gone from struggling to understand the environments and processes to helping someone else navigate them.&lt;/p&gt;
&lt;p&gt;That didn't happen overnight.&lt;/p&gt;
&lt;p&gt;There was no moment when I suddenly knew everything.&lt;/p&gt;
&lt;p&gt;It was a gradual accumulation of questions, mistakes, explanations, and experience.&lt;/p&gt;
&lt;p&gt;Growth often works like that. You don't notice it while it's happening.&lt;/p&gt;
&lt;p&gt;Then one day someone asks you a question, and you realize you're explaining something that once confused you completely.&lt;/p&gt;
&lt;h3 id=&quot;keep-looking-one-layer-deeper&quot;&gt;Keep looking one layer deeper&lt;/h3&gt;
&lt;p&gt;If I could give my younger QA self one piece of advice, it would be this:&lt;/p&gt;
&lt;p&gt;Don't stop at the first answer.&lt;/p&gt;
&lt;p&gt;If a test fails, investigate why.&lt;/p&gt;
&lt;p&gt;If a deployment fails, try to understand what happened.&lt;/p&gt;
&lt;p&gt;If a developer explains a technical decision, ask about the trade-offs.&lt;/p&gt;
&lt;p&gt;If a production issue occurs, look at what the team learned from it.&lt;/p&gt;
&lt;p&gt;You don't need to become a developer, DevOps engineer, security specialist, and product manager all at once.&lt;/p&gt;
&lt;p&gt;But every layer you understand makes you a more capable QA engineer.&lt;/p&gt;
&lt;p&gt;My own curiosity eventually took me from manual testing into Python, Robot Framework, Playwright, CI/CD, Linux infrastructure, observability, and release engineering.&lt;/p&gt;
&lt;p&gt;I'm still learning.&lt;/p&gt;
&lt;p&gt;And I suspect I always will be.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;This is the second article in my &lt;strong&gt;My QA Journey&lt;/strong&gt; series.&lt;/p&gt;
&lt;p&gt;If you're starting in QA today, what is one thing you wish someone had told you earlier? And if you've been in the industry for a while, what advice would you give your first-year self?&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/26539/what-i-wish-i-knew-when-i-started-in-qa</guid>
<pubDate>Wed, 09 Sep 2026 04:51:57 +0000</pubDate>
</item>
<item>
<title>It Took Me 20 Years to Come Back to Tech</title>
<link>https://coderlegion.com/26075/it-took-me-20-years-to-come-back-to-tech</link>
<description>&lt;h2 id=&quot;it-took-me-20-years-to-come-back-to-tech&quot;&gt;It Took Me 20 Years to Come Back to Tech&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Dev Journey | CoderLegion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;What happens when someone who discovered programming as a child spends nearly two decades working in a completely different industry—and then finds their way back into technology?&lt;/p&gt;
&lt;p&gt;For &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://coderlegion.com/user/JankoD84&quot;&gt;Jan Duris (@JankoD84)&lt;/a&gt;&lt;/strong&gt;, the answer is a journey through programming, Linux, mechanical engineering, CNC, QA, test automation, DevOps, release engineering, and eventually building his own SaaS product.&lt;/p&gt;
&lt;p&gt;Jan's relationship with technology began when he was a child experimenting with computers and programming. He later moved into mechanical engineering, where programming continued to appear in a very different form through CNC machines.&lt;/p&gt;
&lt;p&gt;Almost twenty years passed before he returned to IT professionally.&lt;/p&gt;
&lt;p&gt;His first IT role was in QA, where he had to learn an entirely new world of software development, environments, testing, and processes. From there, he gradually moved into automation, Python, Playwright, CI/CD, DevOps, and release engineering.&lt;/p&gt;
&lt;p&gt;Today, Jan works as a QA Automation Engineer and builder, focusing on software quality, release reliability, developer tooling, and AI-assisted delivery. He is also building &lt;strong&gt;Dulvarn&lt;/strong&gt;, a release intelligence platform designed to help teams make better release decisions using evidence, automation, and AI.&lt;/p&gt;
&lt;p&gt;This is his story.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;it-took-me-20-years-to-come-back-to-tech-1&quot;&gt;It Took Me 20 Years to Come Back to Tech&lt;/h3&gt;
&lt;p&gt;My career in technology didn't begin when I got my first QA job.&lt;/p&gt;
&lt;p&gt;In a strange way, it began when I was about four years old.&lt;/p&gt;
&lt;p&gt;Every year during the summer holidays, I used to spend two or three months at my great-grandmother's house in the Czech Republic.&lt;/p&gt;
&lt;p&gt;There was a small storage room upstairs.&lt;/p&gt;
&lt;p&gt;I spent entire days there with my mother's cousin.&lt;/p&gt;
&lt;p&gt;For most people, a storage room probably doesn't sound like the beginning of a journey into technology.&lt;/p&gt;
&lt;p&gt;For me, somehow, it was.&lt;/p&gt;
&lt;p&gt;That was where computers first became something more than machines.&lt;/p&gt;
&lt;p&gt;They became something I wanted to understand.&lt;/p&gt;
&lt;p&gt;I had no idea what software engineering was.&lt;/p&gt;
&lt;p&gt;I didn't know what QA meant.&lt;/p&gt;
&lt;p&gt;There was no DevOps, CI/CD, cloud infrastructure, AI coding assistant, or SaaS product in my world.&lt;/p&gt;
&lt;p&gt;There was just curiosity.&lt;/p&gt;
&lt;p&gt;And a question that has stayed with me for most of my life:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;How does this actually work?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;my-first-programming-experience-came-before-i-really-knew-what-a-career-was&quot;&gt;My First Programming Experience Came Before I Really Knew What a Career Was&lt;/h3&gt;
&lt;p&gt;While I was still in elementary school, I started attending a programming course.&lt;/p&gt;
&lt;p&gt;We worked on PMD 85 computers.&lt;/p&gt;
&lt;p&gt;For anyone who grew up with modern laptops, cloud IDEs, GitHub, and AI assistants, those machines probably look almost prehistoric now.&lt;/p&gt;
&lt;p&gt;But for me, they were fascinating.&lt;/p&gt;
&lt;p&gt;I learned things like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;BASIC&lt;/li&gt;
&lt;li&gt;Pascal&lt;/li&gt;
&lt;li&gt;Turbo Pascal&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There was something magical about writing instructions and seeing a machine respond to them.&lt;/p&gt;
&lt;p&gt;Later I got my first computer of my own: a Didaktik Compact.&lt;/p&gt;
&lt;p&gt;That gave me the freedom to experiment by myself.&lt;/p&gt;
&lt;p&gt;There was no carefully structured learning roadmap.&lt;/p&gt;
&lt;p&gt;No &quot;become a developer in 12 weeks&quot; course.&lt;/p&gt;
&lt;p&gt;I learned because I wanted to make the machine do things.&lt;/p&gt;
&lt;p&gt;I broke things.&lt;/p&gt;
&lt;p&gt;I tried again.&lt;/p&gt;
&lt;p&gt;I read whatever I could find.&lt;/p&gt;
&lt;p&gt;And slowly, programming became something familiar.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;then-i-discovered-linux&quot;&gt;Then I Discovered Linux&lt;/h3&gt;
&lt;p&gt;Linux became another important part of that journey.&lt;/p&gt;
&lt;p&gt;I started experimenting with some of the distributions that were available at the time.&lt;/p&gt;
&lt;p&gt;Again, I wasn't thinking about a career.&lt;/p&gt;
&lt;p&gt;I wasn't building a portfolio.&lt;/p&gt;
&lt;p&gt;I wasn't trying to optimize my LinkedIn profile.&lt;/p&gt;
&lt;p&gt;I was simply interested in what was happening underneath the graphical interface.&lt;/p&gt;
&lt;p&gt;Filesystems.&lt;/p&gt;
&lt;p&gt;Processes.&lt;/p&gt;
&lt;p&gt;Commands.&lt;/p&gt;
&lt;p&gt;Configuration.&lt;/p&gt;
&lt;p&gt;Bash.&lt;/p&gt;
&lt;p&gt;That relationship with Linux never really disappeared.&lt;/p&gt;
&lt;p&gt;Even today, Linux and Bash still feel like home to me.&lt;/p&gt;
&lt;p&gt;They have followed me through different parts of my career, even during the years when programming itself moved into the background.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;then-life-took-me-somewhere-completely-different&quot;&gt;Then Life Took Me Somewhere Completely Different&lt;/h3&gt;
&lt;p&gt;Teenage years arrived.&lt;/p&gt;
&lt;p&gt;Programming became less important.&lt;/p&gt;
&lt;p&gt;Games became more important.&lt;/p&gt;
&lt;p&gt;Technology was still around me, and Linux never completely disappeared, but I stopped imagining programming as the obvious direction of my life.&lt;/p&gt;
&lt;p&gt;Then came secondary school.&lt;/p&gt;
&lt;p&gt;I ended up studying mechanical engineering.&lt;/p&gt;
&lt;p&gt;It wasn't exactly the future I had dreamed about when I was younger.&lt;/p&gt;
&lt;p&gt;But sometimes a decision you make early in life defines much more of your future than you expect.&lt;/p&gt;
&lt;p&gt;Mechanical engineering became my professional world for roughly the next twenty years.&lt;/p&gt;
&lt;p&gt;I worked as a mechanical designer and technologist.&lt;/p&gt;
&lt;p&gt;I worked with manufacturing processes.&lt;/p&gt;
&lt;p&gt;I worked with technical drawings and 3D components.&lt;/p&gt;
&lt;p&gt;And I programmed CNC machines.&lt;/p&gt;
&lt;p&gt;So programming never really disappeared.&lt;/p&gt;
&lt;p&gt;It just changed form.&lt;/p&gt;
&lt;p&gt;Instead of telling a computer how to process data, I was telling machines how to manufacture physical components.&lt;/p&gt;
&lt;p&gt;And in hindsight, the two worlds taught me many of the same things.&lt;/p&gt;
&lt;p&gt;Precision matters.&lt;/p&gt;
&lt;p&gt;Processes matter.&lt;/p&gt;
&lt;p&gt;Small assumptions matter.&lt;/p&gt;
&lt;p&gt;You need to understand what happens before and after your own part of the work.&lt;/p&gt;
&lt;p&gt;And when something goes wrong, the cause is not always where the failure becomes visible.&lt;/p&gt;
&lt;p&gt;I didn't know it at the time, but those lessons would later become very useful in QA.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-dream-of-working-in-it-never-completely-disappeared&quot;&gt;The Dream of Working in IT Never Completely Disappeared&lt;/h3&gt;
&lt;p&gt;Even after years in mechanical engineering, IT was still somewhere in the back of my mind.&lt;/p&gt;
&lt;p&gt;It was one of those things you tell yourself you might return to someday.&lt;/p&gt;
&lt;p&gt;The problem with &quot;someday&quot; is that it can easily turn into twenty years.&lt;/p&gt;
&lt;p&gt;Then I met the woman who became my wife.&lt;/p&gt;
&lt;p&gt;And sometimes another person sees something in you that you have stopped acting on yourself.&lt;/p&gt;
&lt;p&gt;She knew that working in IT had been something I had wanted since I was young.&lt;/p&gt;
&lt;p&gt;She encouraged me to finally do something about it.&lt;/p&gt;
&lt;p&gt;To take an entry-level IT course.&lt;/p&gt;
&lt;p&gt;I agreed.&lt;/p&gt;
&lt;p&gt;But I had one condition.&lt;/p&gt;
&lt;p&gt;She had to do the course with me.&lt;/p&gt;
&lt;p&gt;IT wasn't her field at all.&lt;/p&gt;
&lt;p&gt;That actually made me respect her even more for agreeing.&lt;/p&gt;
&lt;p&gt;We went through it together.&lt;/p&gt;
&lt;p&gt;I helped her heavily with the technical parts, and by the end it sometimes felt like I had completed the course for two people.&lt;/p&gt;
&lt;p&gt;I didn't mind.&lt;/p&gt;
&lt;p&gt;I still don't.&lt;/p&gt;
&lt;p&gt;Because what mattered was what happened next.&lt;/p&gt;
&lt;p&gt;After about twenty years away from the career I had imagined as a child, I finally had a real path back into technology.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;my-first-it-job-was-in-qa&quot;&gt;My First IT Job Was in QA&lt;/h3&gt;
&lt;p&gt;My first job in IT was at SolarWinds in the Czech Republic.&lt;/p&gt;
&lt;p&gt;Getting it changed much more than my job title.&lt;/p&gt;
&lt;p&gt;We moved to Brno for the opportunity.&lt;/p&gt;
&lt;p&gt;I had finally made the transition.&lt;/p&gt;
&lt;p&gt;And then I discovered something uncomfortable.&lt;/p&gt;
&lt;p&gt;Getting into IT and understanding IT are two very different things.&lt;/p&gt;
&lt;p&gt;I was entering an industry with years of technical experience behind me, but software development had its own language.&lt;/p&gt;
&lt;p&gt;Its own processes.&lt;/p&gt;
&lt;p&gt;Its own mental models.&lt;/p&gt;
&lt;p&gt;Things that seem completely normal to me today were confusing at the beginning.&lt;/p&gt;
&lt;p&gt;Even environments.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;DEV
QA
STG
PROD
&lt;/code&gt;&lt;/pre&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/26075/it-took-me-20-years-to-come-back-to-tech</guid>
<pubDate>Wed, 02 Sep 2026 11:36:24 +0000</pubDate>
</item>
<item>
<title>Eight Months, One Opportunity, A Lot of Learning — Amita Sharma’s Journey from QA to Development</title>
<link>https://coderlegion.com/26074/eight-months-one-opportunity-lot-of-learning-amita-sharmas-journey-from-qa-to-development</link>
<description>&lt;h2 id=&quot;eight-months-one-opportunity-a-lot-of-learning-amita-sharma-s-journey-from-qa-to-development&quot;&gt;Eight Months, One Opportunity, A Lot of Learning — Amita Sharma’s Journey from QA to Development&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Dev Journey | CoderLegion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Starting your first job can be both exciting and intimidating.&lt;/p&gt;
&lt;p&gt;You have spent years studying, learning technologies, completing projects, and preparing for that first opportunity. But when you finally walk into a real workplace, everything can suddenly feel different.&lt;/p&gt;
&lt;p&gt;Will I be able to do the work?&lt;/p&gt;
&lt;p&gt;Will I understand what everyone is talking about?&lt;/p&gt;
&lt;p&gt;What happens when I make a mistake?&lt;/p&gt;
&lt;p&gt;For &lt;strong&gt;Amita Sharma&lt;/strong&gt;, her first opportunity came through a college placement drive during her final year.&lt;/p&gt;
&lt;p&gt;She went into the process without knowing exactly where it would lead. After an assignment test and two rounds of interviews, she was offered a six-month internship as a QA.&lt;/p&gt;
&lt;p&gt;What started as her first corporate experience eventually became much more than that.&lt;/p&gt;
&lt;p&gt;Over the next eight months, Amita worked on a real product, learned the fundamentals of quality assurance, discovered the importance of thinking beyond obvious test cases, and eventually got the opportunity to contribute to the development side of the same product.&lt;/p&gt;
&lt;p&gt;Today, her experience spans QA, testing, development, and an increasing interest in AI-driven testing.&lt;/p&gt;
&lt;p&gt;This is the story of how one opportunity helped her discover that she could do more than she initially thought.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;getting-the-first-opportunity&quot;&gt;Getting the First Opportunity&lt;/h3&gt;
&lt;p&gt;Eight months ago, I walked into a college placement drive with honestly no idea where it would take me.&lt;/p&gt;
&lt;p&gt;There was an assignment test, followed by two interview rounds. I cleared them and was eventually offered a six-month internship as a QA.&lt;/p&gt;
&lt;p&gt;Since it was my final year of college, getting a job before graduating was already a big thing for me.&lt;/p&gt;
&lt;p&gt;But getting the offer was one thing, and actually starting was another.&lt;/p&gt;
&lt;p&gt;It was my first corporate experience, so I was nervous.&lt;/p&gt;
&lt;p&gt;I had so many questions in my head.&lt;/p&gt;
&lt;p&gt;Would I be able to do the work?&lt;/p&gt;
&lt;p&gt;Would I understand everything?&lt;/p&gt;
&lt;p&gt;How would I fit into a completely new environment?&lt;/p&gt;
&lt;p&gt;Thankfully, the first few days made things much easier.&lt;/p&gt;
&lt;p&gt;Everyone was really welcoming, the team was approachable, and I never felt like I had to figure everything out on my own.&lt;/p&gt;
&lt;p&gt;Once the training started and I began working on an actual product, the real learning began.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;discovering-what-qa-really-involves&quot;&gt;Discovering What QA Really Involves&lt;/h3&gt;
&lt;p&gt;When I joined, I had a pretty basic understanding of QA.&lt;/p&gt;
&lt;p&gt;Test the feature, find bugs, report them.&lt;/p&gt;
&lt;p&gt;But working on &lt;strong&gt;QAlity&lt;/strong&gt; showed me how much more there was to it.&lt;/p&gt;
&lt;p&gt;I started working on different features and workflows, reporting and retesting bugs, doing regression testing, and slowly learning to think beyond the obvious scenarios.&lt;/p&gt;
&lt;p&gt;I began to understand that testing isn't simply about finding something that doesn't work.&lt;/p&gt;
&lt;p&gt;It's about thinking about how people might actually use a product.&lt;/p&gt;
&lt;p&gt;What happens if someone takes an unexpected path?&lt;/p&gt;
&lt;p&gt;What happens if they enter something you didn't anticipate?&lt;/p&gt;
&lt;p&gt;What happens when a new feature interacts with something that was already working?&lt;/p&gt;
&lt;p&gt;Those questions gradually became part of the way I approached testing.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-excitement-of-finding-my-first-bug&quot;&gt;The Excitement of Finding My First Bug&lt;/h3&gt;
&lt;p&gt;I still remember finding my first bug.&lt;/p&gt;
&lt;p&gt;It was honestly such a small thing, but I was so happy when I found it.&lt;/p&gt;
&lt;p&gt;I don't even know why I was that excited, but I think it was because it made everything feel real.&lt;/p&gt;
&lt;p&gt;I was actually testing a product.&lt;/p&gt;
&lt;p&gt;I had found something that wasn't working as expected.&lt;/p&gt;
&lt;p&gt;And I knew what to do with it.&lt;/p&gt;
&lt;p&gt;It was a small moment, but for me it was an important one.&lt;/p&gt;
&lt;p&gt;It made me feel like I was no longer just learning about QA.&lt;/p&gt;
&lt;p&gt;I was actually doing it.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;learning-from-a-mentor&quot;&gt;Learning From a Mentor&lt;/h3&gt;
&lt;p&gt;My mentor had a big part in helping me get there.&lt;/p&gt;
&lt;p&gt;Whenever I got stuck, I had someone to ask, but I was also encouraged to think things through myself.&lt;/p&gt;
&lt;p&gt;A simple question like:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&quot;What about this scenario?&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;would sometimes send me back to the feature and make me look at it differently.&lt;/p&gt;
&lt;p&gt;At first, I needed guidance to figure things out.&lt;/p&gt;
&lt;p&gt;Gradually, I became more confident in figuring things out on my own.&lt;/p&gt;
&lt;p&gt;That was one of the biggest changes I noticed in myself.&lt;/p&gt;
&lt;p&gt;The goal wasn't simply to have someone give me the answer.&lt;/p&gt;
&lt;p&gt;It was learning how to find the answer myself.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;an-unexpected-turn-from-qa-to-development&quot;&gt;An Unexpected Turn: From QA to Development&lt;/h3&gt;
&lt;p&gt;And then my role took a direction I hadn't expected.&lt;/p&gt;
&lt;p&gt;Along with QA, I got the opportunity to work on the development side of QAlity too.&lt;/p&gt;
&lt;p&gt;I worked on the UI and created pages for the product, which gave me a chance to understand QAlity from a completely different perspective.&lt;/p&gt;
&lt;p&gt;That experience was especially valuable because I got to see both sides of the product.&lt;/p&gt;
&lt;p&gt;I understood what went into building a feature and also what I needed to think about when testing it.&lt;/p&gt;
&lt;p&gt;It gave me a much broader experience than I had imagined when I first joined.&lt;/p&gt;
&lt;p&gt;Instead of seeing development and testing as completely separate activities, I started understanding how closely they are connected.&lt;/p&gt;
&lt;p&gt;Building something gives you one perspective.&lt;/p&gt;
&lt;p&gt;Testing it gives you another.&lt;/p&gt;
&lt;p&gt;Having the opportunity to experience both helped me understand the product much more deeply.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;eight-months-later&quot;&gt;Eight Months Later&lt;/h3&gt;
&lt;p&gt;Now, eight months later, I can see how much has changed.&lt;/p&gt;
&lt;p&gt;I came in wondering whether I would be able to do the job.&lt;/p&gt;
&lt;p&gt;Today, I have worked on QAlity as a QA, contributed to its development, built UI pages, and taken on things that I wouldn't have imagined myself doing on day one.&lt;/p&gt;
&lt;p&gt;Looking back, the biggest change isn't just the number of things I've learned.&lt;/p&gt;
&lt;p&gt;It's the confidence I've gained from actually doing them.&lt;/p&gt;
&lt;p&gt;The things that seemed intimidating at the beginning gradually became things I knew how to approach.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;what-i-would-tell-someone-starting-their-first-job&quot;&gt;What I Would Tell Someone Starting Their First Job&lt;/h3&gt;
&lt;p&gt;If there's one thing I'd tell someone starting their first job, it's to give yourself some time.&lt;/p&gt;
&lt;p&gt;You don't have to know everything from the beginning.&lt;/p&gt;
&lt;p&gt;Ask questions.&lt;/p&gt;
&lt;p&gt;Learn from the people around you.&lt;/p&gt;
&lt;p&gt;Take feedback.&lt;/p&gt;
&lt;p&gt;And don't hesitate to try something new just because you've never done it before.&lt;/p&gt;
&lt;p&gt;Your first job isn't about proving that you already know everything.&lt;/p&gt;
&lt;p&gt;It's about learning how to learn in a real environment.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;more-than-just-a-first-job&quot;&gt;More Than Just a First Job&lt;/h3&gt;
&lt;p&gt;When I think about these eight months, I don't just think about the work I did.&lt;/p&gt;
&lt;p&gt;I think about how much that first opportunity opened up for me.&lt;/p&gt;
&lt;p&gt;I joined as a QA intern, but along the way I got to explore development too, learn from some really good people, and discover that I could do more than I initially thought.&lt;/p&gt;
&lt;p&gt;And honestly, I think that's what makes these eight months so special to me.&lt;/p&gt;
&lt;p&gt;I came here with a lot to learn, and I'm leaving this phase with a lot more experience, confidence, and curiosity about what comes next.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;about-amita&quot;&gt;About Amita&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Amita Sharma&lt;/strong&gt; is a Quality Assurance Engineer focused on building reliable, scalable, and efficient testing workflows. Her experience includes manual and automated testing, with a growing interest in AI-driven testing and modern QA practices.&lt;/p&gt;
&lt;p&gt;Her CoderLegion profile is:&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://coderlegion.com/user/amitasharmaa&quot;&gt;https://coderlegion.com/user/amitasharmaa&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Her technical interests include JavaScript, Python, SQL, Selenium, Playwright, Cypress, Postman, REST APIs, Machine Learning, and Agentic AI.&lt;/p&gt;
&lt;p&gt;She is passionate about improving product quality, reducing manual effort, and creating better user experiences through smarter testing solutions.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;This story is part of CoderLegion's Dev Journey series&lt;/strong&gt;, where developers share their real experiences, challenges, lessons, growth, and the opportunities that shaped their careers.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/26074/eight-months-one-opportunity-lot-of-learning-amita-sharmas-journey-from-qa-to-development</guid>
<pubDate>Wed, 02 Sep 2026 11:24:42 +0000</pubDate>
</item>
<item>
<title>Adding a feature is easy. Hiding the complexity behind it is much harder</title>
<link>https://coderlegion.com/25903/adding-a-feature-is-easy-hiding-the-complexity-behind-it-is-much-harder</link>
<description>&lt;p&gt;One thing I have learned while building QAlity:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adding a feature is easy. Hiding the complexity behind it is much harder.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Test automation has a lot of moving parts.&lt;/p&gt;
&lt;p&gt;Locators. Waits. Assertions. Test data. Browser behavior. Execution history. Reusable flows. Failure analysis.&lt;/p&gt;
&lt;p&gt;It’s tempting to expose all of that because technically, every option can be useful.&lt;/p&gt;
&lt;p&gt;But then you end up recreating the same complexity that made automation difficult in the first place.&lt;/p&gt;
&lt;p&gt;So lately, I have been asking a different question when reviewing QAlity:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“Does the user actually need to understand this?”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If the answer is no, the product should probably handle it.&lt;/p&gt;
&lt;p&gt;I think this is especially important for developer tools.&lt;/p&gt;
&lt;p&gt;Advanced software does not have to look advanced.&lt;/p&gt;
&lt;p&gt;Sometimes the best feature is the configuration screen you never had to build.&lt;/p&gt;
&lt;p&gt;Explore QAlity - &lt;a rel=&quot;nofollow&quot; href=&quot;https://qality.dev&quot;&gt;https://qality.dev&lt;/a&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/25903/adding-a-feature-is-easy-hiding-the-complexity-behind-it-is-much-harder</guid>
<pubDate>Mon, 31 Aug 2026 06:21:43 +0000</pubDate>
</item>
<item>
<title>What Happens After QA Says ‘Passed’?</title>
<link>https://coderlegion.com/25760/what-happens-after-qa-says-passed</link>
<description>&lt;h2 id=&quot;what-happens-after-qa-says-passed-&quot;&gt;What Happens After QA Says “Passed”?&lt;/h2&gt;
&lt;p&gt;For a long time, my view of software quality ended at a fairly clear point.&lt;/p&gt;
&lt;p&gt;You test the feature.&lt;/p&gt;
&lt;p&gt;You verify the requirements.&lt;/p&gt;
&lt;p&gt;You report the bugs.&lt;/p&gt;
&lt;p&gt;The bugs get fixed.&lt;/p&gt;
&lt;p&gt;You retest.&lt;/p&gt;
&lt;p&gt;And eventually, you say:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Passed.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;At the beginning of my QA career, that felt like the finish line.&lt;/p&gt;
&lt;p&gt;Today, I see it very differently.&lt;/p&gt;
&lt;p&gt;Because one question kept coming back to me:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;What actually happens after QA says “passed”?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That question gradually pulled me outside the boundaries of traditional testing and into CI/CD, Linux, infrastructure, deployment, observability, alerting, and eventually release engineering.&lt;/p&gt;
&lt;p&gt;Not because I wanted to stop being a QA engineer.&lt;/p&gt;
&lt;p&gt;Quite the opposite.&lt;/p&gt;
&lt;p&gt;I wanted to understand the rest of the system that QA was trying to protect.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;-passed-doesn-t-mean-the-software-is-in-production&quot;&gt;“Passed” doesn’t mean the software is in production&lt;/h3&gt;
&lt;p&gt;This sounds obvious to me today.&lt;/p&gt;
&lt;p&gt;It wasn’t always obvious.&lt;/p&gt;
&lt;p&gt;A feature can pass testing and still have a long journey ahead of it.&lt;/p&gt;
&lt;p&gt;Somewhere after QA, things like this start happening:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;QA PASSED
    ↓
Build
    ↓
Package
    ↓
CI/CD Pipeline
    ↓
Environment Configuration
    ↓
Deployment
    ↓
Database Changes
    ↓
Infrastructure
    ↓
Health Checks
    ↓
Monitoring
    ↓
Production
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And every one of those steps introduces another opportunity for something to go wrong.&lt;/p&gt;
&lt;p&gt;The application can work perfectly in QA and fail because production configuration is different.&lt;/p&gt;
&lt;p&gt;The code can be correct while an external dependency behaves differently.&lt;/p&gt;
&lt;p&gt;A database migration can introduce a problem that wasn't visible during feature testing.&lt;/p&gt;
&lt;p&gt;A deployment can technically succeed while the service becomes unhealthy minutes later.&lt;/p&gt;
&lt;p&gt;The application can be running while nobody notices that the error rate is slowly increasing.&lt;/p&gt;
&lt;p&gt;QA saying “passed” is important.&lt;/p&gt;
&lt;p&gt;But it is only one piece of a much larger process.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;even-environments-were-confusing-at-first&quot;&gt;Even environments were confusing at first&lt;/h3&gt;
&lt;p&gt;When I entered QA, there were many things I had to learn from the beginning.&lt;/p&gt;
&lt;p&gt;One of them was something that feels completely normal to me today:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;DEV → QA → STG → PROD
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;At first, I didn't really understand why software needed so many environments.&lt;/p&gt;
&lt;p&gt;Why could something work in one environment and fail in another?&lt;/p&gt;
&lt;p&gt;Why couldn't we simply test it and deploy it?&lt;/p&gt;
&lt;p&gt;Why did configuration matter so much?&lt;/p&gt;
&lt;p&gt;They sound like beginner questions because they were beginner questions.&lt;/p&gt;
&lt;p&gt;I was coming into software after spending many years in mechanical engineering and manufacturing.&lt;/p&gt;
&lt;p&gt;Software development had its own language, processes, and mental models.&lt;/p&gt;
&lt;p&gt;I had to learn them.&lt;/p&gt;
&lt;p&gt;But those questions turned out to be useful.&lt;/p&gt;
&lt;p&gt;Once I stopped seeing environments as boxes with different labels and started understanding what was actually different between them, I also became better at testing software.&lt;/p&gt;
&lt;p&gt;Different data.&lt;/p&gt;
&lt;p&gt;Different configuration.&lt;/p&gt;
&lt;p&gt;Different infrastructure.&lt;/p&gt;
&lt;p&gt;Different integrations.&lt;/p&gt;
&lt;p&gt;Different dependencies.&lt;/p&gt;
&lt;p&gt;Different failure modes.&lt;/p&gt;
&lt;p&gt;Environment differences aren't only a DevOps problem.&lt;/p&gt;
&lt;p&gt;They can change application behavior.&lt;/p&gt;
&lt;p&gt;And anything that changes application behavior should be interesting to QA.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;ci-was-another-world-i-wanted-to-understand&quot;&gt;CI was another world I wanted to understand&lt;/h3&gt;
&lt;p&gt;For some time, CI pipelines were something I mostly consumed.&lt;/p&gt;
&lt;p&gt;A job ran.&lt;/p&gt;
&lt;p&gt;Tests passed or failed.&lt;/p&gt;
&lt;p&gt;There was a report.&lt;/p&gt;
&lt;p&gt;Maybe I needed to investigate a failure.&lt;/p&gt;
&lt;p&gt;But the system behind it wasn't really something I understood deeply.&lt;/p&gt;
&lt;p&gt;Eventually that stopped being enough for me.&lt;/p&gt;
&lt;p&gt;I wanted to know:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What triggers the pipeline?&lt;/li&gt;
&lt;li&gt;What happens before my tests start?&lt;/li&gt;
&lt;li&gt;How are dependencies installed?&lt;/li&gt;
&lt;li&gt;Where does configuration come from?&lt;/li&gt;
&lt;li&gt;How are artifacts created?&lt;/li&gt;
&lt;li&gt;What happens when one stage fails?&lt;/li&gt;
&lt;li&gt;What happens after everything turns green?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once you start looking at CI this way, automated tests stop being isolated scripts.&lt;/p&gt;
&lt;p&gt;They become signals inside a much larger delivery system.&lt;/p&gt;
&lt;p&gt;That changed the way I looked at test automation.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;automation-made-the-boundaries-less-clear&quot;&gt;Automation made the boundaries less clear&lt;/h3&gt;
&lt;p&gt;My early QA work was mostly manual.&lt;/p&gt;
&lt;p&gt;Automation was something I admired in the work of other engineers.&lt;/p&gt;
&lt;p&gt;Later I learned Python, started building my own projects, and gradually moved deeper into automation.&lt;/p&gt;
&lt;p&gt;Today I work with Robot Framework and Playwright with TypeScript.&lt;/p&gt;
&lt;p&gt;And the deeper I went into automation, the more I had to understand everything around the test itself.&lt;/p&gt;
&lt;p&gt;Automated tests need environments.&lt;/p&gt;
&lt;p&gt;They need data.&lt;/p&gt;
&lt;p&gt;They need services.&lt;/p&gt;
&lt;p&gt;They need configuration.&lt;/p&gt;
&lt;p&gt;They need reliable execution.&lt;/p&gt;
&lt;p&gt;They need CI.&lt;/p&gt;
&lt;p&gt;And when they fail, the reason isn't always the test.&lt;/p&gt;
&lt;p&gt;Sometimes the application is broken.&lt;/p&gt;
&lt;p&gt;Sometimes the environment is broken.&lt;/p&gt;
&lt;p&gt;Sometimes a dependency is unavailable.&lt;/p&gt;
&lt;p&gt;Sometimes the test data is wrong.&lt;/p&gt;
&lt;p&gt;Sometimes deployment changed something.&lt;/p&gt;
&lt;p&gt;Sometimes infrastructure is the real problem.&lt;/p&gt;
&lt;p&gt;The more automation I worked with, the harder it became to say:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;That's not QA. That's DevOps.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The boundary simply wasn't that clean anymore.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;a-failed-test-doesn-t-always-mean-a-product-defect&quot;&gt;A failed test doesn't always mean a product defect&lt;/h3&gt;
&lt;p&gt;This became an important lesson for me.&lt;/p&gt;
&lt;p&gt;Imagine an end-to-end test fails.&lt;/p&gt;
&lt;p&gt;At first glance, all we know is:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;TEST FAILED
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But the actual cause might be:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Application bug
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Environment instability
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;API unavailable
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Deployment issue
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Network problem
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Broken test data
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or simply:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Test bug
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The failing test tells us that something didn't behave as expected.&lt;/p&gt;
&lt;p&gt;Understanding &lt;strong&gt;why&lt;/strong&gt; often requires knowledge outside traditional testing.&lt;/p&gt;
&lt;p&gt;Logs.&lt;/p&gt;
&lt;p&gt;Processes.&lt;/p&gt;
&lt;p&gt;Services.&lt;/p&gt;
&lt;p&gt;APIs.&lt;/p&gt;
&lt;p&gt;Containers.&lt;/p&gt;
&lt;p&gt;CI jobs.&lt;/p&gt;
&lt;p&gt;Deployment history.&lt;/p&gt;
&lt;p&gt;Metrics.&lt;/p&gt;
&lt;p&gt;Infrastructure.&lt;/p&gt;
&lt;p&gt;The more of that context I understood, the faster I could investigate failures.&lt;/p&gt;
&lt;p&gt;And that was the point where DevOps knowledge stopped feeling like something belonging to another team.&lt;/p&gt;
&lt;p&gt;It started becoming useful QA knowledge.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;linux-helped-more-than-i-expected&quot;&gt;Linux helped more than I expected&lt;/h3&gt;
&lt;p&gt;One thing made this transition easier for me.&lt;/p&gt;
&lt;p&gt;Linux had already been part of my life for years.&lt;/p&gt;
&lt;p&gt;I had started experimenting with Linux long before I entered QA, and Bash never felt completely foreign to me.&lt;/p&gt;
&lt;p&gt;So when my work started moving closer to CI, servers, logs, containers, processes, and infrastructure, there was already something familiar underneath it.&lt;/p&gt;
&lt;p&gt;Commands and tools like:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ps
grep
curl
tail
journalctl
ssh
docker
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;became useful ways to investigate what the system was actually doing.&lt;/p&gt;
&lt;p&gt;And that reinforced something I gradually came to believe:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;A QA engineer doesn't need to become a full DevOps engineer, but understanding the environment where the software actually runs can make you much better at QA.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;then-i-started-looking-at-observability&quot;&gt;Then I started looking at observability&lt;/h3&gt;
&lt;p&gt;Over time, my curiosity also moved toward alerting and observability.&lt;/p&gt;
&lt;p&gt;And that opened another question.&lt;/p&gt;
&lt;p&gt;Traditional testing usually asks:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Does the application behave correctly before release?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Observability asks:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Is the application still behaving correctly after release?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Those worlds are closer than they might seem.&lt;/p&gt;
&lt;p&gt;A test may tell me:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Checkout completed successfully in staging.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Monitoring may later tell me:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Checkout error rate increased after deployment.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Both are quality signals.&lt;/p&gt;
&lt;p&gt;They simply exist at different points in the software lifecycle.&lt;/p&gt;
&lt;p&gt;Once I started thinking about quality this way, production stopped feeling like the place where QA responsibility simply ends.&lt;/p&gt;
&lt;p&gt;Production became another source of evidence.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;qa-can-learn-a-lot-from-devops&quot;&gt;QA can learn a lot from DevOps&lt;/h3&gt;
&lt;p&gt;I don't think every QA engineer needs to become an infrastructure specialist.&lt;/p&gt;
&lt;p&gt;That's not the point.&lt;/p&gt;
&lt;p&gt;But I do think QA benefits enormously from understanding things like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CI/CD&lt;/li&gt;
&lt;li&gt;Linux&lt;/li&gt;
&lt;li&gt;containers&lt;/li&gt;
&lt;li&gt;environment configuration&lt;/li&gt;
&lt;li&gt;deployment strategies&lt;/li&gt;
&lt;li&gt;logs&lt;/li&gt;
&lt;li&gt;monitoring&lt;/li&gt;
&lt;li&gt;alerting&lt;/li&gt;
&lt;li&gt;rollback&lt;/li&gt;
&lt;li&gt;infrastructure basics&lt;/li&gt;
&lt;li&gt;application dependencies&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Because all of these things affect software behavior.&lt;/p&gt;
&lt;p&gt;And understanding software behavior is exactly what QA is trying to do.&lt;/p&gt;
&lt;p&gt;The deeper I went into these areas, the more I realized that testing a feature in isolation only gives us one perspective.&lt;/p&gt;
&lt;p&gt;Users don't interact with test cases.&lt;/p&gt;
&lt;p&gt;They interact with the entire running system.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;devops-changed-the-questions-i-ask&quot;&gt;DevOps changed the questions I ask&lt;/h3&gt;
&lt;p&gt;Earlier in my QA career, many of my questions were focused on functionality.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Does login work?

Can the user complete checkout?

Does the API return the expected response?

Does the validation behave correctly?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Those questions still matter.&lt;/p&gt;
&lt;p&gt;But now I also find myself asking:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;What happens if this dependency becomes unavailable?

How will we know if this starts failing in production?

What happens if deployment fails halfway through?

Can we roll this back?

What changed between environments?

What evidence do we have that the release is healthy?

Who notices first when something goes wrong?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Those aren't purely testing questions.&lt;/p&gt;
&lt;p&gt;They are software delivery questions.&lt;/p&gt;
&lt;p&gt;And I think QA belongs in those conversations.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;i-didn-t-move-toward-devops-because-i-wanted-to-leave-qa&quot;&gt;I didn't move toward DevOps because I wanted to leave QA&lt;/h3&gt;
&lt;p&gt;This is probably the most important part.&lt;/p&gt;
&lt;p&gt;I wasn't trying to escape QA.&lt;/p&gt;
&lt;p&gt;I wasn't thinking:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Testing isn't technical enough. I need to become DevOps.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It happened much more naturally than that.&lt;/p&gt;
&lt;p&gt;QA kept giving me questions that testing alone couldn't answer.&lt;/p&gt;
&lt;p&gt;A failed automated test led me to logs.&lt;/p&gt;
&lt;p&gt;Logs led me to services.&lt;/p&gt;
&lt;p&gt;Services led me to containers.&lt;/p&gt;
&lt;p&gt;Containers led me to infrastructure.&lt;/p&gt;
&lt;p&gt;CI led me to deployment.&lt;/p&gt;
&lt;p&gt;Deployment led me to monitoring and alerting.&lt;/p&gt;
&lt;p&gt;And eventually all of those things led me toward release engineering.&lt;/p&gt;
&lt;p&gt;It wasn't really a career switch.&lt;/p&gt;
&lt;p&gt;It was an expanding field of view.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;quality-doesn-t-stop-where-testing-stops&quot;&gt;Quality doesn't stop where testing stops&lt;/h3&gt;
&lt;p&gt;Today I think about software quality very differently than when I entered QA.&lt;/p&gt;
&lt;p&gt;Quality isn't one department.&lt;/p&gt;
&lt;p&gt;It isn't a test suite.&lt;/p&gt;
&lt;p&gt;It isn't a green automation report.&lt;/p&gt;
&lt;p&gt;And it isn't one stage inside a pipeline.&lt;/p&gt;
&lt;p&gt;Quality exists across the whole software delivery lifecycle.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;CODE
 ↓
BUILD
 ↓
TEST
 ↓
PACKAGE
 ↓
DEPLOY
 ↓
OPERATE
 ↓
OBSERVE
 ↓
LEARN
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Problems can appear anywhere.&lt;/p&gt;
&lt;p&gt;Understanding more of that lifecycle gives QA more context for the decisions we make.&lt;/p&gt;
&lt;p&gt;It helps us test better.&lt;/p&gt;
&lt;p&gt;Debug faster.&lt;/p&gt;
&lt;p&gt;Ask better questions.&lt;/p&gt;
&lt;p&gt;And recognize risks that might never appear inside a normal test case.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;eventually-i-started-asking-a-different-question&quot;&gt;Eventually I started asking a different question&lt;/h3&gt;
&lt;p&gt;Once I started looking beyond testing, something else became difficult to ignore.&lt;/p&gt;
&lt;p&gt;Suppose we have:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Build        PASS
Tests        PASS
Security     PASS
Deployment   READY
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Does that automatically mean we should release?&lt;/p&gt;
&lt;p&gt;What if the change is unusually large?&lt;/p&gt;
&lt;p&gt;What if it contains a database migration?&lt;/p&gt;
&lt;p&gt;What if rollback hasn't been tested?&lt;/p&gt;
&lt;p&gt;What if monitoring is incomplete?&lt;/p&gt;
&lt;p&gt;What if QA coverage is weaker than usual?&lt;/p&gt;
&lt;p&gt;Nothing is necessarily red.&lt;/p&gt;
&lt;p&gt;But that doesn't automatically make the release low-risk.&lt;/p&gt;
&lt;p&gt;That was the point where my interest started moving beyond deployment itself.&lt;/p&gt;
&lt;p&gt;From:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Can we release this?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;to:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Should we release this?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Those are two very different questions.&lt;/p&gt;
&lt;p&gt;And that is where release engineering became especially interesting to me.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I didn't move toward DevOps because I wanted to stop being a QA engineer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I moved toward it because I wanted to understand what happens after QA says “passed”.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And the more I understood, the clearer it became that testing is only one part of software quality.&lt;/p&gt;
&lt;p&gt;The rest of the story happens before, around, and after it.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;This is the first article in my &lt;strong&gt;From QA to DevOps / Release Engineering&lt;/strong&gt; series.&lt;/p&gt;
&lt;p&gt;In the next parts, I want to write about CI/CD from a QA perspective, debugging beyond the test layer, why observability matters to testers, and how understanding deployment and infrastructure changed the way I think about release risk.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/25760/what-happens-after-qa-says-passed</guid>
<pubDate>Sat, 29 Aug 2026 14:15:25 +0000</pubDate>
</item>
<item>
<title>How I Got Into QA — And Why I Stayed</title>
<link>https://coderlegion.com/25759/how-i-got-into-qa-and-why-i-stayed</link>
<description>&lt;p&gt;My journey into QA didn't start with a testing course.&lt;/p&gt;
&lt;p&gt;It didn't even start with software testing.&lt;/p&gt;
&lt;p&gt;It probably started when I was around four years old.&lt;/p&gt;
&lt;p&gt;Every summer, I used to spend two or three months at my great-grandmother's house in the Czech Republic. I would spend entire days with my mother's cousin in a small storage room upstairs.&lt;/p&gt;
&lt;p&gt;For most people, a storage room probably doesn't sound like the beginning of a career in technology.&lt;/p&gt;
&lt;p&gt;For me, somehow, it was.&lt;/p&gt;
&lt;p&gt;That was where my fascination with computers started.&lt;/p&gt;
&lt;p&gt;I didn't know anything about QA, software development, CI/CD, or automation back then.&lt;/p&gt;
&lt;p&gt;I just knew that computers were interesting.&lt;/p&gt;
&lt;p&gt;And I wanted to understand them.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;my-first-steps-into-programming&quot;&gt;My first steps into programming&lt;/h3&gt;
&lt;p&gt;Later, while I was still in elementary school, I started attending a programming course.&lt;/p&gt;
&lt;p&gt;We worked with PMD 85 computers, which were among the more accessible computers in our part of the world at the time.&lt;/p&gt;
&lt;p&gt;We learned things like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;BASIC&lt;/li&gt;
&lt;li&gt;Pascal&lt;/li&gt;
&lt;li&gt;Turbo Pascal&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Looking back, those machines were incredibly limited compared to what we have today.&lt;/p&gt;
&lt;p&gt;But that almost made them more interesting.&lt;/p&gt;
&lt;p&gt;There wasn't an endless ecosystem of frameworks, cloud services, package managers, AI assistants, or Stack Overflow answers waiting for you.&lt;/p&gt;
&lt;p&gt;If you wanted the computer to do something, you had to understand what you were telling it to do.&lt;/p&gt;
&lt;p&gt;Eventually, I got my first computer of my own: a Didaktik Compact.&lt;/p&gt;
&lt;p&gt;That changed things again.&lt;/p&gt;
&lt;p&gt;I started learning programming by myself.&lt;/p&gt;
&lt;p&gt;There was no clear career plan behind it.&lt;/p&gt;
&lt;p&gt;I wasn't thinking:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;One day I'm going to become a software engineer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I was simply curious.&lt;/p&gt;
&lt;p&gt;I wanted to know how things worked.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;then-came-linux&quot;&gt;Then came Linux&lt;/h3&gt;
&lt;p&gt;Somewhere along that journey I discovered Linux.&lt;/p&gt;
&lt;p&gt;And Linux stayed with me.&lt;/p&gt;
&lt;p&gt;I started experimenting with some of the distributions that were available at the time, trying to understand the operating system and what I could do with it.&lt;/p&gt;
&lt;p&gt;That relationship never really disappeared.&lt;/p&gt;
&lt;p&gt;Even today, Linux and Bash are still part of the way I work and think about technology.&lt;/p&gt;
&lt;p&gt;There was a period, especially during my teenage years, when programming became much less important to me.&lt;/p&gt;
&lt;p&gt;Like a lot of teenagers, I spent much more time playing games than writing code.&lt;/p&gt;
&lt;p&gt;Programming moved into the background.&lt;/p&gt;
&lt;p&gt;Linux didn't.&lt;/p&gt;
&lt;p&gt;It was always somewhere nearby.&lt;/p&gt;
&lt;p&gt;Technology never completely left my life.&lt;/p&gt;
&lt;p&gt;But my professional future ended up taking a very different direction.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;a-20-year-detour-through-mechanical-engineering&quot;&gt;A 20-year detour through mechanical engineering&lt;/h3&gt;
&lt;p&gt;When I reached secondary school, I chose a field that wasn't exactly the future I had imagined for myself.&lt;/p&gt;
&lt;p&gt;I studied mechanical engineering.&lt;/p&gt;
&lt;p&gt;And that decision ended up defining roughly the next twenty years of my professional life.&lt;/p&gt;
&lt;p&gt;I worked as a mechanical designer and technologist.&lt;/p&gt;
&lt;p&gt;I worked with manufacturing.&lt;/p&gt;
&lt;p&gt;I programmed CNC machines.&lt;/p&gt;
&lt;p&gt;I worked on the production of 3D components.&lt;/p&gt;
&lt;p&gt;So even though I had moved away from traditional software development, programming never disappeared completely.&lt;/p&gt;
&lt;p&gt;It simply changed form.&lt;/p&gt;
&lt;p&gt;Instead of writing applications, I was telling machines how to manufacture physical components.&lt;/p&gt;
&lt;p&gt;There is actually more overlap between these worlds than it might seem.&lt;/p&gt;
&lt;p&gt;You still need to think logically.&lt;/p&gt;
&lt;p&gt;You still need to understand a process.&lt;/p&gt;
&lt;p&gt;You still need to understand what can go wrong.&lt;/p&gt;
&lt;p&gt;You still need precision.&lt;/p&gt;
&lt;p&gt;And mistakes can have very real consequences.&lt;/p&gt;
&lt;p&gt;But somewhere in the back of my mind, the interest in IT was still there.&lt;/p&gt;
&lt;p&gt;For years.&lt;/p&gt;
&lt;p&gt;I just never really made the move.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;sometimes-another-person-sees-the-path-before-you-do&quot;&gt;Sometimes another person sees the path before you do&lt;/h3&gt;
&lt;p&gt;Then my life changed.&lt;/p&gt;
&lt;p&gt;I met the woman who later became my wife.&lt;/p&gt;
&lt;p&gt;She knew that IT had been something I had dreamed about since childhood.&lt;/p&gt;
&lt;p&gt;And at some point she pushed me to finally do something about it.&lt;/p&gt;
&lt;p&gt;She encouraged me to take an entry-level IT course.&lt;/p&gt;
&lt;p&gt;I agreed, but with one condition:&lt;/p&gt;
&lt;p&gt;She had to take the course too.&lt;/p&gt;
&lt;p&gt;IT wasn't her field at all, which actually made me respect her even more for doing it with me.&lt;/p&gt;
&lt;p&gt;We went through the course together.&lt;/p&gt;
&lt;p&gt;I spent a lot of time helping her along the way, especially with the technical parts and the final assignment.&lt;/p&gt;
&lt;p&gt;By the end, it sometimes felt like I had completed the course twice.&lt;/p&gt;
&lt;p&gt;And strangely enough, I didn't mind.&lt;/p&gt;
&lt;p&gt;I still don't.&lt;/p&gt;
&lt;p&gt;Because that course became the point where something that had been sitting in the background of my life for years finally became real.&lt;/p&gt;
&lt;p&gt;It was the beginning of my QA career.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;my-first-qa-job&quot;&gt;My first QA job&lt;/h3&gt;
&lt;p&gt;My first job in IT was at SolarWinds in the Czech Republic.&lt;/p&gt;
&lt;p&gt;Getting that job meant another major change.&lt;/p&gt;
&lt;p&gt;We moved to Brno because of it.&lt;/p&gt;
&lt;p&gt;I had finally entered the industry I had wanted to be part of for so long.&lt;/p&gt;
&lt;p&gt;And then reality hit me.&lt;/p&gt;
&lt;p&gt;I knew far less than I thought I did.&lt;/p&gt;
&lt;p&gt;Almost everything was new.&lt;/p&gt;
&lt;p&gt;Processes were new.&lt;/p&gt;
&lt;p&gt;Terminology was new.&lt;/p&gt;
&lt;p&gt;The way software teams worked was new.&lt;/p&gt;
&lt;p&gt;Even something that seems completely normal to me today was confusing at the beginning:&lt;/p&gt;
&lt;p&gt;DEV.&lt;/p&gt;
&lt;p&gt;QA.&lt;/p&gt;
&lt;p&gt;STG.&lt;/p&gt;
&lt;p&gt;PROD.&lt;/p&gt;
&lt;p&gt;Different environments, different responsibilities, different stages of the delivery process.&lt;/p&gt;
&lt;p&gt;Today it sounds almost trivial.&lt;/p&gt;
&lt;p&gt;At the time, it wasn't.&lt;/p&gt;
&lt;p&gt;I had spent years working in technical environments, programming CNC machines and solving engineering problems.&lt;/p&gt;
&lt;p&gt;But software development had its own language and its own mental model.&lt;/p&gt;
&lt;p&gt;I had to learn all of it.&lt;/p&gt;
&lt;p&gt;And I had to learn it quickly.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-person-who-helped-me-survive-the-beginning&quot;&gt;The person who helped me survive the beginning&lt;/h3&gt;
&lt;p&gt;One of the people I still remember very clearly from that period is my buddy, Ventsislav.&lt;/p&gt;
&lt;p&gt;I owe him a lot.&lt;/p&gt;
&lt;p&gt;Mostly because of his patience.&lt;/p&gt;
&lt;p&gt;When you're new to an industry, there are questions you don't even know how to formulate yet.&lt;/p&gt;
&lt;p&gt;Sometimes you don't understand a process well enough to know what part of it you're actually confused about.&lt;/p&gt;
&lt;p&gt;Having someone who is willing to explain those things without making you feel stupid makes an enormous difference.&lt;/p&gt;
&lt;p&gt;Ventsislav did that for me.&lt;/p&gt;
&lt;p&gt;He helped me understand how the environment worked.&lt;/p&gt;
&lt;p&gt;How the processes connected.&lt;/p&gt;
&lt;p&gt;What QA was actually responsible for.&lt;/p&gt;
&lt;p&gt;And how software moved through the organization.&lt;/p&gt;
&lt;p&gt;At the beginning, I needed that help constantly.&lt;/p&gt;
&lt;p&gt;But slowly, things started clicking.&lt;/p&gt;
&lt;p&gt;And eventually something happened that meant a lot to me.&lt;/p&gt;
&lt;p&gt;I became the buddy.&lt;/p&gt;
&lt;p&gt;A new colleague joined, and this time I was the one mentoring and helping someone else understand the systems and processes.&lt;/p&gt;
&lt;p&gt;That was probably one of the first moments when I realized just how far I had moved from those first confusing weeks.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;at-first-automation-looked-like-magic&quot;&gt;At first, automation looked like magic&lt;/h3&gt;
&lt;p&gt;For a large part of my early QA career, my work was primarily manual.&lt;/p&gt;
&lt;p&gt;Automation existed around me, but it was mostly something I admired other people for doing.&lt;/p&gt;
&lt;p&gt;I could interact with automated tests.&lt;/p&gt;
&lt;p&gt;I could change some parameters.&lt;/p&gt;
&lt;p&gt;I could make smaller adjustments.&lt;/p&gt;
&lt;p&gt;But building automation myself felt like another level.&lt;/p&gt;
&lt;p&gt;Something other people knew how to do.&lt;/p&gt;
&lt;p&gt;I think many manual testers know this feeling.&lt;/p&gt;
&lt;p&gt;You look at automation engineers writing code and think:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;I'd like to be able to do that.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;But there is a big difference between wanting to understand something and actually sitting down and learning it.&lt;/p&gt;
&lt;p&gt;Eventually, I did.&lt;/p&gt;
&lt;p&gt;I took a Python course.&lt;/p&gt;
&lt;p&gt;Then I started building my own projects.&lt;/p&gt;
&lt;p&gt;And gradually, automation stopped looking like something that belonged to other engineers.&lt;/p&gt;
&lt;p&gt;It became something I could do too.&lt;/p&gt;
&lt;p&gt;That shift changed my career again.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;from-manual-qa-to-automation&quot;&gt;From manual QA to automation&lt;/h3&gt;
&lt;p&gt;Today I work at Bata as a QA Automation Engineer.&lt;/p&gt;
&lt;p&gt;My work looks very different from my first QA job.&lt;/p&gt;
&lt;p&gt;I work with Robot Framework.&lt;/p&gt;
&lt;p&gt;I work with Playwright and TypeScript.&lt;/p&gt;
&lt;p&gt;I work with automated testing.&lt;/p&gt;
&lt;p&gt;I deal with APIs, systems, environments, CI/CD processes, and the wider software delivery lifecycle.&lt;/p&gt;
&lt;p&gt;And over time, my curiosity has pushed me even further.&lt;/p&gt;
&lt;p&gt;Into DevOps.&lt;/p&gt;
&lt;p&gt;Into alerting and observability.&lt;/p&gt;
&lt;p&gt;Into what happens before and after testing.&lt;/p&gt;
&lt;p&gt;Into understanding not just whether a feature works, but how the whole system behaves.&lt;/p&gt;
&lt;p&gt;That curiosity is probably the one thing that connects every part of my career.&lt;/p&gt;
&lt;p&gt;The four-year-old kid fascinated by computers.&lt;/p&gt;
&lt;p&gt;The student programming a PMD 85.&lt;/p&gt;
&lt;p&gt;The teenager experimenting with Linux.&lt;/p&gt;
&lt;p&gt;The mechanical engineer programming CNC machines.&lt;/p&gt;
&lt;p&gt;The new QA engineer trying to understand the difference between DEV, QA, STG, and PROD.&lt;/p&gt;
&lt;p&gt;And the automation engineer I am today.&lt;/p&gt;
&lt;p&gt;Different technologies.&lt;/p&gt;
&lt;p&gt;Different industries.&lt;/p&gt;
&lt;p&gt;Same question:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;How does this actually work?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;qa-changed-the-way-i-look-at-software&quot;&gt;QA changed the way I look at software&lt;/h3&gt;
&lt;p&gt;When I started in QA, testing was much more concrete in my mind.&lt;/p&gt;
&lt;p&gt;There is a requirement.&lt;/p&gt;
&lt;p&gt;There is an application.&lt;/p&gt;
&lt;p&gt;You test whether it works.&lt;/p&gt;
&lt;p&gt;You find bugs.&lt;/p&gt;
&lt;p&gt;You report them.&lt;/p&gt;
&lt;p&gt;Over time, my view changed.&lt;/p&gt;
&lt;p&gt;Quality isn't just about finding bugs.&lt;/p&gt;
&lt;p&gt;A perfectly implemented feature can still become part of a risky release.&lt;/p&gt;
&lt;p&gt;A test suite can pass while something important remains untested.&lt;/p&gt;
&lt;p&gt;A deployment can succeed while the system becomes harder to operate.&lt;/p&gt;
&lt;p&gt;A pipeline can be green while the team still doesn't have enough information to confidently release.&lt;/p&gt;
&lt;p&gt;The further I went into automation, CI/CD, infrastructure, and release processes, the more I started looking beyond individual test cases.&lt;/p&gt;
&lt;p&gt;Instead of only asking:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Does this work?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I started asking:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;What could still go wrong?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That question eventually changed the direction of my work again.&lt;/p&gt;
&lt;p&gt;But that's another part of the story.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;looking-back&quot;&gt;Looking back&lt;/h3&gt;
&lt;p&gt;I didn't take the shortest path into IT.&lt;/p&gt;
&lt;p&gt;Not even close.&lt;/p&gt;
&lt;p&gt;There was childhood programming.&lt;/p&gt;
&lt;p&gt;Linux.&lt;/p&gt;
&lt;p&gt;A long break.&lt;/p&gt;
&lt;p&gt;Twenty years in mechanical engineering.&lt;/p&gt;
&lt;p&gt;CNC programming.&lt;/p&gt;
&lt;p&gt;An IT course.&lt;/p&gt;
&lt;p&gt;A move to another city.&lt;/p&gt;
&lt;p&gt;A first QA job where almost everything felt unfamiliar.&lt;/p&gt;
&lt;p&gt;Manual testing.&lt;/p&gt;
&lt;p&gt;Python.&lt;/p&gt;
&lt;p&gt;Automation.&lt;/p&gt;
&lt;p&gt;Robot Framework.&lt;/p&gt;
&lt;p&gt;Playwright.&lt;/p&gt;
&lt;p&gt;DevOps.&lt;/p&gt;
&lt;p&gt;And I'm still learning.&lt;/p&gt;
&lt;p&gt;Maybe that's actually the part I enjoy most.&lt;/p&gt;
&lt;p&gt;I don't think reaching a point where you finally &quot;know enough&quot; is the goal.&lt;/p&gt;
&lt;p&gt;Every time I understand one part of software delivery better, I discover another layer underneath it.&lt;/p&gt;
&lt;p&gt;QA led me to automation.&lt;/p&gt;
&lt;p&gt;Automation led me toward CI/CD.&lt;/p&gt;
&lt;p&gt;CI/CD made me interested in DevOps and release engineering.&lt;/p&gt;
&lt;p&gt;And release engineering made me start asking much bigger questions about how teams decide whether software is actually ready to ship.&lt;/p&gt;
&lt;p&gt;So if I had to explain why I stayed in QA, I wouldn't say it's because I enjoy finding bugs.&lt;/p&gt;
&lt;p&gt;I stayed because QA gives me a reason to understand systems.&lt;/p&gt;
&lt;p&gt;To question assumptions.&lt;/p&gt;
&lt;p&gt;To investigate failures.&lt;/p&gt;
&lt;p&gt;And to keep asking one of my favorite questions:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What could still go wrong?&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;This is the first article in my &lt;strong&gt;My QA Journey&lt;/strong&gt; series.&lt;/p&gt;
&lt;p&gt;In the next parts, I want to write about the move from manual testing to automation, the mistakes I made along the way, what I learned from developers and DevOps, and why understanding what happens &lt;em&gt;after QA says &quot;passed&quot;&lt;/em&gt; completely changed the way I think about software quality.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/25759/how-i-got-into-qa-and-why-i-stayed</guid>
<pubDate>Sat, 29 Aug 2026 13:58:59 +0000</pubDate>
</item>
<item>
<title>CI Is Green. What Could Still Go Wrong?</title>
<link>https://coderlegion.com/25304/ci-is-green-what-could-still-go-wrong</link>
<description>&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/jkbnem9ae2wkqfe61is8.png&quot; alt=&quot;Image description&quot;&gt;&lt;br&gt;
&lt;strong&gt;A green CI pipeline is a nice feeling.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The build passed.&lt;br&gt;
Tests are green.&lt;br&gt;
Linting is clean.&lt;br&gt;
Nothing obvious is on fire.&lt;/p&gt;
&lt;p&gt;For a few seconds, it feels like the release question has already been answered.&lt;/p&gt;
&lt;p&gt;It hasn't.&lt;/p&gt;
&lt;p&gt;A green pipeline tells you something useful: the checks you configured have passed under the conditions in which they were executed.&lt;/p&gt;
&lt;p&gt;That is not the same thing as saying the release is safe.&lt;/p&gt;
&lt;p&gt;And the gap between those two ideas is where a lot of production problems begin.&lt;/p&gt;
&lt;p&gt;I touched on this in my previous article about why a green CI pipeline can create a false sense of security. But there is another question that deserves more attention:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If CI is green, what can still go wrong?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Quite a lot, actually.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CI only knows what you taught it to check&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is probably the most important limitation.&lt;/p&gt;
&lt;p&gt;CI is not intelligent by default.&lt;/p&gt;
&lt;p&gt;It does not understand your product, your users, your business risk, or the weird operational history of your system.&lt;/p&gt;
&lt;p&gt;It runs instructions.&lt;/p&gt;
&lt;p&gt;If those instructions cover the right risks, great.&lt;/p&gt;
&lt;p&gt;If they don't, the pipeline can be perfectly green while the release is still dangerous.&lt;/p&gt;
&lt;p&gt;This is not really a failure of CI.&lt;/p&gt;
&lt;p&gt;It is a failure of interpretation.&lt;/p&gt;
&lt;p&gt;We often treat CI as if it has answered a bigger question than it actually has.&lt;/p&gt;
&lt;p&gt;The pipeline says:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&quot;The checks I know about passed.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Humans often hear:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&quot;This release is safe.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Those are very different statements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The code can be correct and the release can still fail&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Imagine a change that passes every unit test and every integration test.&lt;/p&gt;
&lt;p&gt;The code itself is fine.&lt;/p&gt;
&lt;p&gt;Then it reaches production and fails because of configuration.&lt;/p&gt;
&lt;p&gt;Wrong environment variable.&lt;/p&gt;
&lt;p&gt;Missing secret.&lt;/p&gt;
&lt;p&gt;Different feature flag state.&lt;/p&gt;
&lt;p&gt;A service points to the wrong endpoint.&lt;/p&gt;
&lt;p&gt;A timeout is configured differently in production.&lt;/p&gt;
&lt;p&gt;A permission exists in staging but not in production.&lt;/p&gt;
&lt;p&gt;None of those problems necessarily mean your tests were bad.&lt;/p&gt;
&lt;p&gt;They mean the release depended on conditions outside the scope of those tests.&lt;/p&gt;
&lt;p&gt;This is one of the reasons I think we should stop treating release readiness as purely a testing problem.&lt;/p&gt;
&lt;p&gt;Testing is part of it.&lt;/p&gt;
&lt;p&gt;It is not the whole thing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Database migrations are a good example&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Database changes are one of those areas where &quot;green&quot; can be misleading.&lt;/p&gt;
&lt;p&gt;The migration itself may be syntactically correct.&lt;/p&gt;
&lt;p&gt;Tests may pass against a fresh database.&lt;/p&gt;
&lt;p&gt;Everything can look completely normal.&lt;/p&gt;
&lt;p&gt;But production has something your test environment often does not have:&lt;/p&gt;
&lt;p&gt;history.&lt;/p&gt;
&lt;p&gt;Real data.&lt;/p&gt;
&lt;p&gt;Old records.&lt;/p&gt;
&lt;p&gt;Unexpected null values.&lt;/p&gt;
&lt;p&gt;Large tables.&lt;/p&gt;
&lt;p&gt;Long-running transactions.&lt;/p&gt;
&lt;p&gt;Different indexes.&lt;/p&gt;
&lt;p&gt;Different traffic patterns.&lt;/p&gt;
&lt;p&gt;A migration that takes two seconds in CI can behave very differently against a production dataset that has existed for six years.&lt;/p&gt;
&lt;p&gt;The pipeline can be green because nothing it executed was technically wrong.&lt;/p&gt;
&lt;p&gt;The release can still be risky because the environment changed the meaning of that change.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dependencies can change the picture&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Modern software rarely runs in isolation.&lt;/p&gt;
&lt;p&gt;A release can depend on:&lt;/p&gt;
&lt;p&gt;another internal service&lt;br&gt;
a third-party API&lt;br&gt;
a package update&lt;br&gt;
a cloud service&lt;br&gt;
a message queue&lt;br&gt;
a payment provider&lt;br&gt;
a database&lt;br&gt;
an authentication system&lt;/p&gt;
&lt;p&gt;Your own repository may be completely healthy.&lt;/p&gt;
&lt;p&gt;The dependency chain around it may not be.&lt;/p&gt;
&lt;p&gt;Maybe another service has not deployed the expected API yet.&lt;/p&gt;
&lt;p&gt;Maybe a backwards-compatibility assumption is wrong.&lt;/p&gt;
&lt;p&gt;Maybe one dependency is already degraded.&lt;/p&gt;
&lt;p&gt;Maybe the release introduces a combination of versions that nobody has actually tested together.&lt;/p&gt;
&lt;p&gt;Again, CI may remain perfectly green.&lt;/p&gt;
&lt;p&gt;It tested what it could see.&lt;/p&gt;
&lt;p&gt;The release depends on more than that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Passing tests do not mean the right tests ran&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This one is uncomfortable, because it sounds obvious once you say it.&lt;/p&gt;
&lt;p&gt;A test suite can have a 100% pass rate while still telling you very little about the change you are about to release.&lt;/p&gt;
&lt;p&gt;The interesting question is not:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;How many tests passed?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It is:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Did we test the things that matter for this release?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Those are not equivalent.&lt;/p&gt;
&lt;p&gt;If somebody changes a critical authentication flow and your pipeline runs 3,000 tests mostly covering catalog functionality, the number &lt;em&gt;&quot;3,000 passed&quot;&lt;/em&gt; looks impressive.&lt;/p&gt;
&lt;p&gt;But what does it actually tell you about authentication risk?&lt;/p&gt;
&lt;p&gt;Not much.&lt;/p&gt;
&lt;p&gt;This is why I find the concept of risk coverage more useful than simply looking at test coverage or test count.&lt;/p&gt;
&lt;p&gt;What changed?&lt;/p&gt;
&lt;p&gt;What can that change affect?&lt;/p&gt;
&lt;p&gt;Which checks give us evidence about those areas?&lt;/p&gt;
&lt;p&gt;That context matters more than a big green number.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Feature flags do not magically remove risk&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Feature flags are useful.&lt;/p&gt;
&lt;p&gt;Very useful.&lt;/p&gt;
&lt;p&gt;But sometimes they become another source of false confidence.&lt;/p&gt;
&lt;p&gt;The thinking becomes:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&quot;It's behind a flag, so the release is safe.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Maybe.&lt;/p&gt;
&lt;p&gt;But the code still shipped.&lt;/p&gt;
&lt;p&gt;The flag configuration itself can be wrong.&lt;/p&gt;
&lt;p&gt;The disabled path may affect initialization.&lt;/p&gt;
&lt;p&gt;The new code may introduce dependencies before the flag is evaluated.&lt;/p&gt;
&lt;p&gt;The wrong audience may receive the feature.&lt;/p&gt;
&lt;p&gt;The rollback path may not behave the way you expect.&lt;/p&gt;
&lt;p&gt;Feature flags reduce certain kinds of risk.&lt;/p&gt;
&lt;p&gt;They do not eliminate release risk.&lt;/p&gt;
&lt;p&gt;That distinction matters.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rollback is not a guarantee either&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Another sentence I hear in software teams is some version of:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&quot;If something goes wrong, we'll just roll it back.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;That can be a perfectly reasonable risk strategy.&lt;/p&gt;
&lt;p&gt;But &quot;rollback exists&quot; and &quot;rollback is safe&quot; are not the same thing.&lt;/p&gt;
&lt;p&gt;What happens if the release includes a destructive migration?&lt;/p&gt;
&lt;p&gt;What happens if new data has already been written in a new format?&lt;/p&gt;
&lt;p&gt;What happens if another service starts depending on the new behavior?&lt;/p&gt;
&lt;p&gt;What happens if the release changes an external contract?&lt;/p&gt;
&lt;p&gt;Rollback sounds simple when we imagine software as a single binary moving backwards.&lt;/p&gt;
&lt;p&gt;Real systems are messier.&lt;/p&gt;
&lt;p&gt;Sometimes the release creates state that cannot be cleanly reversed.&lt;/p&gt;
&lt;p&gt;A green CI pipeline usually does not tell you whether your rollback strategy actually works.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Production traffic is different&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There is also a class of failures that only appears under real usage.&lt;/p&gt;
&lt;p&gt;Concurrency.&lt;/p&gt;
&lt;p&gt;Traffic spikes.&lt;/p&gt;
&lt;p&gt;Unusual request sequences.&lt;/p&gt;
&lt;p&gt;Large payloads.&lt;/p&gt;
&lt;p&gt;Rare account states.&lt;/p&gt;
&lt;p&gt;Slow upstream services.&lt;/p&gt;
&lt;p&gt;Network instability.&lt;/p&gt;
&lt;p&gt;Real users are extremely good at discovering combinations that test environments never produce.&lt;/p&gt;
&lt;p&gt;This is not an argument against automation.&lt;/p&gt;
&lt;p&gt;It is an argument for understanding what automation can and cannot prove.&lt;/p&gt;
&lt;p&gt;A test suite can give you evidence.&lt;/p&gt;
&lt;p&gt;It cannot give you certainty.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Observability matters before the release, not only after it&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;One thing I think teams often underestimate is operational readiness.&lt;/p&gt;
&lt;p&gt;Suppose the release does contain a problem.&lt;/p&gt;
&lt;p&gt;Will you notice?&lt;/p&gt;
&lt;p&gt;How quickly?&lt;/p&gt;
&lt;p&gt;Do you have the right metrics?&lt;/p&gt;
&lt;p&gt;Do you have logs around the changed area?&lt;/p&gt;
&lt;p&gt;Will an alert actually fire?&lt;/p&gt;
&lt;p&gt;Can you distinguish expected noise from a real regression?&lt;/p&gt;
&lt;p&gt;A release with some uncertainty but excellent observability can sometimes be safer than a release with more passing tests but poor visibility.&lt;/p&gt;
&lt;p&gt;Because release safety is not only about preventing every possible failure.&lt;/p&gt;
&lt;p&gt;It is also about limiting the damage when a failure happens.&lt;/p&gt;
&lt;p&gt;That changes the release decision.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Human context still matters&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Not every release risk is technical.&lt;/p&gt;
&lt;p&gt;Sometimes the biggest risk is simply that nobody has the full picture.&lt;/p&gt;
&lt;p&gt;QA knows about one unresolved issue.&lt;/p&gt;
&lt;p&gt;A developer knows the fix was rushed.&lt;/p&gt;
&lt;p&gt;Operations knows a dependent system has been unstable all afternoon.&lt;/p&gt;
&lt;p&gt;Product knows a feature absolutely must not reach one customer segment yet.&lt;/p&gt;
&lt;p&gt;Security raised a concern that is technically &quot;non-blocking.&quot;&lt;/p&gt;
&lt;p&gt;Each piece of information exists.&lt;/p&gt;
&lt;p&gt;But it exists in different places, owned by different people.&lt;/p&gt;
&lt;p&gt;Then the pipeline turns green.&lt;/p&gt;
&lt;p&gt;And everyone assumes somebody else must have checked the rest.&lt;/p&gt;
&lt;p&gt;This is where release processes become dangerous.&lt;/p&gt;
&lt;p&gt;Not because there was no information.&lt;/p&gt;
&lt;p&gt;Because the information never became part of the decision.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So what does green CI actually mean?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I still want green CI.&lt;/p&gt;
&lt;p&gt;Obviously.&lt;/p&gt;
&lt;p&gt;A red pipeline is useful information too, but I would much rather start from green.&lt;/p&gt;
&lt;p&gt;The problem is not the green status.&lt;/p&gt;
&lt;p&gt;The problem is giving that status more authority than it deserves.&lt;/p&gt;
&lt;p&gt;For me, a green pipeline should mean something closer to:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;The automated checks we currently require did not detect a blocking problem.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That is a strong signal.&lt;/p&gt;
&lt;p&gt;It is not yet a release decision.&lt;/p&gt;
&lt;p&gt;A real release decision needs more context.&lt;/p&gt;
&lt;p&gt;Depending on the system, I would want to know things like:&lt;/p&gt;
&lt;p&gt;What changed?&lt;br&gt;
How risky is that area?&lt;br&gt;
Which relevant tests actually ran?&lt;br&gt;
Are there unresolved defects?&lt;br&gt;
Are dependencies healthy and compatible?&lt;br&gt;
Are migrations involved?&lt;br&gt;
Are security checks clean?&lt;br&gt;
Do we have sufficient observability?&lt;br&gt;
Can we roll back safely?&lt;br&gt;
Is there any known operational or business risk?&lt;/p&gt;
&lt;p&gt;Only then does the question become interesting:&lt;/p&gt;
&lt;p&gt;Do we have enough evidence to release?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Maybe the problem is the way we frame CI&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We built CI to automate verification.&lt;/p&gt;
&lt;p&gt;Over time, many teams started using it as a proxy for release readiness.&lt;/p&gt;
&lt;p&gt;That shortcut works surprisingly often.&lt;/p&gt;
&lt;p&gt;Which is exactly why it is dangerous.&lt;/p&gt;
&lt;p&gt;Most releases with a green pipeline are probably fine.&lt;/p&gt;
&lt;p&gt;Then one isn't.&lt;/p&gt;
&lt;p&gt;And when you investigate what happened, the answer is often not:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&quot;CI failed.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It is:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&quot;CI never knew that this was something it needed to evaluate.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;That is the gap I keep coming back to.&lt;/p&gt;
&lt;p&gt;The future of release engineering, in my opinion, is not just more tests and faster pipelines.&lt;/p&gt;
&lt;p&gt;It is better decision-making.&lt;/p&gt;
&lt;p&gt;More context.&lt;/p&gt;
&lt;p&gt;Better evidence.&lt;/p&gt;
&lt;p&gt;A clearer understanding of what we know before we put a change in front of users.&lt;/p&gt;
&lt;p&gt;Green CI should absolutely make us more confident.&lt;/p&gt;
&lt;p&gt;It just shouldn't make us stop asking questions.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/25304/ci-is-green-what-could-still-go-wrong</guid>
<pubDate>Mon, 24 Aug 2026 15:30:17 +0000</pubDate>
</item>
<item>
<title>CI is green. Your release may still be risky.</title>
<link>https://coderlegion.com/25303/ci-is-green-your-release-may-still-be-risky</link>
<description>&lt;p&gt;Every team has a moment like this: CI passes, the PR gets merged, the deploy goes out — and two hours later someone's asking why checkout is throwing 500s in production.&lt;/p&gt;
&lt;p&gt;Nobody skipped a step. The pipeline was green the whole time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The false comfort of green CI&lt;/strong&gt;&lt;br&gt;
Green CI feels like permission. It's a checkmark, it's fast, and it's automated — so it's easy to treat it as the final word on whether a release is safe. For a lot of teams, &quot;tests passed&quot; and &quot;safe to ship&quot; have quietly become the same sentence.&lt;/p&gt;
&lt;p&gt;They're not.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What CI actually checks&lt;/strong&gt;&lt;br&gt;
Most CI pipelines are built to catch a specific, narrow slice of problems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Does the code compile / build?&lt;/li&gt;
&lt;li&gt;Do unit tests pass?&lt;/li&gt;
&lt;li&gt;Does lint pass?&lt;/li&gt;
&lt;li&gt;Maybe: does a small integration suite pass?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That's genuinely useful. It catches typos, broken imports, obvious logic errors, regressions in covered code paths. It's necessary.&lt;/p&gt;
&lt;p&gt;It's just not the same thing as &quot;this release is safe to put in front of users.&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What CI doesn't tell you&lt;/strong&gt;&lt;br&gt;
CI has no opinion on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Downstream dependencies&lt;/strong&gt; — does the third-party API you call still behave the way your integration test mocked it to?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Manual steps&lt;/strong&gt; — did someone actually run the DB migration on staging before merging, or is that still &quot;to do&quot;?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deploy-time risk&lt;/strong&gt; — blue-green cutover, cache invalidation, feature flag state — none of that is exercised by a test suite that runs against a branch.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Human process gaps&lt;/strong&gt; — did the person who approved this PR actually understand the blast radius, or did they approve because the CI badge was green?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of this shows up as a failing check. It shows up as an incident.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Release risk is a different question than test pass/fail&lt;/strong&gt;&lt;br&gt;
&quot;Did the tests pass&quot; is a yes/no question about code. &quot;Is this release safe to ship&quot; is a probabilistic question about a system: what changed, how big is the diff, does it touch a critical path, is there a rollback plan, has this kind of change caused problems before.&lt;/p&gt;
&lt;p&gt;Most teams answer that second question with vibes — a Slack message, a shrug, &quot;looks fine to me.&quot; That works fine until it doesn't, and by the time it doesn't, you're writing a postmortem instead of a checklist.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What a release risk gate actually looks like&lt;/strong&gt;&lt;br&gt;
The teams that don't get burned by this usually have some version of the same thing, whether they call it that or not:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A policy layer that blocks release on concrete conditions (required approvals, coverage thresholds, freeze windows) — not vibes, actual enforced rules.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A signal aggregator that pulls test results, error rates, and coverage into one release health view instead of five open tabs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An audit trail — an immutable record of what was actually in a release, so when something breaks you're debugging from evidence, not memory.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of this requires an enterprise platform. Small teams can build a lightweight version of this with GitHub Actions, a policy file, and some discipline. The point isn't the tooling — it's separating &quot;code compiles&quot; from &quot;release is safe&quot; as two distinct questions with two distinct answers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where to start if you don't have this yet&lt;/strong&gt;&lt;br&gt;
You don't need to build a whole release control system this week. Start smaller:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Write down the 3–5 things that, if skipped, have caused an incident before. Turn them into a checklist that's actually enforced, not just documented.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add one non-negotiable gate to your PR template — coverage on touched files, or a manual QA sign-off for anything touching payments/auth.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Capture a snapshot of what shipped in each release (commit list, who approved, what tests ran) so your next postmortem starts with facts instead of &quot;let me check Slack.&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want a starting point instead of building it from scratch, I put together a Release Checklist Pack and a GitHub QA Gates Pack — practical templates for exactly this, no platform lock-in required.&lt;/p&gt;
&lt;p&gt;I'm building Dulvarn, a release control system for GitHub-first teams, plus a set of standalone QA/release tools and templates. This post reflects my own experience shipping software, not any employer's views or confidential information.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/25303/ci-is-green-your-release-may-still-be-risky</guid>
<pubDate>Mon, 24 Aug 2026 15:29:44 +0000</pubDate>
</item>
<item>
<title>Best Selenium Alternatives in 2026: Top Testing Tools to Replace Selenium</title>
<link>https://coderlegion.com/23120/best-selenium-alternatives-in-2026-top-testing-tools-to-replace-selenium</link>
<description>&lt;p&gt;Selenium has been a major part of test automation for more than two decades. It helped shape how teams approached browser testing and became the default framework for UI automation.&lt;/p&gt;
&lt;p&gt;But in 2026, software development moves much faster than it did when Selenium became popular.&lt;/p&gt;
&lt;p&gt;Teams ship weekly. Interfaces change often. QA is no longer limited to automation engineers.&lt;/p&gt;
&lt;p&gt;That is where Selenium starts to show its age.&lt;/p&gt;
&lt;p&gt;It is not that Selenium is outdated. It is that modern teams need faster, simpler, and easier ways to build and maintain test automation.&lt;/p&gt;
&lt;p&gt;If you are looking for a better alternative, this guide covers the best Selenium alternatives in 2026, what they do best, and which teams they fit.&lt;/p&gt;
&lt;h3 id=&quot;why-teams-are-replacing-selenium&quot;&gt;Why Teams Are Replacing Selenium&lt;/h3&gt;
&lt;p&gt;Selenium still powers thousands of automation frameworks, but it comes with challenges that are harder to justify today.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;High maintenance&lt;/strong&gt;&lt;br&gt;
Selenium relies heavily on locators like XPath and CSS selectors. Small UI updates often break tests.&lt;/p&gt;
&lt;p&gt;That means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Frequent debugging&lt;/li&gt;
&lt;li&gt;Constant test maintenance&lt;/li&gt;
&lt;li&gt;Slower releases&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Flaky test execution&lt;/strong&gt;&lt;br&gt;
Timing issues are one of Selenium’s biggest pain points. Tests often fail because elements are not ready or page states change unexpectedly.&lt;/p&gt;
&lt;p&gt;This creates unstable pipelines and unreliable regression runs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Developer dependency&lt;/strong&gt;&lt;br&gt;
Selenium is code-first. That means QA teams need technical expertise to build and maintain tests.&lt;/p&gt;
&lt;p&gt;In many teams, only a few engineers can actually work on automation.&lt;/p&gt;
&lt;p&gt;That creates bottlenecks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Infrastructure management&lt;/strong&gt;&lt;br&gt;
Scaling Selenium usually requires browser grids, CI setup, and execution infrastructure.&lt;/p&gt;
&lt;p&gt;This adds operational overhead that many teams want to avoid.&lt;/p&gt;
&lt;h3 id=&quot;best-selenium-alternatives-in-2026&quot;&gt;Best Selenium Alternatives in 2026&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. &lt;a rel=&quot;nofollow&quot; href=&quot;https://qality.dev&quot;&gt;QAlity&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Best for: No-code web automation for SaaS teams&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;QAlity is a no-code test automation platform built for modern web application teams.&lt;/p&gt;
&lt;p&gt;Instead of writing scripts, teams can record workflows directly in Chrome and turn them into reusable automated tests.&lt;/p&gt;
&lt;p&gt;The biggest advantage of QAlity is Auto-Heal. When UI elements change, it intelligently updates test steps instead of failing.&lt;/p&gt;
&lt;p&gt;This dramatically reduces maintenance effort.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No-code workflow recording&lt;/li&gt;
&lt;li&gt;Cloud-based execution&lt;/li&gt;
&lt;li&gt;AI-powered step generation&lt;/li&gt;
&lt;li&gt;Auto-Heal for UI changes&lt;/li&gt;
&lt;li&gt;Screenshots at every test step&lt;/li&gt;
&lt;li&gt;Scheduled and on-demand runs&lt;/li&gt;
&lt;li&gt;Easy collaboration across QA and product teams&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt;&lt;br&gt;
Focused on web application testing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;br&gt;
Startups, SaaS companies, and QA teams that want automation without writing code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. &lt;a rel=&quot;nofollow&quot; href=&quot;https://playwright.dev&quot;&gt;Playwright&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Best for: Fast and reliable open-source automation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Playwright has become the strongest technical replacement for Selenium.&lt;/p&gt;
&lt;p&gt;Built by Microsoft, it uses native browser communication instead of WebDriver, making it faster and more stable.&lt;/p&gt;
&lt;p&gt;Its built-in waiting system reduces flaky tests significantly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fast execution&lt;/li&gt;
&lt;li&gt;Multi-browser support&lt;/li&gt;
&lt;li&gt;Parallel testing&lt;/li&gt;
&lt;li&gt;Powerful debugging tools&lt;/li&gt;
&lt;li&gt;Strong CI integration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt;&lt;br&gt;
Still requires coding knowledge.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;br&gt;
Engineering teams with JavaScript, TypeScript, or Python expertise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. &lt;a rel=&quot;nofollow&quot; href=&quot;https://cypress.io&quot;&gt;Cypress&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Best for: Front-end developer testing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cypress is one of the most popular tools for front-end teams.&lt;/p&gt;
&lt;p&gt;It runs directly inside the browser, giving developers better visibility into application behavior during test execution.&lt;/p&gt;
&lt;p&gt;Its developer experience is one of the best in the market.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Live test runner&lt;/li&gt;
&lt;li&gt;Easy debugging&lt;/li&gt;
&lt;li&gt;Strong developer workflow&lt;/li&gt;
&lt;li&gt;Fast feedback loop&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt;&lt;br&gt;
Mostly JavaScript-focused and less flexible for non-technical QA teams.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;br&gt;
Frontend development teams.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. &lt;a rel=&quot;nofollow&quot; href=&quot;https://katalon.com&quot;&gt;Katalon&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Best for: Enterprise and low-code automation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Katalon offers a low-code approach and supports web, API, mobile, and desktop testing.&lt;/p&gt;
&lt;p&gt;It is popular among larger organizations that need centralized reporting and broader test coverage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multi-platform support&lt;/li&gt;
&lt;li&gt;Reporting and analytics&lt;/li&gt;
&lt;li&gt;Team collaboration&lt;/li&gt;
&lt;li&gt;Enterprise governance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt;&lt;br&gt;
Can feel complex for smaller teams.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;br&gt;
Enterprise QA teams with larger automation needs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. &lt;a rel=&quot;nofollow&quot; href=&quot;https://testrigor.com&quot;&gt;testRigor&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Best for: AI-powered test automation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;testRigor focuses on natural language-based test creation.&lt;/p&gt;
&lt;p&gt;Instead of coding or complex selectors, users can write test cases in plain English.&lt;/p&gt;
&lt;p&gt;This makes automation easier for non-technical teams.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Natural language testing&lt;/li&gt;
&lt;li&gt;AI-powered maintenance&lt;/li&gt;
&lt;li&gt;Self-healing capabilities&lt;/li&gt;
&lt;li&gt;Faster test creation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt;&lt;br&gt;
Less flexible for highly customized workflows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;br&gt;
Teams looking for AI-first automation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6. &lt;a rel=&quot;nofollow&quot; href=&quot;https://bugbug.io&quot;&gt;BugBug&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Best for: Lightweight browser automation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;BugBug is designed for simplicity.&lt;/p&gt;
&lt;p&gt;It allows users to record browser actions and create automated tests without complex setup.&lt;/p&gt;
&lt;p&gt;Its lightweight nature makes it a practical option for teams moving away from Selenium.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Browser-based recording&lt;/li&gt;
&lt;li&gt;Cloud execution&lt;/li&gt;
&lt;li&gt;Simple UI&lt;/li&gt;
&lt;li&gt;Quick setup&lt;/li&gt;
&lt;li&gt;Minimal learning curve&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt;&lt;br&gt;
Focused mainly on web applications.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;br&gt;
Startups and growing teams looking for fast onboarding.&lt;/p&gt;
&lt;h3 id=&quot;how-to-choose-the-right-selenium-alternative-&quot;&gt;How to Choose the Right Selenium Alternative?&lt;/h3&gt;
&lt;p&gt;The right tool depends on your team.&lt;/p&gt;
&lt;p&gt;Ask yourself:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Who will create and maintain the tests?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If your developers own automation, tools like Playwright and Cypress are excellent.&lt;/p&gt;
&lt;p&gt;If your QA team includes manual testers, product managers, or non-technical contributors, no-code tools like QAlity, testRigor, or BugBug may be a better fit.&lt;/p&gt;
&lt;p&gt;Also consider:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Release frequency&lt;/li&gt;
&lt;li&gt;Team size&lt;/li&gt;
&lt;li&gt;Maintenance bandwidth&lt;/li&gt;
&lt;li&gt;Technical skill level&lt;/li&gt;
&lt;li&gt;Infrastructure requirements&lt;br&gt;
The best automation tool is not always the most powerful. It is the one your team can use consistently.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;should-you-move-away-from-selenium-&quot;&gt;Should You Move Away from Selenium?&lt;/h3&gt;
&lt;p&gt;For many teams, yes.&lt;/p&gt;
&lt;p&gt;The hidden cost of Selenium is not licensing. It is maintenance, flaky failures, and engineering time spent fixing automation instead of shipping features.&lt;/p&gt;
&lt;p&gt;Modern alternatives reduce that burden.&lt;/p&gt;
&lt;p&gt;Some improve reliability. Some simplify authoring. Some remove code completely.&lt;/p&gt;
&lt;p&gt;The right choice depends on how your team works.&lt;/p&gt;
&lt;p&gt;If your goal is speed and flexibility, Playwright is a strong option.&lt;/p&gt;
&lt;p&gt;If your goal is making automation accessible to everyone, &lt;a rel=&quot;nofollow&quot; href=&quot;https://qality.dev/&quot;&gt;QAlity&lt;/a&gt; offers a much simpler path.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/23120/best-selenium-alternatives-in-2026-top-testing-tools-to-replace-selenium</guid>
<pubDate>Tue, 21 Jul 2026 07:55:56 +0000</pubDate>
</item>
<item>
<title>Stop asking AI to generate test cases: how to integrate AI into your engineering workflow</title>
<link>https://coderlegion.com/23034/stop-asking-ai-to-generate-test-cases-how-to-integrate-ai-into-your-engineering-workflow</link>
<description>&lt;p&gt;Every time a new feature or fix comes up, some people do the same thing. They open their favorite AI chat, copy the requirement or the PR description, paste it in, and ask &quot;generate test cases for this feature&quot;. Then they copy the output back into their test management tool or their notes.&lt;/p&gt;
&lt;p&gt;There is nothing wrong with using AI this way, it works. I do think there is something wrong with having a manual flow around it. You have to remember to do it, you have to copy and paste the context every single time, and the AI only knows what you decided to paste. If you forget a detail, or if the feature touches something you did not think to mention, the AI will not know either.&lt;/p&gt;
&lt;p&gt;Instead of manually going to an AI chat every time, you can integrate that same LLM into your workflow, so it runs automatically and already has the context it needs.&lt;/p&gt;
&lt;p&gt;One example I built recently at work is a GitHub workflow that runs on the PR level.&lt;/p&gt;
&lt;p&gt;Every time a developer opens a PR implementing a feature or a fix, we have a label called &quot;ai:generate-test-cases&quot;. When someone adds this label, it triggers a GitHub workflow that runs a script calling an LLM. This script reads the full PR diff, the comments, and even external links using MCPs, to gather as much context as possible. Then it drops a comment on the PR with a list of possible test scenarios, the risk level of that change, and whether the developer already added automated tests for it. This way we can focus on the areas that matter the most.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Traditional workflow
Requirement
    ↓
Copy
    ↓
Paste into AI chat
    ↓
Generate Test Cases

Integrated workflow
Pull Request
    ↓
Label added
    ↓
GitHub Action
    ↓
LLM reads diff + context
    ↓
PR Comment with:
- Test scenarios
- Risk level
- Test coverage insights
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Test case suggestions are just one output of this. The same context, the diff, the comments, the linked docs, could just as easily be used to flag risk, or check if something important was missed. Generating test cases is just the first thing I built with it.&lt;/p&gt;
&lt;p&gt;This is opt-in by design. It will not generate anything on infra related PRs, or any PR where the label is not added. You choose which PRs need test case suggestions. This is useful not only for QAs, but also for developers who want to make sure they covered the main scenarios, and it can surface an outcome or edge case you had not thought about.&lt;/p&gt;
&lt;p&gt;Of course this does not replace human judgment. It is a tool to help organize and prioritize scenarios, not a guarantee that every hidden path has been covered. We should always use our own experience to decide what is worth testing and what is not, since it is impossible to test everything.&lt;/p&gt;
&lt;p&gt;AI is much more valuable when it becomes part of your engineering workflow instead of another browser tab. Test case generation is just one example of that.&lt;/p&gt;
&lt;p&gt;If this is something you want to try or adapt to your own workflow, the repo is public and I am happy to talk through how it works.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/23034/stop-asking-ai-to-generate-test-cases-how-to-integrate-ai-into-your-engineering-workflow</guid>
<pubDate>Sun, 19 Jul 2026 19:28:37 +0000</pubDate>
</item>
<item>
<title>What Does 'QA' Really Mean? (Hint: It's Not a Person)</title>
<link>https://coderlegion.com/23026/what-does-qa-really-mean-hint-its-not-a-person</link>
<description>&lt;p&gt;I'm tired of seeing people refer to QA as simply &quot;the person who tests.&quot; And honestly, it's exhausting. As a tester (or QA engineer, if you prefer) I feel the need to clear a few things up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;QA is not a person. It's an entire discipline.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Quality Assurance is about quality as a whole. There are many types of QA across different industries: software, hardware, manufacturing, and beyond. So when someone says a task is &quot;just waiting on QA,&quot; it tells me something: that person doesn't take their own code seriously enough.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;QA engineers are not the sole guardians of quality.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Saying that &quot;QA is responsible for the quality of the system&quot; implies that developers can simply ignore quality while building it. That's a dangerous assumption. Quality is a shared responsibility and it belongs to the entire team.&lt;/p&gt;
&lt;p&gt;And when a company says &quot;we don't need QA,&quot; what are they actually saying? That their software doesn't need quality? More likely, what they mean is they don't need testers, and those are very different things. Conflating them is part of the problem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Replacing testers with developers doesn't work.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Some companies are delegating the &quot;QA role&quot; to developers themselves. I could expand on this on another post, but the short version: developers have confirmation bias. They build things to work, so they test to confirm they work. That's not the same as testing to find where things break. Saying &quot;let's get rid of the QA people on the team&quot; isn't a quality strategy, it's a blind spot.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The &quot;QA responsibilities&quot; debate is muddier than it needs to be.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Everyone seems to have a different opinion on what QA is supposed to do. You've probably heard things like &quot;being in QA isn't just about testing&quot; or &quot;QA needs to wear multiple hats.&quot; And sure, testers do much more than find bugs. Documentation, reporting, risk analysis, process improvement, it's all part of the work.&lt;/p&gt;
&lt;p&gt;But here's what bothers me: the false promises. Saying that QA is responsible for &quot;ensuring quality and preventing all bugs&quot; is unrealistic and, frankly, unachievable. It sounds good in a job description, but reality is far less dramatic. What we are primarily responsible for is finding problems, and those problems reveal the actual state of the product's quality. That's not a lesser role. That's an honest one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So where does that leave us?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The solution starts with language. If we're more precise about what we mean: tester vs. QA, shared responsibility vs. sole ownership, risk reduction vs. zero-defect guarantees then conversations about quality become more honest and more productive. Teams make better decisions when they understand what they're actually asking for.&lt;/p&gt;
&lt;p&gt;I won't pretend the industry is close to getting this right. But what keeps me going is knowing that good professionals exist, people who genuinely understand these distinctions, who treat testers as strategic partners rather than a final checkpoint. And despite all the noise, I keep showing up and doing my best work. Because the craft matters, even when the title is misunderstood.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/23026/what-does-qa-really-mean-hint-its-not-a-person</guid>
<pubDate>Sun, 19 Jul 2026 16:07:09 +0000</pubDate>
</item>
<item>
<title>I Published a Complete Guide to Software Quality Assurance</title>
<link>https://coderlegion.com/19420/i-published-a-complete-guide-to-software-quality-assurance</link>
<description>&lt;p&gt;Quality isn't a phase you add before shipping — it's a discipline that needs to run through every stage of development. And the data backs this up: fixing a bug in production costs 10x more than fixing it during requirements. Yet 56% of all defects originate in the requirements phase.&lt;br&gt;
I just published a structured overview of Software Quality Assurance that breaks down:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How verification and validation work (and why they're different)&lt;/li&gt;
&lt;li&gt;Testing strategies: when to use white-box vs. black-box&lt;/li&gt;
&lt;li&gt;Why quality processes fail in most organizations&lt;/li&gt;
&lt;li&gt;The complete testing lifecycle: unit → integration → system → acceptance&lt;/li&gt;
&lt;li&gt;Practical frameworks for building quality into your process from day one&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Whether you're writing code, managing QA, or leading an engineering team, this gives you the framework to understand how quality actually fits into real software development.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://medium.com/@Victorldev/software-quality-assurance-1a39e9e928dc&quot;&gt;Read the full article&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Based on: Bartié, Alexandre. Garantia da qualidade de software: adquirindo maturidade organizacional.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/19420/i-published-a-complete-guide-to-software-quality-assurance</guid>
<pubDate>Mon, 01 Jun 2026 11:59:45 +0000</pubDate>
</item>
<item>
<title>I Built a Free JSON Karate DSL Schema Generator for QA Engineers</title>
<link>https://coderlegion.com/17319/i-built-a-free-json-karate-dsl-schema-generator-for-qa-engineers</link>
<description>&lt;p&gt;If you work with &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://karatelabs.github.io/karate/?utm_source=chatgpt.com&quot;&gt;Karate DSL&lt;/a&gt;&lt;/strong&gt; for API testing, you already know how important and useful schema validation can be.&lt;/p&gt;
&lt;p&gt;You also know how repetitive it becomes.&lt;/p&gt;
&lt;p&gt;Writing Karate match schemas manually for every API response is one of those tasks that feels small at first until you start working with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deeply nested JSON responses&lt;/li&gt;
&lt;li&gt;arrays of objects&lt;/li&gt;
&lt;li&gt;large payloads&lt;/li&gt;
&lt;li&gt;optional fields&lt;/li&gt;
&lt;li&gt;multiple endpoints&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After doing this repeatedly in real automation projects, I decided to build a small utility focused on solving exactly that problem.&lt;/p&gt;
&lt;p&gt;So I created a free browser-based tool:&lt;/p&gt;
&lt;h3 id=&quot;json-karate-dsl-schema-converter&quot;&gt;JSON → Karate DSL Schema Converter&lt;/h3&gt;
&lt;p&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://jsonkaratedslgenerator.codeqazone.com/&quot;&gt;https://jsonkaratedslgenerator.codeqazone.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The tool instantly converts a JSON payload into a ready-to-use Karate DSL schema.&lt;/p&gt;
&lt;h3 id=&quot;the-problem&quot;&gt;The Problem&lt;/h3&gt;
&lt;p&gt;Karate DSL does not use traditional JSON Schema syntax.&lt;/p&gt;
&lt;p&gt;Instead, it uses type matchers like:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&quot;#string&quot;
&quot;#number&quot;
&quot;#boolean&quot;
&quot;#[]&quot;
&quot;##string&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That approach is powerful and very readable once you understand it.&lt;/p&gt;
&lt;p&gt;But manually transforming a real API response into a Karate validation schema can become repetitive and time-consuming.&lt;/p&gt;
&lt;p&gt;For example, a response like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;id&quot;: 101,
  &quot;name&quot;: &quot;Alice&quot;,
  &quot;active&quot;: true,
  &quot;roles&quot;: [&quot;admin&quot;, &quot;user&quot;]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Usually becomes something like:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;{
  &quot;id&quot;: &quot;#number&quot;,
  &quot;name&quot;: &quot;#string&quot;,
  &quot;active&quot;: &quot;#boolean&quot;,
  &quot;roles&quot;: &quot;#[] #string&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And that is a very small example.&lt;/p&gt;
&lt;p&gt;In real-world APIs, payloads can be much larger and more nested.&lt;/p&gt;
&lt;h3 id=&quot;what-the-tool-does&quot;&gt;What the Tool Does&lt;/h3&gt;
&lt;p&gt;The converter takes a JSON payload and automatically generates a Karate-compatible schema while preserving the original structure.&lt;/p&gt;
&lt;p&gt;It supports:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;primitive types&lt;/li&gt;
&lt;li&gt;nested objects&lt;/li&gt;
&lt;li&gt;arrays&lt;/li&gt;
&lt;li&gt;arrays of objects&lt;/li&gt;
&lt;li&gt;nested arrays&lt;/li&gt;
&lt;li&gt;optional fields&lt;/li&gt;
&lt;li&gt;copy to clipboard&lt;/li&gt;
&lt;li&gt;schema download&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Everything runs directly in the browser.&lt;/p&gt;
&lt;p&gt;No installation.&lt;br&gt;
No backend.&lt;br&gt;
No data storage.&lt;/p&gt;
&lt;p&gt;Just paste your JSON and generate the schema instantly.&lt;/p&gt;
&lt;h3 id=&quot;example-conversion&quot;&gt;Example Conversion&lt;/h3&gt;
&lt;h4 id=&quot;input-json&quot;&gt;Input JSON&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;id&quot;: 101,
  &quot;name&quot;: &quot;Alice&quot;,
  &quot;active&quot;: true,
  &quot;user&quot;: {
    &quot;email&quot;: &quot;*Emails are not allowed*&quot;,
    &quot;profile&quot;: {
      &quot;age&quot;: 30,
      &quot;verified&quot;: true
    }
  },
  &quot;orders&quot;: [
    {
      &quot;orderId&quot;: 1,
      &quot;amount&quot;: 99.99
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;generated-karate-schema&quot;&gt;Generated Karate Schema&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;{
  &quot;id&quot;: &quot;#number&quot;,
  &quot;name&quot;: &quot;#string&quot;,
  &quot;active&quot;: &quot;#boolean&quot;,
  &quot;user&quot;: {
    &quot;email&quot;: &quot;#string&quot;,
    &quot;profile&quot;: {
      &quot;age&quot;: &quot;#number&quot;,
      &quot;verified&quot;: &quot;#boolean&quot;
    }
  },
  &quot;orders&quot;: &quot;#[] {\&quot;orderId\&quot;:\&quot;#number\&quot;,\&quot;amount\&quot;:\&quot;#number\&quot;}&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;required-vs-optional-fields&quot;&gt;Required vs Optional Fields&lt;/h3&gt;
&lt;p&gt;One thing I intentionally wanted in the tool was explicit control over required and optional fields in the schema.&lt;/p&gt;
&lt;p&gt;Instead of automatically guessing business rules, the tool lets the tester define which fields are required.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;id, name, user.email
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Fields included in that input remain required while all other fields are automatically converted into optional Karate matchers using the &lt;code&gt;##&lt;/code&gt; syntax.&lt;/p&gt;
&lt;p&gt;That decision came directly from real QA workflows.&lt;/p&gt;
&lt;p&gt;As testers, we usually already know:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;which fields are mandatory&lt;/li&gt;
&lt;li&gt;which fields are conditional&lt;/li&gt;
&lt;li&gt;which fields depend on business logic&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The tool is not trying to replace that understanding, it is simply removing the repetitive manual work.&lt;/p&gt;
&lt;h3 id=&quot;why-i-built-it&quot;&gt;Why I Built It&lt;/h3&gt;
&lt;p&gt;This project came from real automation work. The goal was not to create a massive platform, it was to create something:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fast&lt;/li&gt;
&lt;li&gt;practical&lt;/li&gt;
&lt;li&gt;useful immediately&lt;/li&gt;
&lt;li&gt;frictionless to use&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A tool you can open, use in seconds, and continue with your work.&lt;/p&gt;
&lt;h3 id=&quot;features&quot;&gt;Features&lt;/h3&gt;
&lt;p&gt;Current features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JSON → Karate DSL conversion&lt;/li&gt;
&lt;li&gt;Required fields input&lt;/li&gt;
&lt;li&gt;Optional field generation (&lt;code&gt;##type&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Nested object support&lt;/li&gt;
&lt;li&gt;Array schema generation&lt;/li&gt;
&lt;li&gt;Demo examples&lt;/li&gt;
&lt;li&gt;Copy-to-clipboard support&lt;/li&gt;
&lt;li&gt;Schema download&lt;/li&gt;
&lt;li&gt;Browser-only execution&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;who-is-this-for-&quot;&gt;Who Is This For?&lt;/h3&gt;
&lt;p&gt;This tool is especially useful for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;QA Automation Engineers&lt;/li&gt;
&lt;li&gt;API Testers&lt;/li&gt;
&lt;li&gt;Developers using Karate DSL&lt;/li&gt;
&lt;li&gt;Teams building API validation suites&lt;/li&gt;
&lt;li&gt;People learning Karate schema validation&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;try-it&quot;&gt;Try It&lt;/h3&gt;
&lt;p&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://jsonkaratedslgenerator.codeqazone.com/&quot;&gt;https://jsonkaratedslgenerator.codeqazone.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The app also includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Base Demo&lt;/li&gt;
&lt;li&gt;Advanced Demo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;so you can immediately understand how the conversion works.&lt;/p&gt;
&lt;p&gt;If you work with &lt;a rel=&quot;nofollow&quot; href=&quot;https://karatelabs.github.io/karate/?utm_source=chatgpt.com&quot;&gt;Karate DSL&lt;/a&gt;, I hope this tool saves you some time. Feedback and suggestions are always welcome.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Happy Testing!&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/17319/i-built-a-free-json-karate-dsl-schema-generator-for-qa-engineers</guid>
<pubDate>Sun, 10 May 2026 18:34:28 +0000</pubDate>
</item>
<item>
<title>The Test Manager’s Guide: From Chaos to Predictable Quality — Part 2: MVP Test Strategy — First 30 Days Wins</title>
<link>https://coderlegion.com/14333/test-managers-guide-from-chaos-predictable-quality-part-mvp-test-strategy-first-days-wins</link>
<description>&lt;p&gt;In Part 1, we diagnosed the problem.&lt;/p&gt;
&lt;p&gt;Not incompetence.&lt;br&gt;
Not lack of effort.&lt;/p&gt;
&lt;p&gt;Structure.&lt;/p&gt;
&lt;p&gt;Invisible gaps. Unclear boundaries. Quality that depended on individuals rather than systems.&lt;/p&gt;
&lt;p&gt;Diagnosis creates clarity.&lt;/p&gt;
&lt;p&gt;But clarity alone does not stabilize a project.&lt;/p&gt;
&lt;p&gt;The next question is inevitable:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where do you start — without making things worse?&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-trap-after-diagnosis&quot;&gt;The Trap After Diagnosis&lt;/h3&gt;
&lt;p&gt;After diagnosing chaos, most test managers fall into one of two traps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Trap A:&lt;/strong&gt;&lt;br&gt;
Write the perfect strategy document.&lt;br&gt;
Forty pages. Maturity models. Target states. Roadmaps.&lt;/p&gt;
&lt;p&gt;Six weeks later, nothing has changed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Trap B:&lt;/strong&gt;&lt;br&gt;
Fix the first broken thing you see.&lt;br&gt;
Create a template. Introduce a tool. Patch a symptom.&lt;/p&gt;
&lt;p&gt;The system absorbs it. Chaos remains.&lt;/p&gt;
&lt;p&gt;Neither approach alters the structure.&lt;/p&gt;
&lt;p&gt;Diagnosis without movement erodes credibility.&lt;br&gt;
Movement without structure reinforces disorder.&lt;/p&gt;
&lt;p&gt;There is a third path.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;what-mvp-test-strategy-actually-means&quot;&gt;What “MVP Test Strategy” Actually Means&lt;/h3&gt;
&lt;p&gt;MVP does &lt;strong&gt;not&lt;/strong&gt; mean minimum testing.&lt;/p&gt;
&lt;p&gt;It means:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Minimum viable structure.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The smallest set of enabling constraints that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make quality visible&lt;/li&gt;
&lt;li&gt;Reduce unseen risk&lt;/li&gt;
&lt;li&gt;Survive without heroics&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before taking any action, apply three filters:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Does this reduce hidden risk — not just organize work?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Can this be implemented using what already exists?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Will it survive if I leave next month?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the answer is no to any of these, it is not MVP.&lt;br&gt;
It is activity.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/47ho8ntnhi64rux3le2j.png&quot; alt=&quot;Three overlapping circles with their center intersection highlighted in teal&quot;&gt;&lt;em&gt;MVP = the intersection of visibility, constraint, and sustainability. (Gemini generated image)&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-30-day-structural-arc&quot;&gt;The 30-Day Structural Arc&lt;/h3&gt;
&lt;p&gt;The first 30 days are not about fixing everything.&lt;/p&gt;
&lt;p&gt;They are about shifting the system.&lt;/p&gt;
&lt;h4 id=&quot;week-1-visibility&quot;&gt;Week 1 — Visibility&lt;/h4&gt;
&lt;p&gt;Chaos survives in silence.&lt;/p&gt;
&lt;p&gt;Establish one shared defect log.&lt;br&gt;
Not a tool migration. A spreadsheet is enough.&lt;/p&gt;
&lt;p&gt;Hold one weekly 30-minute quality review.&lt;br&gt;
Three questions only:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What broke?&lt;/li&gt;
&lt;li&gt;Why didn’t we catch it?&lt;/li&gt;
&lt;li&gt;What changes tomorrow?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No blame. Only patterns.&lt;/p&gt;
&lt;p&gt;Quality becomes visible.&lt;/p&gt;
&lt;h4 id=&quot;week-2-boundaries&quot;&gt;Week 2 — Boundaries&lt;/h4&gt;
&lt;p&gt;Without boundaries, testing becomes negotiation.&lt;/p&gt;
&lt;p&gt;Define one clear entry criterion for testing.&lt;br&gt;
Only one.&lt;/p&gt;
&lt;p&gt;Not “code complete”.&lt;br&gt;
Not “should work”.&lt;/p&gt;
&lt;p&gt;Make it concrete. Visible. Agreed upon.&lt;/p&gt;
&lt;p&gt;Write it down. Share it. Protect it.&lt;/p&gt;
&lt;p&gt;Quality now has edges.&lt;/p&gt;
&lt;h4 id=&quot;week-3-causality&quot;&gt;Week 3 — Causality&lt;/h4&gt;
&lt;p&gt;Take one recent production defect.&lt;/p&gt;
&lt;p&gt;Trace it backward.&lt;/p&gt;
&lt;p&gt;Where could it have been detected?&lt;br&gt;
At what cost?&lt;br&gt;
Under which condition?&lt;/p&gt;
&lt;p&gt;This is not forensic blame.&lt;br&gt;
It is system mapping.&lt;/p&gt;
&lt;p&gt;Quality becomes causal.&lt;/p&gt;
&lt;h4 id=&quot;week-4-shared-commitment&quot;&gt;Week 4 — Shared Commitment&lt;/h4&gt;
&lt;p&gt;Ensure testing is present when scope is committed.&lt;/p&gt;
&lt;p&gt;One slice. One iteration. One discussion.&lt;/p&gt;
&lt;p&gt;The tester is no longer downstream verification.&lt;br&gt;
They are upstream risk awareness.&lt;/p&gt;
&lt;p&gt;Quality becomes shared.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/drd5tgeceq6qxtre8s03.png&quot; alt=&quot;Geometric steps emerging from a fragmented base, subtly labeled with structural milestones&quot;&gt;&lt;em&gt;Structure enters gradually. Not loudly. (Gemini generated image)&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-uncomfortable-truth&quot;&gt;The Uncomfortable Truth&lt;/h3&gt;
&lt;p&gt;You will not fix regression coverage in 30 days.&lt;/p&gt;
&lt;p&gt;You will not automate legacy workflows.&lt;/p&gt;
&lt;p&gt;You will not eliminate manual testing.&lt;/p&gt;
&lt;p&gt;You will not redesign the lifecycle.&lt;/p&gt;
&lt;p&gt;So what did you achieve?&lt;/p&gt;
&lt;p&gt;You changed the conversation.&lt;/p&gt;
&lt;p&gt;From:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;“When will testing be done?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;“What does done mean — and how do we know?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That shift is structural.&lt;/p&gt;
&lt;p&gt;Everything else builds on it.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;why-this-works&quot;&gt;Why This Works&lt;/h3&gt;
&lt;p&gt;Because chaos in software projects is rarely caused by laziness.&lt;/p&gt;
&lt;p&gt;It is caused by local optimization.&lt;/p&gt;
&lt;p&gt;Everyone is busy.&lt;br&gt;
Everyone is fixing something.&lt;br&gt;
Everyone is moving.&lt;/p&gt;
&lt;p&gt;But nothing stabilizes.&lt;/p&gt;
&lt;p&gt;MVP Test Strategy does not increase effort.&lt;br&gt;
It reduces entropy.&lt;/p&gt;
&lt;p&gt;It introduces constraints that make quality predictable.&lt;/p&gt;
&lt;p&gt;And predictability is the beginning of trust.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;next-bridge-to-post-3&quot;&gt;Next: Bridge to Post 3&lt;/h3&gt;
&lt;p&gt;Thirty days in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quality is visible.&lt;/li&gt;
&lt;li&gt;Boundaries exist.&lt;/li&gt;
&lt;li&gt;Causes are discussed.&lt;/li&gt;
&lt;li&gt;Testing is present at commitment.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The system feels slightly different.&lt;/p&gt;
&lt;p&gt;But one question remains:&lt;/p&gt;
&lt;p&gt;Is it working?&lt;/p&gt;
&lt;p&gt;Next:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Transition KPIs — Measuring Structural Health, Not Just Output&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt; Series Navigator: From Chaos to Structure — Series Overview&lt;/p&gt;
&lt;p&gt;1️⃣ Diagnosing Chaos &amp;amp; Defining the Target Model&lt;br&gt;
Understand the invisible disorder. See what’s broken before you fix it. &lt;/p&gt;
&lt;p&gt;2️⃣ MVP Test Strategy: First 30 Days&lt;br&gt;
Small, immediate actions to start taming chaos — without waiting for perfect conditions.&lt;/p&gt;
&lt;p&gt;3️⃣ Transition KPIs: Measuring Structural Health&lt;br&gt;
How to know if the new test structure is actually working — before a major defect appears.&lt;/p&gt;
&lt;p&gt;4️⃣ Stakeholder Alignment &amp;amp; Feasibility&lt;br&gt;
Building buy-in and negotiating constraints with the team and leadership.&lt;/p&gt;
&lt;p&gt;5️⃣ Economic Impact: Cost of Non-Structure&lt;br&gt;
Translate structured testing into predictable outcomes and business value.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;✨ If you see these patterns in your projects, share your experience below — or connect with me to discuss ways to bring structure and predictability to software quality.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;© 2026 Abdul Osman. All rights reserved. You are welcome to share the link to this article on social media or other platforms. However, reproducing the full text or republishing it elsewhere without permission is prohibited.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/14333/test-managers-guide-from-chaos-predictable-quality-part-mvp-test-strategy-first-days-wins</guid>
<pubDate>Thu, 09 Apr 2026 11:31:11 +0000</pubDate>
</item>
<item>
<title>The Test Manager’s Guide: From Chaos to Predictable Quality — Part 1: Diagnosing Chaos &amp; Defining the Target Model</title>
<link>https://coderlegion.com/14164/test-managers-guide-chaos-predictable-quality-part-diagnosing-chaos-defining-target-model</link>
<description>&lt;p&gt; &lt;em&gt;You can't see bad structure. You only see its symptoms: missed deadlines, production escapes, exhausted teams.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You join a project. No test plans. No ownership. Defects appear unpredictably. People are busy — yet quality drifts.&lt;/p&gt;
&lt;p&gt;Most assume testing is the problem. It isn’t. The real issue is structural: misalignment, missing feedback loops, invisible risk.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-hidden-disorder&quot;&gt;The Hidden Disorder&lt;/h3&gt;
&lt;p&gt;Testing chaos is rarely about testers.&lt;br&gt;
It’s about the system: unclear responsibilities, ad-hoc processes, and invisible bottlenecks.&lt;/p&gt;
&lt;p&gt;Without diagnosing the underlying structure, any strategy is a guess.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;diagnose-before-you-prescribe&quot;&gt;Diagnose Before You Prescribe&lt;/h3&gt;
&lt;p&gt;Step one: listen and observe.&lt;br&gt;
Talk to line managers, architects, developers, testers. Don’t ask “How do you test?”&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;You're not asking &quot;How do you test?&quot; You're asking:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;• &lt;em&gt;&quot;Where does information get lost?&quot;&lt;/em&gt;&lt;br&gt;
• &lt;em&gt;&quot;What decision, if made earlier, would have saved the most rework?&quot;&lt;/em&gt;&lt;br&gt;
• &lt;em&gt;&quot;When do you first realize something is going wrong?&quot;&lt;/em&gt;&lt;br&gt;
&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4hstlqe9jjvgji5ufnw6.png&quot; alt=&quot;silhouettes of people around a glowing network diagram, calm colors, soft focus, abstract representation of interviews and observation&quot;&gt;&lt;em&gt;Diagnosis begins with listening. (Gemini generated image)&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;define-the-target-operating-model&quot;&gt;Define the Target Operating Model&lt;/h3&gt;
&lt;p&gt;Once the current state is clear, define the target. Not perfect. Practical.&lt;/p&gt;
&lt;p&gt;Key elements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clear ownership &amp;amp; responsibilities&lt;/li&gt;
&lt;li&gt;Risk-aware testing aligned with project goals&lt;/li&gt;
&lt;li&gt;Transparent defect tracking&lt;/li&gt;
&lt;li&gt;Entry/exit criteria for test levels&lt;/li&gt;
&lt;li&gt;Feedback loops for continuous adjustment&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The goal isn’t process. It’s &lt;strong&gt;predictable outcomes and structural visibility&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Structural visibility means: when a developer commits code, three people immediately know what risks it carries — without asking.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hdocdvbligph5zqv5buy.png&quot; alt=&quot;calm digital blueprint overlay on chaotic code fragments, subtle green highlights for pathways, representing structured target model emerging from chaos&quot;&gt;&lt;em&gt;A target operating model brings clarity to chaos. (Gemini generated image)&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;a-calm-warning&quot;&gt;A Calm Warning&lt;/h3&gt;
&lt;p&gt;Chaos grows silently. Missed deadlines, defects, and rework are symptoms — not causes.&lt;/p&gt;
&lt;p&gt;With structure, you regain visibility, predictability, and control — but only if you first &lt;strong&gt;understand the hidden disorder&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0e6wk5g8u4668msfikkf.png&quot; alt=&quot;calm digital blueprint overlay on chaotic code fragments, subtle green highlights for pathways, representing structured target model emerging from chaos&quot;&gt;&lt;em&gt;A target operating model brings clarity to chaos. (Gemini generated image)&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;next-a-bridge-to-action&quot;&gt;Next: A Bridge to Action&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;&quot;You've diagnosed the chaos. Now, how do you move—without waiting for permission or perfect conditions?&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Part 2: The MVP Test Strategy — first 30 days to start taming chaos.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt; Series Navigator: From Chaos to Structure — Series Overview&lt;/p&gt;
&lt;p&gt;1️⃣ Diagnosing Chaos &amp;amp; Defining the Target Model&lt;br&gt;
Understand the invisible disorder. See what’s broken before you fix it. &lt;/p&gt;
&lt;p&gt;2️⃣ MVP Test Strategy: First 30 Days&lt;br&gt;
Small, immediate actions to start taming chaos — without waiting for perfect conditions.&lt;/p&gt;
&lt;p&gt;3️⃣ Transition KPIs: Measuring Structural Health&lt;br&gt;
How to know if the new test structure is actually working — before a major defect appears.&lt;/p&gt;
&lt;p&gt;4️⃣ Stakeholder Alignment &amp;amp; Feasibility&lt;br&gt;
Building buy-in and negotiating constraints with the team and leadership.&lt;/p&gt;
&lt;p&gt;5️⃣ Economic Impact: Cost of Non-Structure&lt;br&gt;
Translate structured testing into predictable outcomes and business value.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;✨ If you see these patterns in your projects, share your experience below — or connect with me to discuss ways to bring structure and predictability to software quality.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;© 2026 Abdul Osman. All rights reserved. You are welcome to share the link to this article on social media or other platforms. However, reproducing the full text or republishing it elsewhere without permission is prohibited.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/14164/test-managers-guide-chaos-predictable-quality-part-diagnosing-chaos-defining-target-model</guid>
<pubDate>Tue, 07 Apr 2026 14:03:40 +0000</pubDate>
</item>
<item>
<title>Can AI Replace QA Engineers? The Truth Behind the Hype</title>
<link>https://coderlegion.com/9820/can-ai-replace-qa-engineers-the-truth-behind-the-hype</link>
<description>&lt;p&gt;The software testing world is going through a massive shift right now. If you've been around the industry lately, you've probably felt the tension. Everyone is asking the same nervous question: is AI actually going to take my job?&lt;/p&gt;
&lt;p&gt;You’ve seen the headlines. There’s a constant wave of new tools promising to automate everything from basic unit tests to the most complex visual regressions. It's enough to make anyone wonder if manual expertise is becoming a relic of the past.&lt;/p&gt;
&lt;p&gt;But here’s the reality. The role of the tester isn't disappearing—it’s just finally evolving into something more strategic. We’ve looked at the current tech and the emerging industry standards to figure out where we're actually heading. This list breaks down the facts behind the hype.&lt;/p&gt;
&lt;h2 id=&quot;top-8-truths-about-ai-in-quality-engineering&quot;&gt;Top 8 Truths About AI in Quality Engineering&lt;/h2&gt;
&lt;h3 id=&quot;1-automated-test-maintenance-via-self-healing&quot;&gt;1. Automated Test Maintenance via Self-Healing&lt;/h3&gt;
&lt;p&gt;Modern testing tools now use machine learning to spot changes in application code and update scripts on the fly. This means if a developer tweaks a button's ID or shifts an element, the test doesn't just break. You don't have to drop everything for a manual fix.&lt;/p&gt;
&lt;p&gt;Platforms like Mabl have built these features so your test suites keep running without constant human babysitting. By handling the work of updating selectors, these tools give you your time back. You can focus on high-level strategy instead of hunting down broken scripts.&lt;/p&gt;
&lt;h3 id=&quot;2-generative-test-case-synthesis-for-boilerplate-code&quot;&gt;2. Generative Test Case Synthesis for Boilerplate Code&lt;/h3&gt;
&lt;p&gt;Generative AI is getting surprisingly good at writing the initial drafts of test cases based on simple requirements. Instead of staring at a blank screen, you can just describe a feature. The AI then spits out the boilerplate code and basic assertions for you.&lt;/p&gt;
&lt;p&gt;This is a lifesaver in agile shops where speed is everything. While you’ll still need to do a quick review, it removes the heavy lifting of initial setup. It’s like having a junior dev who writes all the foundation work so you can focus on the logic.&lt;/p&gt;
&lt;h3 id=&quot;3-visual-regression-with-intelligent-perception&quot;&gt;3. Visual Regression with Intelligent Perception&lt;/h3&gt;
&lt;p&gt;Traditional automated tests often miss &quot;soft&quot; bugs that don't technically break the code but definitely ruin the user experience. Think of overlapping text or buttons that hide behind banners. Standard code-based assertions usually ignore these layout fails.&lt;/p&gt;
&lt;p&gt;Applitools uses visual AI to mimic how the human eye actually sees a screen. This tech is vital for cross-browser testing because it ensures things look right on every device. It automates the &quot;look and feel&quot; checks that used to take hours of manual squinting.&lt;/p&gt;
&lt;h3 id=&quot;4-the-shift-from-executor-to-quality-architect&quot;&gt;4. The Shift from Executor to Quality Architect&lt;/h3&gt;
&lt;p&gt;As AI takes over repetitive tasks, the &quot;QA Engineer&quot; title is slowly turning into &quot;Quality Architect.&quot; This isn't just a fancy name change. It reflects a move away from clicking buttons and toward building big-picture quality frameworks.&lt;/p&gt;
&lt;p&gt;Engineers today are focusing more on how these tools fit into the CI/CD pipeline. They're learning how to interpret the massive piles of data these platforms generate. The goal is no longer just finding a bug, but building a system that stops them from existing.&lt;/p&gt;
&lt;h3 id=&quot;5-the-persistent-need-for-business-logic-validation&quot;&gt;5. The Persistent Need for Business Logic Validation&lt;/h3&gt;
&lt;p&gt;AI is great at following patterns, but it’s pretty bad at understanding complex business logic. A human tester knows why a specific bank transfer has to follow a certain path. An AI might only see the technical steps without the context of why they matter.&lt;/p&gt;
&lt;p&gt;We still need humans to find those &quot;logical&quot; edge cases where different business rules crash into each other. You bring a level of domain expertise that an algorithm just can't copy. You’re the person making sure the software actually solves the user's real-world problem.&lt;/p&gt;
&lt;h3 id=&quot;6-ethical-bias-and-accessibility-auditing&quot;&gt;6. Ethical Bias and Accessibility Auditing&lt;/h3&gt;
&lt;p&gt;AI models can accidentally pick up biases from their training data, which makes them unreliable for testing fairness. Recent ISTQB standards point out that a &quot;human-in-the-loop&quot; is mandatory for checking ethics and user experience.&lt;/p&gt;
&lt;p&gt;A human tester can feel if an interface is truly accessible to someone with different needs. An automated tool might give a &quot;pass&quot; based on technical tags, but a human sees the struggle. This ensures your software is inclusive and meets legal standards that go beyond code.&lt;/p&gt;
&lt;h3 id=&quot;7-complex-exploratory-testing-in-unscripted-environments&quot;&gt;7. Complex Exploratory Testing in Unscripted Environments&lt;/h3&gt;
&lt;p&gt;Exploratory testing relies on curiosity and the gut feeling that something isn't right. AI is generally stuck on the paths it was trained on or the parameters you gave it. It doesn't get &quot;curious.&quot;&lt;/p&gt;
&lt;p&gt;Human testers are the masters of the &quot;what if&quot; scenario. You try things a programmer never intended or even dreamed of. This creative way of breaking software is usually where the most critical vulnerabilities are hiding. It’s a uniquely human skill.&lt;/p&gt;
&lt;h3 id=&quot;8-legal-governance-and-final-production-sign-off&quot;&gt;8. Legal Governance and Final Production Sign-off&lt;/h3&gt;
&lt;p&gt;At the end of the day, an AI can't be held legally responsible if a software crash causes a disaster. Official governance rules require a human lead to give the final okay for production deployments.&lt;/p&gt;
&lt;p&gt;There has to be clear accountability when things go live. The AI acts as a powerful advisor that gives you data and confidence, but the &quot;Go&quot; button is yours. The decision to release software remains a human responsibility, and it likely always will.&lt;/p&gt;
&lt;h2 id=&quot;which-one-is-right-for-you-&quot;&gt;Which One is Right for You?&lt;/h2&gt;
&lt;p&gt;How do you choose the right path? It really depends on what your team is building and how fast you need to move. For big enterprise teams dealing with massive environments like SAP or Salesforce, a model-based approach like Tricentis Tosca is usually the best bet.&lt;/p&gt;
&lt;p&gt;If you’re at a fast-paced startup, you might prefer low-code tools like Mabl. These let non-technical team members help with testing using natural language prompts. It opens up the process so everyone can contribute to quality.&lt;/p&gt;
&lt;p&gt;For teams that need a &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.testrigtechnologies.com/is-your-web-app-pixel-perfect-playwrights-visual-testing-has-the-answer/&quot;&gt;pixel-perfect UI&lt;/a&gt; across many different phones and browsers, Applitools is the standard. Most modern teams end up using a hybrid model. They combine AI-driven regression with human-led exploratory testing to get the best results.&lt;/p&gt;
&lt;h2 id=&quot;final-thoughts&quot;&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;The real story isn't that AI is coming for your desk. It’s coming for the parts of your job that you probably hate doing anyway. By handling script maintenance and boring boilerplate, AI frees you up for the creative and strategic work.&lt;/p&gt;
&lt;p&gt;The future belongs to the &quot;AI-Assisted Tester.&quot; This is the person who knows how to use these tools to build better software faster than ever. If you want to stay ahead, now is the time to start playing with prompt engineering and model validation.&lt;/p&gt;
&lt;p&gt;Don’t wait for the industry to change around you. Why not be the person who leads the evolution of quality in your shop? The tools are ready when you are.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/9820/can-ai-replace-qa-engineers-the-truth-behind-the-hype</guid>
<pubDate>Fri, 16 Jan 2026 11:26:07 +0000</pubDate>
</item>
<item>
<title>The &quot;Spinner of Death&quot;: Why Localhost Latency is Lying to You</title>
<link>https://coderlegion.com/8636/the-spinner-of-death-why-localhost-latency-is-lying-to-you</link>
<description>&lt;p&gt;&lt;strong&gt;The &quot;Localhost&quot; Bias&lt;/strong&gt;&lt;br&gt;
We've all been there.&lt;/p&gt;
&lt;p&gt;On your machine, the API responds in &lt;strong&gt;5ms&lt;/strong&gt;. The UI updates instantly. You click &quot;Submit,&quot; the modal closes, and you move on to the next ticket. Status: &lt;strong&gt;Done&lt;/strong&gt;. ✅&lt;/p&gt;
&lt;p&gt;But on a user's 4G connection in a subway tunnel, that same API call takes &lt;strong&gt;2 seconds&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Because you tested on localhost (Gigabit Fiber), you missed critical race conditions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;️ &lt;strong&gt;The Double-Click Bug&lt;/strong&gt;: The user clicks &quot;Submit&quot; twice because &quot;nothing happened,&quot; charging their credit card twice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Infinite Spinner&lt;/strong&gt;: The loader gets stuck forever because a packet was dropped.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;️ &lt;strong&gt;Race Conditions&lt;/strong&gt;: Data arrives out of order, overwriting the user's input.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your app feels fast because you are cheating. &lt;strong&gt;0ms latency is a lie&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Wrong Solution&lt;/strong&gt;: &lt;code&gt;time.sleep()&lt;/code&gt;&lt;br&gt;
I often see tests that look like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# ❌ Don't do this
page.click(&quot;#submit&quot;)
time.sleep(2) # Simulating &quot;network lag&quot;
expect(page.locator(&quot;.success&quot;)).to_be_visible()
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;why-this-fails-sleep-just-pauses-the-test-execution-script-the-browser-engine-itself-is-still-blazing-fast-it-doesn-t-simulate-network-queues-slow-handshakes-or-constrained-bandwidth-you-aren-t-testing-the-network-you-re-just-making-your-test-suite-slower-&quot;&gt;&lt;strong&gt;Why this fails&lt;/strong&gt;: &lt;code&gt;sleep()&lt;/code&gt; just pauses the test execution script. The browser engine itself is still blazing fast. It doesn't simulate network queues, slow handshakes, or constrained bandwidth. You aren't testing the network; you're just making your test suite slower.&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;The Right Solution: Network Throttling (CDP)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To test this properly in automation, you need to talk directly to the browser engine. You need to tell Chrome: &quot;&lt;em&gt;Pretend you are on a terrible 50kb/s connection.&lt;/em&gt;&quot;&lt;/p&gt;
&lt;p&gt;We can do this using the &lt;strong&gt;Chrome DevTools Protocol (CDP)&lt;/strong&gt; within Playwright. This forces the browser to handle packet delays and loading states exactly as a real user would experience.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Code (Python + Playwright)&lt;/strong&gt;&lt;br&gt;
Here is how to inject a &quot;Bad 3G&quot; connection into your test:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from playwright.sync_api import Page, expect

def test_slow_network_handling(page: Page):
    # 1. Connect to Chrome DevTools Protocol (CDP)
    # This gives us low-level access to the browser
    client = page.context.new_cdp_session(page)
    
    # 2.  CHAOS: Emulate &quot;Bad 3G&quot;
    # Latency: 2000ms (2 seconds)
    # Throughput: 50kb/s (Very slow)
    client.send(&quot;Network.emulateNetworkConditions&quot;, {
        &quot;offline&quot;: False,
        &quot;latency&quot;: 2000, 
        &quot;downloadThroughput&quot;: 50 * 1024,
        &quot;uploadThroughput&quot;: 50 * 1024
    })

    page.goto(&quot;https://myapp.com/search&quot;)
    
    # 3. Trigger the slow action
    page.fill(&quot;#search-box&quot;, &quot;Playwright&quot;)
    page.click(&quot;#search-btn&quot;)

    # 4. Resilience Assertion
    
    # Check 1: Does the UI prevent double submission?
    expect(page.locator(&quot;#search-btn&quot;)).to_be_disabled()
    
    # Check 2: Does the user get immediate feedback?
    expect(page.locator(&quot;.loading-spinner&quot;)).to_be_visible()
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;why-this-matters-this-test-proves-your-ui-provides-feedback-if-a-user-clicks-a-button-and-waits-2-seconds-with-no-visual-feedback-they-will-assume-the-app-is-broken-&quot;&gt;&lt;strong&gt;Why this matters&lt;/strong&gt;: This test proves your UI provides feedback. If a user clicks a button and waits 2 seconds with no visual feedback, they will assume the app is broken.&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;But wait, what about Mobile Apps?&lt;/strong&gt; &lt;br&gt;
The script above is perfect for automated CI pipelines running Chrome. But CDP has a major limitation: &lt;strong&gt;It doesn't work on a physical iPhone or Android device&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If you are a Mobile Developer or manual QA, you can't &quot;attach Playwright&quot; to the phone in your hand to simulate a subway tunnel.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Manual Alternative (System-Level Proxy)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To test latency on a real device without writing code, you need a &lt;strong&gt;System-Level Proxy&lt;/strong&gt; that sits between your phone and the internet.&lt;/p&gt;
&lt;p&gt;You can use desktop tools like Charles Proxy (if you enjoy configuring Java apps and firewalls), or you can use a cloud-based tool like &lt;a rel=&quot;nofollow&quot; href=&quot;https://chaos-proxy.debuggo.app/&quot;&gt;Chaos Proxy&lt;/a&gt; (which I'm building).&lt;/p&gt;
&lt;p&gt;It allows you to simulate &lt;strong&gt;&quot;Subway Mode&quot; (2s latency)&lt;/strong&gt; on any device—iPhone, Android, or Laptop—just by connecting to a Wi-Fi proxy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Workflow:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a &quot;Chaos Rule&quot; (e.g., Latency = 2000ms).&lt;/li&gt;
&lt;li&gt;Connect your phone to the proxy via QR code.&lt;/li&gt;
&lt;li&gt;&lt;h3 id=&quot;watch-your-app-struggle-and-then-fix-it-&quot;&gt;Watch your app struggle (and then fix it).&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stop trusting Localhost&lt;/strong&gt;. It hides your worst bugs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automated&lt;/strong&gt;: Use Playwright + CDP to inject latency in your E2E tests.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Manual/Mobile&lt;/strong&gt;: Use a Chaos Proxy to test resilience on physical devices.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;happy-testing-&quot;&gt;Happy testing! &lt;/h3&gt;
&lt;p&gt;If you found this useful, check out my previous post: &lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/aragossa/stop-testing-success-kill-the-database-27mg&quot;&gt;Stop Testing Success. Kill the Database.&lt;/a&gt;&lt;/p&gt;
</description>
<category>QA Best Practices</category>
<guid isPermaLink="true">https://coderlegion.com/8636/the-spinner-of-death-why-localhost-latency-is-lying-to-you</guid>
<pubDate>Fri, 19 Dec 2025 15:19:20 +0000</pubDate>
</item>
<item>
<title>gRPC for Testers: Quick Start After REST</title>
<link>https://coderlegion.com/8394/grpc-for-testers-quick-start-after-rest</link>
<description>&lt;p&gt;REST API has long been the standard, but it has its limitations. When load increases, streaming scenarios appear, or business requires faster communication between services, REST stops being the ultimate solution. gRPC solves what REST cannot: it provides high data transfer speeds, supports streaming, and enforces a strict interaction structure. It is convenient to use in microservices, mobile, and IoT applications.&lt;/p&gt;
&lt;p&gt;For a tester, this means one thing: knowing how to work with gRPC is shifting from a &quot;nice-to-have&quot; to an essential skill. If you haven't worked with this protocol yet, this article will help you understand its basics, how it differs from REST, the structure of .proto files, and most importantly - how to test gRPC services using Postman.&lt;/p&gt;
&lt;h3 id=&quot;what-is-grpc-and-why-is-it-needed-&quot;&gt;What is gRPC and Why is it Needed?&lt;/h3&gt;
&lt;p&gt;gRPC is a high-performance framework from Google. As a QA specialist, you don't necessarily need to dive into implementation details, but understanding how this protocol works and how to test it will definitely be useful.&lt;/p&gt;
&lt;p&gt;To simplify, REST can be compared to paper letters sent in envelopes, while gRPC is like a phone call. Both are formats for communication between an application and a server, but with REST API, data is transferred in JSON or XML formats, which in our analogy can be equated to envelopes. This is okay and works, but not always fast or convenient.&lt;/p&gt;
&lt;p&gt;gRPC proposes wrapping data in a binary protocol, which transmits data faster, has a smaller size, and is strictly structured. It uses Protocol Buffers (protobuf). Thanks to this, both sides participating in the information exchange know in advance what questions will be asked and what answers to expect. For a tester, this means less ambiguity and more predictability in verifications.&lt;/p&gt;
&lt;p&gt;When we first implemented gRPC in a project, it unexpectedly turned out that Postman, by default, couldn't work with this protocol. We had to find workarounds - we tried BloomRPC, then grpcurl. In the end, we found a solution: uploading .proto files into a new beta version of Postman. It was a useful lesson - tools aren't always ready &quot;out of the box,&quot; and it's important for a tester to have several alternatives on hand.&lt;/p&gt;
&lt;h3 id=&quot;key-advantages-of-grpc&quot;&gt;Key Advantages of gRPC&lt;/h3&gt;
&lt;p&gt;Why is gRPC usage increasingly common in product development? Here are the main reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;High performance thanks to the binary protobuf format.&lt;/li&gt;
&lt;li&gt;Support for streaming: data can be transmitted not only in a&lt;br&gt;
&quot;request-response&quot; format but also as streams.&lt;/li&gt;
&lt;li&gt;Cross-platform: gRPC can be used for projects in different&lt;br&gt;
programming languages.&lt;/li&gt;
&lt;li&gt;Code autogeneration: client and server code is automatically&lt;br&gt;
generated from .proto files.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of this leads to fewer misunderstandings with developers, clear rules for validation, and new testing scenarios - for example, for streaming.&lt;/p&gt;
&lt;h3 id=&quot;key-differences-between-grpc-and-rest&quot;&gt;Key Differences Between gRPC and REST&lt;/h3&gt;
&lt;p&gt;Moving from testing REST to gRPC implies conceptual changes in the process. Instead of endpoints and HTTP methods - methods and messages described in a contract. For convenience, let's compare them in a table.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=10487932061552651656&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, let's look in more detail at one of gRPC's advantages over REST - the presence of streaming.&lt;/p&gt;
&lt;h3 id=&quot;types-of-grpc-calls&quot;&gt;Types of gRPC Calls&lt;/h3&gt;
&lt;p&gt;Unlike REST, which has the familiar GET/POST/PUT/DELETE, gRPC works with methods defined in a .proto file.&lt;/p&gt;
&lt;p&gt;Four types of calls are supported:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Unary&lt;/strong&gt; - one request, one response.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Server streaming&lt;/strong&gt; - one request, stream of responses.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Client streaming&lt;/strong&gt; - stream of requests, one response.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bidirectional streaming&lt;/strong&gt; - stream of requests, stream of responses.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;&lt;p&gt;When designing tests, it's important to consider that &quot;one test - one request&quot; isn't always suitable. For streaming, you need scenarios with multiple sequential messages.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;But to understand which methods are available and what data can be transmitted in these calls, you need to understand how a .proto file is structured.&lt;/p&gt;
&lt;h3 id=&quot;how-a-proto-file-is-structured&quot;&gt;How a .proto File is Structured&lt;/h3&gt;
&lt;p&gt;This is a simple text file with a .proto extension. In it, we essentially agree on what data can be sent and received, and what methods the service has.&lt;/p&gt;
&lt;p&gt;You can think of it as an instruction or contract between the service developer and those who use it (for example, QA specialists).&lt;/p&gt;
&lt;p&gt;Usually, the .proto file is created by the backend service developer, because they know which methods the service must support, as well as what data is accepted and returned.&lt;/p&gt;
&lt;p&gt;A tester can also open a .proto file to understand how to correctly form a request, suggest improvements (for example, add a field or change a data type), and, if desired, write their own .proto for learning or experiments.&lt;/p&gt;
&lt;p&gt;Before moving on to the structure of a .proto file, let's make an important clarification.&lt;/p&gt;
&lt;p&gt;gRPC indeed transmits data in the binary Protocol Buffers format, not JSON - this is why it is more efficient than REST in terms of speed and traffic volume. However, when testing via tools like Postman, BloomRPC, or grpcurl, you will see requests and responses in a human-readable format resembling JSON. This is a visualization of the binary data for humans. The tools automatically convert the binary stream into such &quot;pseudo-JSON&quot; to make it easier for you to work with the fields.&lt;/p&gt;
&lt;p&gt;In our examples, we will also use this readable format - not because gRPC uses JSON, but so you can quickly understand the message structure.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=483228635814948243&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let's look at a simple example of a .proto file:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;syntax = &quot;proto3&quot;;

service HelloService {

  rpc SayHello (HelloRequest) returns (HelloResponse);

}

message HelloRequest {

  string name = 1;

}

message HelloResponse {

  string message = 1;

}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;what-s-inside-&quot;&gt;What's Inside:&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Syntax Specification&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;syntax = &quot;proto3&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Syntax&lt;/em&gt; indicates which version of the &lt;em&gt;Protocol Buffers&lt;/em&gt; language we are using. At the time of writing, the current version is the third - proto3.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Service Definition&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;service HelloService {

  rpc SayHello (HelloRequest) returns (HelloResponse);

}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Service HelloService&lt;/em&gt; - declaration of a service named &lt;em&gt;HelloService&lt;/em&gt;.You can think of a service as a class containing methods.&lt;br&gt;
&lt;em&gt;rpc SayHello (...) returns (...)&lt;/em&gt; - this describes a remote procedure call, where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;SayHello&lt;/em&gt; - the method name.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;(HelloRequest)&lt;/em&gt; - what the method accepts (request type).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;returns (HelloResponse)&lt;/em&gt; - what the method returns (response type).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In our example, the service has only one method, &lt;em&gt;SayHello&lt;/em&gt;, which accepts a &lt;em&gt;HelloRequest&lt;/em&gt; message and returns a &lt;em&gt;HelloResponse&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Request Message Description&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;message HelloRequest {
string name = 1;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Message HelloRequest&lt;/em&gt; defines the data type for the request. Inside it:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;string name&lt;/em&gt; = 1;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;string&lt;/em&gt; - data type (string).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;name&lt;/em&gt; - field name.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;= 1&lt;/em&gt; - sequence number (needed for serialization).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This means: the client must pass a string field name.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=10271626474848022935&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Response Message Description&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;message HelloResponse {

  string message = 1;

}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Message HelloResponse&lt;/em&gt; defines the data type for the response. Inside:&lt;/p&gt;
&lt;p&gt;string message = 1; &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a string that will contain the result.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In our case, the server will return a greeting string.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=11166341434639876583&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;All of this works as follows: the client calls the SayHello method, in the HelloRequest it sends the name field, the server receives this field, forms a response, and in the HelloResponse it returns a string with a greeting.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;If you know how to read and understand .proto files, you can easily grasp the data structure and suggest improvements to the API even at the design stage.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And now, it's logical to move on to the next question: what else does the service return besides useful data? Here we'll talk about gRPC status codes.&lt;/p&gt;
&lt;h3 id=&quot;grpc-status-codes-what-a-tester-needs-to-know&quot;&gt;gRPC Status Codes: What a Tester Needs to Know&lt;/h3&gt;
&lt;p&gt;In gRPC, every response (even a successful one) is accompanied by a status code. These are not HTTP 200/404/500, but their own set of codes defined in the gRPC library. In total, gRPC has 17 predefined status codes, from 0 to 16, but we will consider only the most basic and commonly used ones.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Main gRPC Status Codes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=12315034930414177652&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;It's important not only to verify the correctness of the data in the response but also to ensure the service correctly returns status codes in various scenarios.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;gRPC in Postman: Practical Testing&lt;/p&gt;
&lt;p&gt;Previously, Postman could only work with REST, but now - also with gRPC.&lt;/p&gt;
&lt;p&gt;How it works:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Upload the .proto file into Postman.&lt;/li&gt;
&lt;li&gt;Select the service and method.&lt;/li&gt;
&lt;li&gt;Form the request (data is taken from the request structure in the&lt;br&gt;
.proto).&lt;/li&gt;
&lt;li&gt;Look at the response and status code.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For example, for a simple service:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=6420006592110248837&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;A request in Postman will contain the name field, and in response a greeting message will arrive.&lt;/p&gt;
&lt;p&gt;Let's look at an example.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a new request → select the request type gRPC Request (not HTTP!).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=11990946662172834351&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Specify the URL, open the Service Definition tab, import the .proto file.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=13336233533885360006&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;After importing the .proto file, all available methods the service can work with will become available for selection.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=8127294805015269577&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Select the method we need, and a JSON-like form with fields that need to be filled in will appear in the request body (all required fields are defined in our .proto file).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=4396255528608601789&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click Invoke and you will see the response and status code.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=11298507140034182759&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=12869971741274289542&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;summary&quot;&gt;Summary&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;gRPC is faster than REST, supports streaming, and enforces strict&lt;br&gt;
contracts.&lt;/li&gt;
&lt;li&gt;For a tester, the key skills are: being able to read .proto files,&lt;br&gt;
check different call types, and work with tools (Postman, grpcurl,&lt;br&gt;
BloomRPC).&lt;/li&gt;
&lt;li&gt;Don't forget about status codes: they help understand how a service&lt;br&gt;
behaves in error scenarios.&lt;/li&gt;
&lt;li&gt;In practice, you may encounter pitfalls: not every tool supports gRPC&lt;br&gt;
as conveniently as REST.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By mastering gRPC, you will expand your arsenal: you'll be able to test not only REST services but also more modern microservice systems. And that means—you'll become a more in-demand specialist.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Author: Vasil Khamidullin&lt;/em&gt;&lt;/p&gt;
</description>
<category>Web Dev</category>
<guid isPermaLink="true">https://coderlegion.com/8394/grpc-for-testers-quick-start-after-rest</guid>
<pubDate>Thu, 11 Dec 2025 12:03:55 +0000</pubDate>
</item>
<item>
<title>Bloodhound Security by Agunech</title>
<link>https://coderlegion.com/8214/bloodhound-security-by-agunech</link>
<description>&lt;p&gt;Instead of guessing at race conditions, memory leaks, attack paths, I architected a local engine that runs 7 parallel detection threads to recursively map entire Call Graphs. &lt;/p&gt;
&lt;p&gt;It traces Tainted Control Flow across file boundaries to prove Deterministic Reachability, to give the exact execution path from input to crash without the theoretical noise of standard linters.&lt;/p&gt;
&lt;p&gt;Here is the architectural breakdown:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Recursive Taint Analysis: Instead of regex-matching for &quot;bad patterns&quot; (like eval()), Blood Hound builds a complete Call Graph of the application. It maps data from Sources (Inputs) to Sinks (execution) across file boundaries. It does not flag a vulnerability unless it can prove a connected path exists in runtime. Therefore filtering out theoretical noise plaguing syntax testers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Local Parallelization: To handle the computational load of tracking state across 2M+ LOC without timing out, the system runs 7 detection engines in parallel locally. This allows for exhaustive recursion to validate dependency chains too deep for manual review, all done locally.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;White Box Execution: This is not a DAST that pokes from the outside. It operates as a White Box analyst, linking runtime crashes directly to the exact source lines causing them.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The Goal: I didn't build this to replace engineers. I built it to handle the computational drudgery of dependency tracing. It clears the false positives so I can focus on complex exploit chains.&lt;/p&gt;
&lt;p&gt;It runs via CLI (blood hound). Just install needed.&lt;/p&gt;
&lt;p&gt;If you are an Engineer with a repo in prod, I’d love for you to stress-test the reachability logic against your messiest repo and compare it to your other testing tools&lt;/p&gt;
&lt;p&gt;Here's some images from how it looks inside the IDE: &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=16843318301080668016&quot; alt=&quot;&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=8143441633708764459&quot; alt=&quot;&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=8264566379808419479&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
</description>
<category>Dev Tools</category>
<guid isPermaLink="true">https://coderlegion.com/8214/bloodhound-security-by-agunech</guid>
<pubDate>Fri, 05 Dec 2025 23:48:15 +0000</pubDate>
</item>
<item>
<title>My AI Bot Argues With My Swagger Schema (And Why That's Good)</title>
<link>https://coderlegion.com/7710/my-ai-bot-argues-with-my-swagger-schema-and-why-thats-good</link>
<description>&lt;p&gt;In my last posts, I talked a lot about UI tests. But the real meat (and the real pain) of automation often lies with the API.&lt;/p&gt;
&lt;p&gt;API tests need to be fast, stable, and cover 100% of your endpoints. &quot;Simple,&quot; you say. &quot;Just take the Swagger schema and run requests against it.&quot;&lt;/p&gt;
&lt;p&gt;Oh, if only it were that simple.&lt;/p&gt;
&lt;p&gt;When I started adding API test automation to Debuggo, I realized the whole process is a series of traps. Here is how I'm solving them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1: Parsing the Schema (The Deceptively Easy Start)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It all starts simply. I implemented a feature:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You &lt;strong&gt;upload a Swagger&lt;/strong&gt; schema (only Swagger for now).&lt;/li&gt;
&lt;li&gt;Debuggo parses it and &lt;strong&gt;automatically creates dozens of test cases&lt;/strong&gt;:&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[Positive]&lt;/code&gt; For every endpoint.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[Negative]&lt;/code&gt; For every required field.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[Negative]&lt;/code&gt; For every data type (field validation).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This already saves hours of manual work &quot;dreaming up&quot; negative scenarios. After this, you can pick any generated test case (e.g., &lt;code&gt;[Negative] Create User with invalid email&lt;/code&gt;) and ask Debuggo: &quot;Generate the steps for this.&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2: Creating Steps (The First Challenge: &quot;Smart Placeholders&quot;)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;...the first real problem begins. How does an AI know what a &quot;bad email&quot; is?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Bad Solution&lt;/strong&gt;: Hardcoding the knowledge that &lt;code&gt;*Emails are not allowed*&lt;/code&gt; is a bad email into the AI. This is brittle and stupid.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Debuggo Solution: Smart Placeholders.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When Debuggo generates steps for a negative test, it doesn't insert a &lt;em&gt;value&lt;/em&gt;. It inserts a &lt;em&gt;placeholder&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;For example, for a &lt;code&gt;POST /users&lt;/code&gt; with an invalid &lt;code&gt;email&lt;/code&gt;, it will generate a step with this body:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{&quot;name&quot;: &quot;test-user&quot;, &quot;email&quot;: &quot;%invalid_email_format%&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then, at the &lt;em&gt;moment of execution&lt;/em&gt;, Debuggo itself (not the AI) expands this placeholder into real, generated data that is 100% invalid. The same goes for dropdowns, selects, etc. — the AI doesn't guess the selector, it inserts a placeholder, and Debuggo handles it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 3: The First Run (The Second Challenge: &quot;The Schema Lies&quot;)&lt;/strong&gt;&lt;br&gt;
So, we have our steps with placeholders. We run the test. And it fails.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Scenario&lt;/strong&gt;: The schema says POST /users returns 200 OK. The application actually returned 201 Created.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A traditional auto-test&lt;/strong&gt;: Will just fail, giving you a &quot;flaky&quot;&lt;br&gt;
test.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Debuggo Solution: A Dialogue with the User.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Debuggo sees the conflict: &quot;Expected &lt;code&gt;200&lt;/code&gt; from the schema, but got &lt;code&gt;201&lt;/code&gt; from the app.&quot;&lt;/p&gt;
&lt;p&gt;It doesn't just fail. It pauses the test and asks you:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&quot;Hey, the schema and the real response don't match. Do you want to accept 201 as the correct response for this test?&quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You, the user, confirm. Debuggo fixes the test case. You just fixed a brittle test without writing a single line of code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 4: Adaptation (The Third Challenge: &quot;Secret&quot; Business Rules)&lt;br&gt;
This is the coolest feature I've implemented.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Scenario:&lt;/strong&gt; The app returns a &lt;code&gt;400 Bad Request&lt;/code&gt; with the response body: &lt;code&gt;{&quot;error&quot;: &quot;name cannot contain spaces&quot;}&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A traditional auto-test&lt;/strong&gt;: Will fail, and you have to manually analyze the logs to find the hidden rule.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Debuggo Solution: Adaptation on the Fly.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Debuggo doesn't just see the &lt;code&gt;400&lt;/code&gt; error. It reads the response body and sees the rule: &quot;&lt;em&gt;name cannot contain spaces.&lt;/em&gt;&quot;&lt;/p&gt;
&lt;p&gt;It automatically changes the placeholder for this field. It creates a new one — &lt;code&gt;%string_without_spaces%&lt;/code&gt; — and re-runs the test by itself with the new, correct value.&lt;/p&gt;
&lt;p&gt;The AI is learning the real business rules of your app, even if they aren't documented in Swagger.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What's the takeaway?&lt;/strong&gt;&lt;br&gt;
I'm not just building a &quot;Swagger parser.&quot; I'm building an assistant that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generates hundreds of positive/negative test cases.&lt;/li&gt;
&lt;li&gt;Uses &quot;Smart Placeholders&quot; instead of hardcoded values.&lt;/li&gt;
&lt;li&gt;Identifies conflicts between the schema and reality and helps you fix them.&lt;/li&gt;
&lt;li&gt;Learns from the application's errors to make tests smarter.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is a hellishly complex thing to implement, and I'm sure it's still raw.&lt;/p&gt;
&lt;p&gt;That's why I need your help. If you have a &quot;dirty,&quot; &quot;old,&quot; or &quot;incomplete&quot; Swagger schema—you are my perfect beta tester.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/7710/my-ai-bot-argues-with-my-swagger-schema-and-why-thats-good</guid>
<pubDate>Mon, 24 Nov 2025 08:30:02 +0000</pubDate>
</item>
<item>
<title>Why Automation Testing Fails Without the Right QA Mindset</title>
<link>https://coderlegion.com/6071/why-automation-testing-fails-without-the-right-qa-mindset</link>
<description>&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Why automation testing fails is one of the most common challenges in DevOps today. While automation promises speed, many teams still struggle with fragile pipelines, missed defects, and wasted effort. The missing piece is often the QA mindset in automation testing—a way of thinking that ensures automation is purposeful, adaptable, and aligned with business goals.&lt;/p&gt;
&lt;h3 id=&quot;why-automation-testing-fails&quot;&gt;Why Automation Testing Fails&lt;/h3&gt;
&lt;p&gt;Automation fails most often when speed is prioritized over strategy. According to DevOps.com, many organizations rush into automation without proper planning, leading to flakiness and wasted investments.&lt;/p&gt;
&lt;p&gt;Key reasons why automation testing fails include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Late QA involvement&lt;/strong&gt;: Tests are created after functionality is built, missing early risks.  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coverage obsession&lt;/strong&gt;: Teams measure test count, not risk coverage.  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fragile scripts&lt;/strong&gt;: UI and API changes constantly break automated cases.  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Poor data practices&lt;/strong&gt;: Static or unreliable test data undermines results.  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No risk focus&lt;/strong&gt;: Teams test what’s easy, not what matters most.  &lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;the-role-of-qa-mindset-in-automation-testing&quot;&gt;The Role of QA Mindset in Automation Testing&lt;/h3&gt;
&lt;p&gt;A QA mindset in automation testing means looking beyond scripts. It focuses on user needs, risk-based scenarios, and real-world workflows.&lt;/p&gt;
&lt;p&gt;For example, BrowserStack highlights that brittle test cases often fail because teams ignore business priorities. A QA mindset ensures automation adapts to change and focuses on outcomes, not just execution.&lt;/p&gt;
&lt;p&gt;This mindset asks questions like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How could this feature fail under real use?  &lt;/li&gt;
&lt;li&gt;Does this workflow support business logic?  &lt;/li&gt;
&lt;li&gt;Will users trust the experience?  &lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;why-human-qa-thinking-still-matters&quot;&gt;Why Human QA Thinking Still Matters&lt;/h3&gt;
&lt;p&gt;Automation validates what it is programmed to check. But real-world systems evolve, and business rules shift. Human testers bring adaptability, creativity, and judgment.&lt;/p&gt;
&lt;p&gt;For example, a payroll system upgrade used automation for regression, but human QA validated integration with finance rules and user experience. Without that, automation alone would have missed critical compliance risks.&lt;/p&gt;
&lt;p&gt;A LambdaTest study confirms that combining automation with human-driven testing reduces defect leakage and improves release confidence.&lt;/p&gt;
&lt;h3 id=&quot;how-to-prevent-automation-testing-failures&quot;&gt;How to Prevent Automation Testing Failures&lt;/h3&gt;
&lt;p&gt;To ensure automation delivers value instead of false confidence, teams should:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Involve QA From the Start&lt;/strong&gt;&lt;br&gt;
Engage QA during requirement and design phases, not just at the end.  &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prioritize by Risk&lt;/strong&gt;&lt;br&gt;
Focus automation on features with high business or customer impact.  &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build Maintainable Scripts&lt;/strong&gt;&lt;br&gt;
Use modular design, version control, and avoid brittle selectors.  &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Balance Automation With Manual Testing&lt;/strong&gt;&lt;br&gt;
Automation handles regression; humans explore edge cases, UX, and new features.  &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Continuously Improve&lt;/strong&gt;&lt;br&gt;
Track metrics like coverage, stability, and ROI. Refine strategies after every release.  &lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;why-automation-testing-fails-without-qa-mindset&quot;&gt;Why Automation Testing Fails Without QA Mindset&lt;/h3&gt;
&lt;p&gt;Even the most advanced frameworks fail if guided by the wrong mindset. Scripts can pass while defects slip into production.&lt;/p&gt;
&lt;p&gt;Consider a mortgage calculation tool: automation validated formulas, but only human QA confirmed compliance with real lending laws. Without the QA mindset, the system would have shipped “working” but non-compliant code.&lt;/p&gt;
&lt;p&gt;This is why automation testing fails when treated as a toolset rather than a discipline.&lt;/p&gt;
&lt;h3 id=&quot;final-word-from-uptech-solution&quot;&gt;Final Word from UpTech Solution&lt;/h3&gt;
&lt;p&gt;At &lt;a rel=&quot;nofollow&quot; href=&quot;https://uptech-solution.com/&quot;&gt;UpTech Solution&lt;/a&gt;, we’ve seen firsthand that automation succeeds only when guided by human insight. A strong QA mindset in automation testing ensures automation delivers more than speed—it delivers trust, compliance, and user satisfaction.&lt;/p&gt;
&lt;p&gt;Automation accelerates, but QA ensures resilience. The question is: are you just automating scripts, or are you automating with purpose?&lt;/p&gt;
</description>
<category>Monitoring &amp; Logging</category>
<guid isPermaLink="true">https://coderlegion.com/6071/why-automation-testing-fails-without-the-right-qa-mindset</guid>
<pubDate>Sat, 04 Oct 2025 16:41:45 +0000</pubDate>
</item>
</channel>
</rss>