Quality and speed are both important
Every digital organization wants to release new features quickly, frequently and with high quality. Unfortunately, in traditional IT organizations, speed and quality are often mutually exclusive, and management is forced to choose one over the other. This was because traditional quality assurance processes were performed manually, so ensuring an application was bug-free required a slow, costly and inefficient quality assurance process. Skipping quality assurance resulted in faster development but a buggy and low quality product.
When approaching digital transformation, companies need to rethink their culture, organizational structure and process in order to achieve high efficiency without sacrificing in quality, reliability and predictability.
Experts in QA automation
When Grid Dynamics was founded in 2006, we had the advantage of beginning our internal QA practice with the newly-established industry best practices of full automation, cross-functional teams and DevOps culture. Since then, we have grown a team of several hundred world-class engineers that focus on providing quality assurance via automation and close collaboration with development teams.
Over the past several years, we have implemented automation, test data management and service virtualization to help both our large and small clients achieve efficient quality assurance. Through test automation, we have provided close to 100% coverage to our clients, and have reduced test execution times from weeks to hours and even minutes.
Organization and architecture
Three key prerequisites enable high quality, efficient testing:
- Microservices architecture enables applications to be built with testability in mind. Strong contracts and loose coupling of services allows them to be tested in isolation, while well-defined APIs and UI save costs on implementing and maintaining tests.
- Cross-functional teams with quality engineers embedded into development teams reduces the lag between the readiness of functionalities and the readiness of tests.
- Close collaboration between quality engineers, product owners and system analysts ensures that the delivered functionality is aligned with business expectations.
Test data management
Quality engineering and test automation requires data:
- Testing on real production data is not always possible or advisable due to efficiency, security, compliance or test coverage concerns. A production data snapshot may not represent all corner cases, but synthetic data can also miss certain corner cases that appear in production due to human error.
- Too often in the industry we see flaky tests that depend on hard-coded identifiers or uncontrolled changes in data sets, making the tests useless.
- Our approach is to test both carefully generated synthetic data sets and obfuscated production data when possible. If tests and test frameworks are properly implemented, it is possible to have the same test work on both synthetic and real data.
Most systems under tests have dependencies, typically in the form of other services:
- A number of techniques exist to isolate services from dependencies during testing, including development of mocks and stubs, and using tools for service virtualization.
- Choosing the right level of isolation during testing is a must. Depending on the service and the nature of dependencies, service virtualization may increase or decrease the efficiency and cost of testing as well as the quality of the end result.
- Our approach includes analysis of the business logic and contracts of the service under test and its dependencies to choose when to use stubs and mocks, and when to use real dependencies.
Full automation of all quality aspects
Stability and reliability testing
Production testing and advanced monitoring
Data quality testing
Integration with the continuous delivery pipeline
Our engagement model
Our approach is to embed specialized quality engineers directly into application development teams. With this approach, we build cross-functional teams which have all the necessary skills and distinct specializations within each team, as we believe that this setup provides the highest efficiency, quality and speed. In such teams, a developer and a quality engineer work on a feature together. That way, when a developer completes the feature, it is already covered by automated tests.
When we engage with clients, we start by analyzing their existing processes and technical approach. This analysis helps us write personalized, strategic and tactical improvement plans. We then embed quality engineers into development teams and begin improving the quality of products, or enhance efficiency by automating existing manual test cases. With this approach, our client teams are hands-on and learn quickly, which helps spread the right culture, skills and processes across the organization.