In software development, testing and quality assurance are the processes that ensure software meets performance and usability requirements. Testing and QA may also play a role in identifying what the requirements of software are in the first place.
Testing and QA have long factored into software development. Over the past decade, however, increases in the speed and complexity of software delivery cycles, along with higher quality expectations on the part of users, have led to major changes in the way many projects approach software testing.
This article explains how software testing and quality assurance work today. It also outlines key practices for optimizing testing and identifies the key methodologies that inform modern software testing routines.
How Do Testing and Quality Assurance Work?
There are many ways to implement testing and quality assurance within a software project. In all cases, however, the goal of modern software testing and QA is to ensure that there is a consistent, systematic process in place for assessing whether software meets quality requirements throughout the software development lifecycle.
In small projects, software tests are often performed by developers themselves. Larger projects or organizations typically have a dedicated QA team that is responsible for designing, executing, and evaluating tests.
The Role of Test Automation
Most software tests can be run manually. Engineers can review code or poke around within applications by hand to assess whether quality requirements have been met. Historically, manual testing was at the core of QA.
But that approach, of course, takes a long time and is not practical at scale. You can't really do unit or integration testing manually when you have new code being written every hour. Nor can you realistically perform acceptance and usability testing based on large numbers of users if you do it manually.
For these reasons, most software tests today are automated. Using specific testing and quality assurance frameworks, such as Selenium or Cucumber, engineers write tests that evaluate application code or functionality. The tests can be executed automatically (and, in many cases, in parallel), which makes it possible to run a high volume of tests in a short time. By extension, test automation allows teams to write and update code quickly without worrying about overlooking software quality problems.
In a world where developers often release application updates on a weekly or even daily basis, test automation has become critical for ensuring that QA processes keep pace with the broader software development lifecycle.
'Shift-Left' and 'Shift-Right' Testing
Another change that has taken place over the past decade is the adoption of what is known as shift-left and shift-right testing.
Shift-left testing promotes the execution of tests as early as possible in the software development lifecycle. The major goal of shift-left testing is to ensure that quality problems are detected early. Early detection of issues usually facilitates faster and simpler resolution because developers won't have to fix other parts of the application that have been created to depend on the problematic part. If you catch the issue when it remains limited to a small snippet of code, you can address it without a major code overhaul.
The purpose of shift-right testing, meanwhile, is to enhance the ability of teams to detect quality problems that have slipped by earlier tests. Shift-right testing does this by running tests against applications that have been deployed into production. It complements application observability and monitoring by offering another means of detecting quality issues that may impact end users.
What Are the Benefits of Testing and QA?
The obvious benefit of embracing testing and QA is that, when tests are well-designed and comprehensively executed, they significantly reduce the risk of introducing software quality problems into production environments.
Relatedly, software testing and QA enhance the ability of developers to move quickly, as many programmers are pressured to do today. Coders can build new features rapidly, while placing confidence in testing to catch issues that the programmers overlooked. This doesn't mean that testing and QA eliminate the need to follow best practices when it comes to application design and coding, but they do reduce the risks associated with oversights on the part of coders.
Testing and QA also play a role in defining what software quality should mean in the context of a given application. In particular, usability and acceptance tests are a valuable means of collecting feedback from users about what they expect in an application and which features they use most. This information can, in turn, inform which tests the development team runs and what the tests check for.
Finally, a key advantage of modern testing and QA techniques, which center on test automation, is helping developers work efficiently at scale. When teams can execute hundreds of tests automatically, they can continuously update applications without worrying that testing processes will cause delays in release schedules.
What Are the Drawbacks of Testing?
The only major potential drawback of software testing and quality assurance is that, when poorly planned and implemented, it could waste time and resources without providing meaningful insight about software quality.
There are three specific risks to think about:
- Poor test design: If you don't test the right things, your tests consume development resources without delivering much value. This is why it's critical to define software quality requirements before writing tests.
- Slow test execution: Tests that take a long time to run may delay the deployment of application updates into production. Test automation greatly reduces this risk. So does running tests in parallel (which means running multiple tests at once).
- Poor test coverage: Tests that only assess application quality under certain configurations or conditions may not accurately evaluate what end users will experience. For this reason, tests should be run under a variety of settings. For instance, if you are testing a software-as-a-service (SaaS) application that users access through a web browser, it's important to test how the application behaves within different browser types, browser versions, and operating systems.
These aren't drawbacks of testing per se, but they are problems that arise when teams fail to plan and implement their testing routines properly. Unless you make major mistakes in this regard, there is no reason not to have a software testing and quality assurance strategy in place. Indeed, failure to test software systematically at all, as opposed to the way that teams approach testing, is where the real risk lies.
Examples of Quality Assurance Tests
There are a variety of types of quality assurance tests that teams typically perform. Following are tests that are a part of most QA routines (although many projects may run additional tests beyond those described below).
Unit tests are run on small bodies of code. They are typically performed soon after new code is written and before it is integrated into a broader codebase. Unit tests usually focus on detecting code quality issues that may cause code to fail to compile, or that could lead to application performance or reliability problems.
Integration tests evaluate whether new code has been successfully integrated into a larger codebase. They check for problems like conflicts between new code and existing code.
Functional tests assess the ability of new application features to meet basic business requirements. They usually focus on evaluating whether key features are present, although they don't usually do more than that. Functional tests typically take place immediately after a new application release candidate has been compiled.
Acceptance tests, which also take place after a new application has been compiled, validate that features integrate properly with each other to ensure proper end-to-end functionality of an application.
Usability tests evaluate how well application features meet user expectations. They often involve automatically collecting and evaluating data about how test users interact with application functionality, but usability tests could also entail manual evaluation of the experiences of individual users. Usability tests are usually one of the last tests performed prior to application release.
Performance and load testing
Developers or IT operations engineers may run performance or load tests either before or after deploying applications into a production environment. The purpose of these tests is to evaluate how quickly applications respond, especially under different levels of user demand. Performance and load tests are useful for ensuring that software continues to meet usability goals throughout its lifecycle.
No matter which type of application a team develops or how large and complex the application is, testing and quality assurance play a key role in ensuring that the application does what it needs to do. There are many types of tests you can run, and multiple test automation frameworks are available to help execute the tests quickly. But no matter which approach you take, the key is to ensure that you have a consistent, systematic testing routine in place in order to minimize the risk of deploying bad software to your users.