Hello, Testing Community!
Iโve put together a collection of Software Testing tutorials that can help you learn, practice, and refresh your skills ๐
Basics of Software Testing
๐ฝ๏ธ https://t.co/7n0YXHXv3g
#SoftwareTesting#QA#Testing#SDET#Tutorial#Learning #SoftwareDevelopment
Continued ๐๐
Docker vs Kubernetes
๐๐ผ๐ฐ๐ธ๐ฒ๐ฟ is a containerization platform that solves the โit works on my machineโ problem.
It builds images, runs containers, and primarily runs them on a single host. Applications are packaged with everything they need and run as lightweight, isolated containers. The focus is on running software consistently with simple primitives like images and containers.
๐๐๐ฏ๐ฒ๐ฟ๐ป๐ฒ๐๐ฒ๐ is a cluster orchestration system.
It manages containers across multiple machines using a control plane that schedules and maintains containerized workloads. It works with Pods and reconciles actual state to desired state. The focus is on operating software at scale with capabilities like self-healing, autoscaling, and rolling updates.
Kubernetes doesnโt create containers. It orchestrates them. Docker runs containers. Kubernetes keeps them running.
What else would you add?
โ Follow me ( @NikkiSiapno ) to improve at system design.
Hereโs a full 3-hour data structures course built for real use.
I'll walk you through the core topics in a way that actually helps with technical interviews and problem solving.
So if you want a stronger foundation for interviews, LeetCode, or CS, watch this video.
More and more people are asking me about testing resources so let's put everything I've written in one post. Bookmark, share, and, most importantly, please read these.
The True Purpose of Testing
https://t.co/KwnelsWjhp
Developers often overlook the fundamentals and rush into writing tests without properly understanding what a test is and what is its function. No test is inherently useful just because it exists. Read this one to learn what makes it useful.
The Golden Rule of Assertions
https://t.co/3pZ5bcT3lo
There's a lot of debate over what makes a good test. In this one, I'm defining a short and objective way to grade a test's quality no matter the language or the tested system. This is, without a tinge of exaggeration, a game-changer in how you approach your tests.
Anatomy of a Test
https://t.co/yT1ihVfORT
Let's talk about the building blocks that make up any automated test. From JavaScript to Go and Rustโthese blocks power tests everywhere. Know your blocks.
Implicit Assertions
https://t.co/WmpC4nN4Zm
Did you know there's a way to express expectations in tests without writing "expect"? Those are called implicit assertions and they are tremendously powerful because they help you express more by writing less.
Inverse Assertions
https://t.co/ItgBFRc5oz
Sometimes you need to assert that something did not happen. That can be tricky, especially if that something is asynchronous. The last thing you want are false positives. What you actually want is inverse assertions.
Making Use of Code Coverage
https://t.co/fr6BJ5BOxT
Code coverage has been an ongoing debate in the engineering circles. Is 100% code coverage in tests good? Bad? When should you strive for it? Why do people say it's harmful? I'm answering all those questions in this one and giving you practical tips on when to use (and not to use) code coverage.
Good Code, Testable Code.
https://t.co/Eenwjb25vV
You've gathered by now that some code is easier to test than the other. But why? Let's take a look at the characteristic of code's testability, what defines it, what is its relationship with complexity, and how to make your code more testable.
What is a Test Boundary?
https://t.co/iF5OoW3xsF
Automated tests rarely involve your entire system (yes, even the end-to-end ones have exceptions). There's often a place where you draw the line. The boundary. Learn what it is and how to use test boundaries efficiently to focus on the exact behaviors you want to test.
Be S.M.A.R.T. About Flaky Tests
https://t.co/CXK6um3mfJ
Flakiness is the scourge of reliability. If you've written a test before, you likely had experience with flakiness. But what is it at its core and what causes it? And how should you deal with flakiness?
Writing Tests That Fail
https://t.co/3HJauq4zRb
You write tests for them to fail. We all enjoy a green CI, but the true value of tests is when they fail. What matters is when and how they fail.
I loved reading the first edition of "Designing Data-Intensive Applications". It is the most comprehensive book on the types of systems I work on. I recently started reading the second edition. It was a pleasant surpriseโand rather humblingโto read the references in Chapter 1.
7 Must-Know Big-O Complexities for Coding Interviews:
1. ๐(1) - ๐๐จ๐ง๐ฌ๐ญ๐๐ง๐ญ ๐ญ๐ข๐ฆ๐
- The runtime doesn't change regardless of the input size.
- Example: Accessing an element in an array by its index.
2. ๐(๐ฅ๐จ๐ ๐ง) - ๐๐จ๐ ๐๐ซ๐ข๐ญ๐ก๐ฆ๐ข๐ ๐ญ๐ข๐ฆ๐
- The runtime grows slowly as the input size increases. Typically seen in algorithms that divide the problem in half with each step.
- Example: Binary search in a sorted array.
3. ๐(๐ง) - ๐๐ข๐ง๐๐๐ซ ๐ญ๐ข๐ฆ๐
- The runtime grows linearly with the input size.
- Example: Finding an element in an array by iterating through each element.
4. ๐(๐ง ๐ฅ๐จ๐ ๐ง) - ๐๐ข๐ง๐๐๐ซ๐ข๐ญ๐ก๐ฆ๐ข๐ ๐ญ๐ข๐ฆ๐
- The runtime grows slightly faster than linear time. It involves a logarithmic number of operations for each element in the input.
- Example: Sorting an array using quick sort or merge sort.
5. ๐(๐ง^2) - ๐๐ฎ๐๐๐ซ๐๐ญ๐ข๐ ๐ญ๐ข๐ฆ๐
- The runtime grows proportionally to the square of the input size.
- Example: Bubble sort algorithm which compares and potentially swaps every pair of elements.
6. ๐(2^๐ง) - ๐๐ฑ๐ฉ๐จ๐ง๐๐ง๐ญ๐ข๐๐ฅ ๐ญ๐ข๐ฆ๐
- The runtime doubles with each addition to the input. These algorithms become impractical for larger input sizes.
- Example: Generating all subsets of a set.
7. ๐(๐ง!) - ๐ ๐๐๐ญ๐จ๐ซ๐ข๐๐ฅ ๐ญ๐ข๐ฆ๐
- Runtime is proportional to the factorial of the input size.
- Example: Generating all permutations of a set.
โป๏ธ Repost to help others learn this
When your tests are harder to manage than your Spring Boot app, something's off.
Daniel Garnier-Moiroux, author of Testing Spring Boot Applications, breaks down:
โข what to test vs skip
โข what to mock (and avoid)
โข why test suites become slow and brittle
They're practical ways to build tests that scale with your code, not against it.
Check out what he has to say: https://t.co/mu6iBuGmDa
In 2019, MIT professor Patrick Winston gave a legendary 1-hour lecture called โHow to Speak.โ
It has 18M+ views for a reason.
His frameworks:
โข Your ideas are like your children
โข The 5-minute rule for job talks
โข Why jokes fail at the start
15 lessons on communication:
The most popular Spring Boot AI skill has 9.8K installs and its advice is "use constructor injection" ๐
That's why I built https://t.co/D3Nti6rgQQ โ a curated directory of expert-authored AI coding skills for JVM developers.
Using AI to simplify my day-to-day work ๐
As part of my work, I often need to create Spring Boot projects, implement REST APIs to try some new features of #SpringBoot or #IntelliJIDEA.
So, I created an IntelliJ IDEA Plugin to generate CRUD implementation for a selected JPA entity ๐
Networking 101: Port Forwarding ๐งโโ๏ธ
Have you ever been in a situation where a service that listens on localhost needed to become accessible on the server's external interface?
While a proper solution is likely to stop, reconfigure, and restart the service, Port Forwarding offers a quick-and-dirty alternative: make all data sent to one port forwarded to another (and vice versa).
There are several ways to implement Port Forwarding:
- With a user-space proxy process like socat or netcat
- Transparently on the network level (e.g., using iptables)
Practice forwarding ports by solving these hands-on exercises:
- socat https://t.co/BMJ4tflgpL
- netcat https://t.co/ANRAQITrvP
- iptables https://t.co/GphEAaEHxS
Most developers can name 10 types of testing
But only a few can explain when to use each one
Here's a quick breakdown:
๐ญ. ๐ฆ๐บ๐ผ๐ธ๐ฒ ๐ง๐ฒ๐๐๐ถ๐ป๐ด
Does the app even launch?
๐ฎ. ๐๐๐ป๐ฐ๐๐ถ๐ผ๐ป๐ฎ๐น ๐ง๐ฒ๐๐๐ถ๐ป๐ด
Does each feature give the right output?
๐ฏ. ๐๐ป๐๐ฒ๐ด๐ฟ๐ฎ๐๐ถ๐ผ๐ป ๐ง๐ฒ๐๐๐ถ๐ป๐ด
Do the modules still work when connected?
๐ฐ. ๐ฅ๐ฒ๐ด๐ฟ๐ฒ๐๐๐ถ๐ผ๐ป ๐ง๐ฒ๐๐๐ถ๐ป๐ด
Did your latest commit break something that worked yesterday?
๐ฑ. ๐๐ผ๐ฎ๐ฑ ๐ง๐ฒ๐๐๐ถ๐ป๐ด
Can the system handle real traffic without choking?
๐ฒ. ๐ฆ๐๐ฟ๐ฒ๐๐ ๐ง๐ฒ๐๐๐ถ๐ป๐ด
What happens when you push past the breaking point?
๐ณ. ๐ฆ๐ฒ๐ฐ๐๐ฟ๐ถ๐๐ ๐ง๐ฒ๐๐๐ถ๐ป๐ด
Can someone exploit a hole you didn't know existed?
๐ด. ๐จ๐ ๐ง๐ฒ๐๐๐ถ๐ป๐ด
Does the interface behave the way a user expects?
๐ต. ๐๐๐๐ ๐ง๐ฒ๐๐๐ถ๐ป๐ด
What breaks when you throw garbage data at the app?
๐ญ๐ฌ. ๐ฅ๐ฒ๐น๐ถ๐ฎ๐ฏ๐ถ๐น๐ถ๐๐ ๐ง๐ฒ๐๐๐ถ๐ป๐ด
Does the system hold up after running for days, not minutes?
Most teams test if features work. Few test if they survive.
You don't need all 10 on every project. But knowing when each one matters makes the difference.
Pick one that your team doesn't do today. Start there.
SOLID Principles Explained with Clear Examples:
๐ - ๐๐ข๐ง๐ ๐ฅ๐ ๐๐๐ฌ๐ฉ๐จ๐ง๐ฌ๐ข๐๐ข๐ฅ๐ข๐ญ๐ฒ ๐๐ซ๐ข๐ง๐๐ข๐ฉ๐ฅ๐
A class should have only one reason to change.
- Example: Instead of one giantย Userย class that handles authentication, profile updates, and sending emails, split it intoย UserAuth,ย UserProfile, andย EmailService.
๐ - ๐๐ฉ๐๐ง/๐๐ฅ๐จ๐ฌ๐๐ ๐๐ซ๐ข๐ง๐๐ข๐ฉ๐ฅ๐
Classes should be open for extension but closed for modification.
- Example: Define aย Shapeย interface with anย area()ย method. When you need a new shape, just add aย Circleย orย Triangleย class that implements it.
๐ - ๐๐ข๐ฌ๐ค๐จ๐ฏ ๐๐ฎ๐๐ฌ๐ญ๐ข๐ญ๐ฎ๐ญ๐ข๐จ๐ง ๐๐ซ๐ข๐ง๐๐ข๐ฉ๐ฅ๐
Subtypes must be substitutable for their base types without breaking behavior.
- Example: Ifย Birdย has aย fly()ย method, thenย Eagleย andย Sparrowย should both work anywhere aย Birdย is expected.
๐ - ๐๐ง๐ญ๐๐ซ๐๐๐๐ ๐๐๐ ๐ซ๐๐ ๐๐ญ๐ข๐จ๐ง ๐๐ซ๐ข๐ง๐๐ข๐ฉ๐ฅ๐
Don't force classes to implement interfaces they don't use.
- Example: Instead of one fatย Machineย interface withย print(),ย scan(), andย fax(), break it intoย Printable,ย Scannable, andย Faxable. Aย SimplePrinterย only implementsย Printable.
๐ - ๐๐๐ฉ๐๐ง๐๐๐ง๐๐ฒ ๐๐ง๐ฏ๐๐ซ๐ฌ๐ข๐จ๐ง ๐๐ซ๐ข๐ง๐๐ข๐ฉ๐ฅ๐
High-level modules should not depend on low-level modules. Both should depend on abstractions.
- Example: Yourย OrderServiceย should depend on aย PaymentGatewayย interface, not directly onย Stripeย orย PayPal.
The real power of SOLID is not in following each principle in isolation. It's in how they work together to make your code easier to change, test, and extend.
โป๏ธ Repost to help others in your network
Most developers are using Claude Code wrong.
They install itโฆ
run a few promptsโฆ
and treat it like a terminal chatbot.
Thatโs why the results feel average.
Claude Code is actually a 4-layer system ๐
1๏ธโฃ CLAUDE.md
Your projectโs persistent memory.
It defines:
โข what the system does
โข how the repo is structured
โข rules Claude should follow
Think of it as the brain of the project.
2๏ธโฃ Skills
Reusable knowledge packs Claude automatically invokes.
Examples:
โข code review rules
โข refactor playbooks
โข debugging workflows
โข release procedures
Skills make Claude behave like a specialized engineer, not a generic model.
3๏ธโฃ Hooks
Deterministic safety gates.
Important detail:
Rules in CLAUDE.md โ followed ~70% of the time
Hooks โ enforced 100% of the time
Use hooks for:
โข running tests
โข formatting code
โข blocking risky directories
4๏ธโฃ Agents
Sub-agents with their own context windows.
This lets Claude handle complex multi-step work without losing context.
Most engineers miss the setup that makes all of this work.
The difference between average and exceptional results is the initial configuration:
โข run /init on day one to generate CLAUDE.md
โข structure the .claude/ folder (skills, hooks, permissions)
โข write skill descriptions that actually trigger correctly
โข use memory hierarchy (global โ project โ subfolder)
โข enforce rules with hooks instead of relying on prompts
When this is configured properly, the workflow becomes:
Plan Mode โ Auto-Accept โ Iterate โ Commit.
If you're using Claude Code without CLAUDE.md + Skills + Hooks, you're probably using 20% of what it can actually do.
#ClaudeCode #AIAgents #AIEngineering #GenAI #DeveloperTools
If youโre developing locally and donโt want to burn money on APIs, use Claude Code with Ollama, and e.g., the GLM-5 model. It's a pretty powerful and free option.