IT Testing & Quality Assurance

For most of its history, software testing has been organised as an act of subtraction: build the system, then remove the defects before release. That framing persists in job titles, in project plans, and in the mental model of many engineering leaders, and it is the single largest reason organisations remain surprised by production incidents they had every opportunity to prevent. Quality is not something inspected into a product at the end of a delivery pipeline. It is a property of the system and of the process that produces it, present or absent from the first design decision onward. A test that runs the day before release can only confirm what is already true; it cannot make an untestable architecture testable, nor a poorly understood requirement correct.

This article treats testing and quality assurance as an engineering discipline rather than a gate. It sets out the first principles that make a test strategy coherent, the reasoning behind the test pyramid and why its shape matters, the movement toward shift-left and continuous testing, the design decisions that determine whether automation pays for itself or quietly bankrupts a team, and the uncomfortable truth about what code coverage does and does not tell you. The aim is to describe how the field actually works when it works, and where it fails when it fails.

What Nashua offers hereEngagements that make quality a property of the system rather than a scramble at the end.See the engagements

Quality is a property, not a phase

The reason this topic matters now, more than it did a decade ago, is that the cost structure of software has inverted. Release cadence has moved from quarterly to daily or hourly for many organisations, dependencies have multiplied, and systems are increasingly composed rather than written, assembled from services, libraries, and third-party platforms whose behaviour no single team fully controls. In that environment, a testing model that concentrates verification into a distinct phase at the end simply cannot keep pace. There is no longer a comfortable window in which a separate quality team catches everything before a scheduled release, because there is no scheduled release in the old sense.

When we say quality is a property of the system, we mean something precise. A system has quality to the degree that its actual behaviour matches its intended behaviour across the conditions it will encounter, and to the degree that this correspondence can be demonstrated cheaply and repeatedly. Both halves matter. A system that happens to behave correctly but cannot be shown to do so without heroic manual effort is not a high-quality system in engineering terms; it is a fragile one whose correctness is unverifiable and therefore untrustworthy at the next change.

This reframing has a practical consequence that leaders often resist. If quality is a property, then it is designed and built, not added. The decisions that most determine testability are made long before any test is written: how components are bounded, how state is managed, how side effects are isolated, whether behaviour is exposed through stable interfaces or entangled with presentation. A team that treats testing as someone else's later problem forecloses those options and then discovers, too late, that the system resists verification at every turn. The current state of the field is best understood as a slow, uneven migration away from the phase model toward treating quality as an intrinsic and continuous concern of the whole delivery organisation.

First principles and the shape of the pyramid

A test strategy is not a list of tests. It is a set of deliberate decisions about where to spend verification effort, at what granularity, and against which risks. The starting point is to distinguish the questions different tests answer. A unit test answers whether a small piece of logic behaves as its author intended in isolation. An integration test answers whether components agree on the contracts between them. An end-to-end test answers whether a complete user journey works across the assembled system. These are not interchangeable; each catches a class of defect the others structurally cannot, and each carries a different cost in execution time, maintenance burden, and diagnostic clarity when it fails.

The test pyramid is the classic expression of how to balance them, and its logic is economic rather than aesthetic. Tests near the base are numerous, fast, and precise: when a unit test fails it usually points directly at the offending line. Tests near the top are few, slow, and broad: when an end-to-end test fails it tells you something is wrong somewhere in a long chain, which is valuable but expensive to diagnose. A healthy strategy therefore pushes verification down to the cheapest level that can genuinely answer the question. You do not drive a full browser journey to check a date-formatting rule that a unit test could pin down in milliseconds.

The pyramid inverts in practice more often than teams admit, becoming an ice cream cone: a thin base of unit tests, a bulging layer of slow end-to-end tests, and a fringe of manual checking on top. That shape is a signal of trouble. It usually means the underlying code was hard to test in isolation, so the team compensated by testing everything through the outermost interface, where every check is slow, flaky, and coupled to incidental details. The pyramid's real message is not a fixed ratio to memorise but a principle: prefer the smallest, fastest test that meaningfully reduces risk, and treat a heavy top as evidence of a design problem to fix rather than a testing style to accept.

Exploratory & Manualhuman judgement, few in number, finds the unscriptedEnd-to-Endslow, broad, reserved for critical journeysIntegrationcontracts and agreements between componentsUnitfast, numerous, precise, the foundation
The test pyramid distributes verification effort across levels, with fast and numerous checks forming the foundation.

Where the field is moving

The most consequential shift in modern practice is captured by the term shift-left, which means moving verification earlier in the flow of work, toward the moment a change is conceived rather than the moment it is shipped. In its shallow form this is just running more tests in the pipeline. In its serious form it reaches further left still: clarifying acceptance criteria before a line is written, expressing those criteria as executable checks, and reviewing designs for testability as a first-class concern. The economic argument is well established. A defect caught while a requirement is still a sentence costs almost nothing to fix; the same defect discovered in production costs orders of magnitude more, and sometimes costs trust that money cannot restore.

Continuous testing extends this into the delivery pipeline itself, so that every change triggers an automated verification suite whose result gates progression. The discipline here is not merely having tests but having a suite fast and trustworthy enough that developers actually wait for it and believe it. A pipeline that takes an hour and fails randomly a fifth of the time is worse than no pipeline, because it trains people to ignore red. Alongside this, contract testing has matured as a way to verify agreements between services without standing up the entire system, letting each side confirm it honours a shared interface. It is one of the more genuinely useful ideas of the past decade for organisations built on many small services.

Two further currents deserve honest treatment. Risk-based testing has moved from folklore to method: rather than pursuing uniform coverage, teams deliberately concentrate effort where the product of likelihood and impact is highest, and consciously accept thinner verification where the stakes are low. Exploratory testing, meanwhile, has been reclaimed as a skilled discipline rather than aimless clicking. A capable exploratory tester forms hypotheses about how a system might fail and probes them systematically, finding the defects that scripted tests, which only check what someone already thought to check, will never reveal. The recent arrival of generative tools that draft test cases and data is real and useful, but it amplifies these judgements rather than replacing them; a machine can propose a thousand checks, and only human reasoning decides which thousand were worth running.

Designing systems you can actually test

Automation that pays for itself is not a matter of writing more tests; it is a matter of designing systems and suites so that the ongoing cost of tests stays below the cost of the defects they prevent. This is where architecture and quality meet. Testability is a design property, and the same characteristics that make code testable, clear boundaries, explicit dependencies, isolated side effects, deterministic behaviour, tend to make it maintainable for every other reason too. When testing is painful, the pain is usually diagnostic: it is telling you the design has hidden coupling or ambiguous responsibility, and the fix belongs in the code, not in ever more elaborate test scaffolding.

The economics turn on two quantities that teams rarely measure: the cost of writing and maintaining a test over its life, and the value of the failures it catches. A fast, focused unit test that guards genuinely error-prone logic has an excellent return. A brittle end-to-end test that breaks whenever a button moves, requires constant tending, and mostly re-checks logic already covered below has a negative one, and quietly consuming engineering time is the way most automation efforts die. The discipline is to write tests that are sensitive to behaviour and insensitive to structure, so they fail when the system does the wrong thing and stay silent when it does the right thing a different way.

Which brings us to coverage, the most misunderstood number in the field. Code coverage measures which lines or branches were executed while the tests ran. That is all it measures. High coverage tells you the tests touched the code; it says nothing about whether they asserted anything meaningful about what happened, whether the cases they exercised are the ones that matter, or whether the oracle deciding pass and fail is correct. It is entirely possible to reach ninety percent coverage with tests that would pass even if the logic were broken, because they execute the code without checking the result. Coverage is useful as a floor and as a way to find code no test has ever run, which is worth knowing. It is dangerous as a target, because once it becomes a goal people optimise the metric rather than the risk, writing shallow tests that raise the number without raising the confidence. Coverage tells you where you have not looked; it never tells you that what you looked at is right.

How testing goes wrong

Failures in testing tend to recur across organisations in recognisable forms, and naming them helps teams see their own situation clearly.

The inverted pyramid. A thin base of unit tests and a heavy reliance on slow end-to-end checks, usually a symptom of code that was never designed to be tested in isolation. The suite becomes slow and unreliable, developers stop trusting it, and verification quietly reverts to manual effort under deadline pressure.

Flaky tests. Tests that pass and fail without any change in the code, most often because of timing assumptions, shared state, or hidden dependence on the environment. Flakiness is corrosive out of all proportion to its apparent size, because a suite that cries wolf teaches everyone to ignore red, and a single ignored failure is how real defects reach production through a green pipeline.

Coverage as theatre. Treating a coverage percentage as the definition of quality, which produces tests written to execute lines rather than to catch defects. The number rises, the confidence does not, and the organisation is worse off for believing otherwise.

Testing after the fact. Verification bolted on once the design is frozen, when the cheap opportunities to prevent defects have already passed. What remains is expensive detection of problems that earlier clarity would have prevented entirely.

The quality silo. Delegating all responsibility for quality to a separate team positioned at the end of the flow. This severs the people who create defects from the feedback that would help them stop, slows everything to the throughput of the bottleneck, and turns quality into a negotiation rather than a shared standard. In each of these failure modes the remedy is rarely more tests. It is better-placed tests, honest metrics, earlier involvement, and a design that does not resist verification.

How Nashua approaches testing and quality assurance

Nashua approaches quality as an engineering property of the whole delivery system, not as an inspection step to be inserted before release. Our work with clients begins with a clear-eyed assessment of where verification effort currently sits, what risks it actually addresses, and where the gaps between intended and demonstrated behaviour lie. We look at the shape of the existing test suite, the speed and reliability of the pipeline, the points at which quality decisions are made, and the organisational structures that either connect developers to feedback or insulate them from it. The output is not a generic maturity score but a specific picture of where the current approach is spending effort well and where it is spending it against the wrong risks.

From there we work alongside client teams to build a test strategy grounded in risk rather than ritual. That means pushing verification down to the cheapest level that can answer each question, restoring a healthy pyramid where it has inverted, and being deliberate about the small number of end-to-end journeys that genuinely warrant slow, broad checks. We treat testability as a design concern, so our involvement reaches into architecture and interface decisions rather than stopping at the test suite. We help teams adopt shift-left practices in their serious form, clarifying acceptance criteria before implementation and expressing them as executable checks, and we build continuous testing pipelines that are fast and trustworthy enough that people actually rely on them.

Crucially, we treat automation as an investment to be justified rather than a goal in itself. We help teams distinguish the tests worth maintaining for a decade from the ones quietly draining engineering time, and we are candid about metrics: coverage as a diagnostic floor, never as a target, and risk reduction as the real measure of a suite's worth. Exploratory and manual testing keep their place as skilled disciplines for the questions automation cannot pose. The result is a quality practice owned by the whole team, embedded in how software is designed and delivered, rather than a phase that stands between finished work and its users.

Where Nashua makes the difference

The difference Nashua brings is not a larger test suite but a sounder judgement about where quality comes from. Many organisations can write tests; far fewer can tell which tests are earning their keep, which risks are being left uncovered while effort piles up elsewhere, and which architectural decisions are quietly making the whole system harder to verify. That judgement, built from long practice across many enterprise systems, is what turns testing from a cost centre into a source of durable confidence, and it is what we bring to bear from the first design conversation rather than the last review before release.

There is also a practical corollary that changes what the work is permitted to assume. When an engagement calls for a capability that does not yet exist, it need not wait on a procurement cycle or a vendor's roadmap. The Nashua 360 Enterprise Platform is built to accommodate almost any feature at pace, through extreme vibe coding: what is needed is described in plain language and generated quickly, but always within firm architecture principles and under stringent quality assurance, so that speed never comes at the cost of coherence, security or control. The effect is strategic rather than merely convenient. It moves the make-or-buy line, keeps optionality cheap, and lets the architecture follow the strategy rather than the strategy bending to whatever happened to be on a shelf.

What ties it together is a refusal to treat quality as separable from the system that has it. We embed verification into design, delivery, and operation so that the correspondence between intended and actual behaviour can be demonstrated cheaply and continuously, and so that the organisation is no longer surprised by failures it had every means to prevent. For enterprises whose software has grown faster than their ability to trust it, that shift, from inspecting quality in at the end to building it in from the start, is where the real and lasting difference is made.