Software testing is one of the most efficient ways to ensure delivery of high quality software at a rapid pace. It is an imperative step when onboarding new developers and increases overall confidence among all stakeholders.
If the intro wasn't convincing enough:
Tests are written throughout the entire life cycle of a project (e.g. when a new feature is being implemented, when new details of an implementation become known, or when a bug has been fixed). Having that said, we strongly prefer to write the majority of the test cases before -- or at the same time -- a feature is being designed and implemented. This approach has a couple of impactful benefits:
There are a lot of different types of tests that can be used (anything from monkey testing to exploratory testing to black box testing ). These are the types of tests we run on a regular basis:
Unit tests : Low level tests that verify individual functions, methods of classes, or modules. Example : A test that verifies that a function that converts Kelvin to Celsius is correct.
Integration tests : Tests that verify different modules or services and how they work together. Example : A test that verifies that an endpoint can validate and store data correctly in the database.
End-to-end tests : Tests that replicate user behaviour in a more complete environment. Example : A test that uploads a file to an ingestion server, awaits an email confirmation when the data has been processed, and then verifies the output.
Regression tests : Tests that are run when new features are added, bugs are fixed, dependencies are updated etc. Regression tests are typically a subset of the end-to-end, functional integration, and unit tests.
Performance tests : Tests that evaluate how the system performs under certain workloads. Example : A test that verifies that a slice of data can be retrieved in a timely fashion even when there is 2TB of data in the database.
UI/UX and accessibility tests : Tests that verify whether the user interfaces work as intended on the target platforms and that the level of usability is acceptable. We also verify that the interface is accessible to people with disabilities.
Recovery tests : Tests that verify that the system can recover from disasters such as failed disks or network errors. Example : Verify that a database can be recovered from backups.
Security tests : Tests that verify that the application is secure from internal and external threats. This includes vulnerability and security scanning, code and dependency analysis, penetration testing, authorization validation, and more. We do basic security testing in-house and work with experts for more thorough testing.