In this post, read about unit tests, components of the testing pyramid, and how test-driven development saves time and costs.
Has your development team ever told you that they won’t write unit tests as it takes too much time? Or you found yourself in a situation where the test coverage of the code was lower because software developers wanted to make everything cheaper and faster?
Undoubtedly, the testing unit is time-consuming, and it takes more time than writing the code without unit testing.
In the rush of sprints and deadlines, unit testing is often skipped. As a result, you risk bugs in the code and defects that can negatively affect your business goals. But test-driven development can help you avoid the headache, save lots of time and money in the long run.
But first of all, let’s answer an existential question: why do we need testing?
Actually, for several reasons:
- To ensure that the product we develop meets our client’s requirements and expected outcomes.
- Check that we hadn’t broken anything in the system while introducing changes to the codebase.
When the software becomes more complex, it can be more difficult, time-consuming, and boring to identify bugs. So, to make fewer mistakes and accelerate the entire development process, we use automated testing, where both developers and QA engineers write tests.
As you’ve already guessed, unit testing is part of the automation process.
In this post, I will show how unit testing can benefit your business and share the insights gained in 5+ years of software development testing. But before it, watch our 10 minutes video.
WHAT IS UNIT TESTING?
As the name suggests, unit testing revolves around the concept of “unit,” which means a small and isolated part. Unit testing is one of the many different types of automated testing. There’s no formal definition of “unit testing” as such. Still, Wikipedia defines it as “a software testing method by which individual units of source code — sets of one or more computer program modules together with associated control data, usage procedures, and operating procedures — are tested to determine whether they are fit for use.”
In other words, unit testing is a method when the smallest part of an application is being verified independently from other parts.
Unit testing doesn’t come cheap. However, an excellent test realization will pay off in the form of detecting and fixing bugs quickly and delivering higher product quality.
By and large, what’s important to remember about unit testing, is that it takes some time but, at the same time, saves time on testing during the development process.
So when does your project require unit testing?
- You have complex features.
- Your project will scale and grow over time.
- You want to predict your project’s time to market.
- You don’t want to spend a lot of costs on fixing bugs.
The more of these points match your project, the more you need unit testing.
HOW UNIT TESTING SAVES TIME & COSTS
Given that software developers write unit tests themselves, it’s faster to create and easier to maintain them. You get a return on your investment each time developers compile their code.
Test-driven development encourages developers to create unit tests before they start writing the code. It allows you to automatically check the code for defects, thus preventing bugs instead of fixing them.
In other words, with the help of unit testing, you can find errors at the unit level earlier on, so the cost of fixing them will be much lower.
A case study that involved software engineers teams from Microsoft and IBM concluded that “teams experienced a 15–35% increase in initial development time” when they used the TDD technique. They also found a quality improvement, and in the long run, TDD saves the time that would have been required to fix problems.
Boby George and Laurie Williams, both working in the Department of Computer Science at North Carolina State University, ran an experiment where 24 programmers were split into two groups: one used TDD and the other the linear approach. As a result, “92% of developers believed that TDD yields higher quality code, 79% thought that TDD promotes simpler design and 71% thought the approach was noticeably effective”.
These statistics give a strong indication that test-driven development leads to higher quality code and simpler design.
Further in this post, we’ll describe more ways your project can benefit from unit testing.
The test pyramid was first mentioned in Mike Cohn’s book Succeeding with Agile. He recommends that applications should be covered by unit tests which is the foundation of our tests. Then we write integration tests, and the peak is made from UI tests. These are all of the type functional and automated tests.
Very simple description of three levels of testing pyramid:
- At the bottom of the pyramid is unit tests. These are the majority of tests you have for your codebase. As already mentioned, unit tests are great for testing small pieces of a codebase. However, they aren’t enough to ensure the quality of a codebase as they don’t test the app’s interactions with the outside world, and this is where integration tests come in.
- The middle tier of an automation pyramid is integration tests. These are tests designed to verify external dependency in software applications. This can be integration with a Database, with a Framework, with third-party external software systems, or even with inter-software components between different layers. Integration tests should not be run as often as unit tests.
- At the top of the pyramid is the end-to-end tests. These tests are what they sound like: check that your app is working from start to finish and ensure that the entire system functions as expected. End-to-end tests verify the frontend integration with the backend — this level of test pyramid from the end-users perspective and how they would interact with the app.
HOW TO REDUCE PROJECT EXPENSES WITH UNIT TESTS?
To show you how unit testing looks like in practice, let’s take SCRUM methodology for two reasons:
- It has iterations;
- It operates in story points.
Story points are units of measure. A number is assigned to each story to estimate the total effort involved in bringing a feature or functionality to life.
Iteration is just a fixed amount of time used by the software development team to deliver the functionality.
If you want to dig a little deeper, understand the difference between 2 approaches (with and without unit tests) and what are the benefits of unit testing — follow the link.