Unit testing frameworks: JUnit, TestNG, pytest, Jest and NUnit
This is the cheapest testing you will ever do, and the group teams most often under-fund because it produces no screenshots to show anybody.
You do not really choose here, because your language chooses for you.
JUnit is the standard for Java. Annotations to mark tests and set-up, assertions to state what you expect, and integration with Maven, Gradle and every Java IDE. It runs unit tests automatically — it is not a manual testing tool, despite what a lot of material implies.
TestNG, also Java, came out of JUnit and added things JUnit did not have at the time: flexible test grouping, dependencies between tests, data-driven runs through @DataProvider, and parallel execution configured in XML. Teams running large Java suites often prefer it for the suite configuration alone.
pytest is the Python default. Very little ceremony, fixtures that are genuinely good, and a large plugin ecosystem.
Jest covers JavaScript and TypeScript, with snapshot testing and mocking built in, and it is the default for most front-end code.
NUnit is the .NET equivalent, and xUnit is the other common choice there.
The honest advice: use whatever your language's community uses. There is no advantage in an unusual choice here, and there is a real cost, because every new developer has to learn it.
What unit tests cost you is discipline rather than money. They are free to run and they only stay valuable if they are written alongside the code. A suite written in a catch-up sprint six months later tests what the code does, not what it should do, which is a very different and much less useful thing.
Behaviour-driven development with Cucumber
Cucumber lets tests be written in near-plain English — Given a logged-in user, When they add an item, Then the basket shows one item — with code behind each line.
It is genuinely useful in one situation: when a business analyst or product owner reads and writes those scenarios. Then the test file is also the specification, and one artefact serves both, and that is real value.
It is pure overhead in the far more common situation, where developers write the plain-English lines, developers write the code behind them, and nobody outside the team ever opens the file. You have added a translation layer between the test and the code for an audience that does not exist.
So the question is not whether Cucumber is a good tool. It is whether somebody outside your engineering team will actually read the scenarios, and if nobody can be named, skip it.
Code coverage and what the number does not tell you
Coverage tools report which lines ran during your tests. That is worth having, because a file at zero per cent is a file nobody has tested.
What coverage does not tell you is whether anything was checked. A test can execute every line of a function, assert nothing at all, and still report as covered. This is why coverage targets imposed from above produce assertion-free tests within about a quarter.
Use coverage to find the gaps, not as a score. Eighty per cent with real assertions beats ninety-five per cent of code that merely ran.
API testing tools: Postman, REST Assured and SoapUI
If a team is going to add one thing, add this. API tests run in seconds rather than minutes, they do not break when a button moves, and they catch most of what a browser test catches at a fraction of the maintenance cost.
Postman is where most teams start, because it is how they already explore APIs by hand. Requests get saved into collections, assertions get added, environments hold the variables, and the collection can then run in the pipeline through its command-line runner. That last step is the one people skip, and skipping it is what leaves the tests on one developer's laptop.
REST Assured is a Java library for API tests written as code. It belongs in the same repository as the service, runs with your unit tests, and gets reviewed like any other code. For a Java team that already runs JUnit, this is usually the better long-term answer.
SoapUI still matters where SOAP does, which in enterprise integration work is more often than people expect.
The choice is less about the tools and more about where you want the tests to live. Postman collections are quicker to build and easier for non-developers to contribute to. Code-based tests are harder to start and far easier to maintain at scale, because they live with the code and follow the same review and versioning.
One rule either way: API tests belong in version control, not in a shared cloud workspace that only two people can edit. The moment they leave the repository, they stop being part of the build.
What this layer costs you is test data. An API test that creates an order needs a customer that exists and a product in stock. Somebody has to decide whether tests create their own data, use a seeded set, or clean up after themselves, and that decision is where API testing gets hard rather than the tooling.