Testing & Quality Assurance
November 2026
Web Development
How maintaining HK Lab Studio shaped the way I approach visual regression testing, responsive checks and release comparisons.
HK Lab Studio

Working on a website that continues to grow has made me more careful about changes that appear isolated. Updating a component, adjusting a layout or changing the way something behaves in the CMS can look straightforward while I am working on it, particularly when the page being edited responds exactly as expected. The problem is that a modern website rarely consists of independent pages. Shared components, reusable layouts, content collections and interactions can connect parts of the site that appear unrelated when viewed in the editor.
I have encountered this repeatedly while developing and maintaining HK Lab Studio. What began as a relatively focused website has grown into a store, blog, product catalogue and collection of interactive tools, each with different layouts and behaviours. A change that improves one area can affect something elsewhere, especially when several pages depend on the same component or CMS structure. The effects are not always immediately visible, and the page where the change was made is not necessarily the page where the problem eventually appears.
That experience has influenced how I approach website updates. I still want to work efficiently and avoid turning every small adjustment into an unnecessarily complicated release process, but I have become less comfortable relying on whether the edited page looks correct. The more useful question is whether the update has preserved the parts of the website that were already working, and whether I have enough evidence to distinguish an intentional change from an unexpected regression.
A small change can have a much larger footprint
One of the advantages of building a website with reusable components is that improvements can be applied consistently. If the same navigation, product card or article layout is used across several pages, maintaining it in one place is usually more sensible than managing separate versions of the same design. That consistency saves development time, but it also means that a mistake in a shared component can travel much further than a problem in an isolated section.
The blog is a useful example because the same underlying structure supports articles with different titles, descriptions and cover images. The design has to accommodate those differences without the cards becoming inconsistent or the layout breaking at narrower screen widths. An adjustment that looks correct with one article may create problems when another article has a longer heading, a different image composition or an excerpt that occupies more lines. The component itself has not necessarily changed between those pages, but the content exposes a behaviour that was not obvious during the original edit.
The same principle applies to the store. A product page is not simply a collection of text and images; it also contains navigation, pricing information, links, purchase actions and behaviour that depends on external systems. When working on something such as the cart or checkout integration, I cannot treat the appearance of the button as proof that the interaction still works. The relevant checks have to include what happens after the button is clicked, how the interface responds when the cart changes and whether the surrounding page continues behaving correctly.
These problems have made me think more carefully about the footprint of a change. Before reviewing an update, I want to know which components are shared, which pages depend on them and which interactions might be affected. That does not mean every update requires a full audit of the entire website, but it does mean the testing scope should be based on what the change can influence rather than only where the change was made.
Responsive testing became part of the implementation process
Responsive design is one of the areas where assumptions can become expensive. A page may look completely reasonable on a desktop monitor while a tablet layout introduces awkward spacing, text wrapping or navigation behaviour that was not apparent at the larger width. Mobile layouts create another set of constraints because the same content has to work in considerably less space, often with different interaction methods.
I have spent a fair amount of time working through those differences on HK Lab Studio, particularly around blog cards, store layouts, navigation and content that changes length depending on the product or article being displayed. The work has reinforced why responsive testing needs to happen throughout development rather than being left as a final check before publication. When an adjustment affects width, spacing, typography or component behaviour, it makes more sense to review the relevant breakpoints immediately than to discover a collection of related problems at the end.
There is also a difference between a layout fitting inside a viewport and actually working properly at that size. A page can have no horizontal overflow and still present an awkward reading experience. A card can remain within its container but become significantly taller than neighbouring cards. Navigation can technically remain visible while its interactive targets become too small or difficult to use. Those details matter because responsive quality is not only about preventing elements from extending beyond the screen; it is about preserving the hierarchy and usability of the design as the available space changes.
That is why I tend to test the behaviour of components rather than simply checking that a desktop design has been scaled down. For a blog card, I am interested in how the title, excerpt and image behave when the width changes. For a product page, the relationship between the product information and the purchase action matters. For navigation, I want to know whether the controls remain understandable and usable on touch devices. The exact checks change with the component, but the underlying principle remains consistent: responsive behaviour needs to be evaluated against the purpose of the interface, not merely its dimensions.
Comparing against a known working version changed the review process
One limitation of manually inspecting website updates is that visual memory is not particularly reliable. After spending time adjusting a layout, it becomes easy to concentrate on the specific improvement and overlook a smaller change elsewhere. Even when I remember roughly how the previous version looked, that is not the same as having a dependable reference for comparison.
This becomes especially noticeable when reviewing multiple pages or screen sizes. A spacing difference that is obvious when two screenshots are placed together may be difficult to recognise when the previous version was last viewed several hours earlier. Changes to fonts, image crops, card alignment or container widths can be subtle enough to escape an ordinary visual inspection, particularly when the main element being tested appears to be working correctly.
That led me toward using baseline comparisons as part of the testing process. Instead of relying entirely on what I remember, I want a record of the known working version and a comparable capture of the version being prepared for release. When the same page is captured under consistent conditions, the differences become easier to identify and investigate. This is where browser automation becomes useful because the browser can revisit the same routes, use defined viewport sizes and collect screenshots without requiring every comparison to be assembled manually.
Playwright became a practical part of that approach because it can exercise real browser interactions as well as capture what the page renders. I can check whether an element appears, whether a navigation action reaches the correct destination and whether a particular part of the interface changes after an interaction. Those checks are useful alongside visual comparisons because a page can look correct while an important behaviour is broken, and the reverse can also happen when a functional page contains an unintended visual regression.
I do not regard screenshots as a complete substitute for browser testing, though. They show what was rendered at a particular moment, not everything that happened to produce it. A purchase action, consent control or interactive component still needs behavioural verification when the workflow matters. The more reliable approach is to use visual evidence and functional checks together, with each one covering problems the other may not detect.
Not every visual difference is a defect
Once I started thinking in terms of baseline and candidate comparisons, another problem became apparent: detecting a difference is not the same as identifying a regression. Websites contain content and behaviour that can legitimately change between captures, and a comparison process that treats every changed pixel as a failure quickly becomes difficult to use.
An updated article title, a new product image or an intentional layout adjustment should not automatically be classified as something broken. Even when the underlying design has not changed, differences in font rendering, image loading, animations and other dynamic behaviour can affect screenshot comparisons. If those sources of variation are not controlled, the results can contain enough noise to distract from the problems that actually need attention.
For that reason, I think the comparison environment matters almost as much as the comparison itself. Viewport dimensions, browser configuration, loading conditions and the state of interactive elements should be consistent wherever possible. Animations may need to be disabled or settled before a capture, and content that is expected to change may need separate handling. Without that preparation, the testing process risks measuring differences in the environment rather than meaningful differences in the website.
The review stage also needs room for judgement. If I deliberately change the spacing of a component, the resulting visual difference is expected, but I still want to confirm that the change has not caused an unrelated problem nearby. If a product card suddenly loses part of its content or an interactive element disappears, that deserves attention even if the rest of the page looks unchanged. The useful distinction is between an observed difference and a classified issue, because it is the classification that tells me whether something should block a release.
This is one of the reasons I prefer testing workflows that allow findings to be reviewed rather than reducing everything to a single automatic pass or fail result. Automation can make differences easier to discover, but deciding whether those differences are acceptable still benefits from understanding the design and the reason for the update.
Release evidence became more useful than another checklist
As the website developed, I found that testing also needed to produce information I could return to later. A checklist can remind me which pages and interactions require attention, but it does not necessarily preserve what I saw or explain why I considered a change acceptable. When several updates are being made across the same site, that distinction becomes important because the results of one review may need to be understood during another.
I wanted the testing process to retain the relationship between the baseline, the candidate and the differences identified during the comparison. If a visual issue appeared, there should be enough information to locate the affected page, understand the viewport where it occurred and review the evidence. If the difference was intentional, that decision should be distinguishable from an unresolved defect. The objective was to make the outcome of testing useful for the release decision rather than simply generate another report that nobody would consult afterwards.
Those requirements eventually shaped HK Web Release Regression Studio. The product grew around the idea of comparing a known baseline against a release candidate, inspecting visual and behavioural differences and organising the findings into a more useful review workflow. Instead of treating the comparison as an isolated screenshot exercise, I wanted the process to support the broader decisions involved in preparing a website update: what changed, what needs investigation, what has been accepted and whether the candidate is ready to move forward.
This also connects to the way I already approach quality assurance across other software projects. I am interested in repeatable checks because they reduce the amount of work that depends on memory, but I am equally interested in keeping evidence behind the results. A successful test is more useful when I can see what was checked, and a failed test becomes easier to investigate when the surrounding information has been preserved.
The development of the regression-testing workflow was therefore less about replacing manual review and more about making that review consistent. Browser automation can collect information and highlight differences far more efficiently than I can by repeatedly opening pages myself, but the final assessment still has to consider the purpose of the interface and whether the update behaves as intended.
The release decision needs to account for what did not change
The more time I spend maintaining a live website, the more I think a successful update should be judged by two things: whether the intended improvement works and whether the existing experience remains dependable. The second part is easy to underestimate because it concerns elements that were not supposed to change in the first place.
A new feature can work perfectly while a shared component breaks somewhere else. A layout adjustment can solve one responsive issue while creating another at a different width. A CMS update can display correctly on the article being edited while introducing inconsistencies into other cards or templates. These are not unusual problems in web development, but they become much easier to manage when the review process is designed to look for them rather than assuming unchanged areas are safe.
I do not expect every release to require the same testing depth. A small text correction and a change to shared navigation carry different levels of risk, and the checks should reflect that difference. What matters is having a repeatable way to decide which pages, viewports and interactions need attention, while retaining enough evidence to understand the result before publishing.
That is the direction I have been moving toward with HK Lab Studio and the testing tools developed around it. The objective is not to make website maintenance unnecessarily formal or slow. It is to avoid the situation where a change is considered finished simply because the edited page looks correct, only for an unrelated issue to become visible after the update reaches the live site.
DEVELOPMENT DECISION
Treat website updates as changes to a connected system rather than isolated pages. Review the affected components, test relevant responsive layouts and interactions, and compare the release candidate against a known working baseline wherever the risk justifies it. Use automation to collect consistent evidence, but distinguish intentional visual changes from actual regressions before making the release decision.
WHAT I TOOK FROM THIS STAGE
Maintaining HK Lab Studio has reinforced how much of web-development quality depends on the work carried out after an implementation appears complete. A responsive layout, reusable component or CMS template can behave correctly in the immediate development context while exposing problems elsewhere once different content, screen sizes or user interactions are involved. Testing those relationships has become an important part of how I evaluate changes rather than something I leave until the last few minutes before publishing. Developing Web Release Regression Studio gave that process a more repeatable structure. Comparing baseline and candidate builds, reviewing differences and retaining evidence makes it easier to understand the effect of a website update without relying entirely on visual memory or informal checks. I still consider human review essential, particularly when deciding whether a difference is intentional, but the surrounding workflow can make that judgement much more informed. The principle I have taken from this work is that a website update should improve the intended part of the experience without quietly damaging something that was already working. Being able to demonstrate both sides of that result is what makes a release decision more dependable.
