While agile methodologies brought many advantages for adding value to stakeholders when developing software, they also brought many challenges in the way we think about quality and how to deal with many non-functional requirements. It is sadly common to see in the industry how products are driven by the SCRUM methodology offer early functional value, but with a growing backlog of defects, an increasing technical debt, and a system with a poor performance that becomes hard to maintain and support. This is not how it should be. Agile promotes speed, but delivering fast does not mean delivering incomplete. There are many ways to ensure that quality is a first-class attribute of your process, and in this article, we aim to give you some tips on how to make this happen.
Test from the beginning
From a functional quality standpoint, one of the principles of agile methodologies claims that you should test from the beginning. And this is really important. The earlier you find a problem, the cheaper is to solve it. There are many ways to test your wireframes or mockups with users (some tips can be found here). You can even test your business ideas or features without developing them. This should be the earliest point of feedback for any particular project. It gives you confidence for the moment you actually start coding.
When it comes to product development, your QA analysts should work together with developers and business analysts to understand the needs, and should start defining and creating automated scripts at the same time developers code the functionality. Of course, this requires a lot of communication, especially for API testing or white box testing, since all the structure that the developer is giving to the code influences the work of the tester. But this communication is something desirable, that improves the cohesion of your team towards a better understanding of your product.
Automate your tests wisely
Test automation is more than unit testing. It's also more than UI testing. At PSL, we have created different types of automated tests for around 15 years, and we learned that the key to a successful test automation approach is to have a comprehensive strategy among the multiple techniques we count with. Techniques such as BDD, ATDD, and API testing, UI testing, component testing, all of them come with their benefits and drawbacks, so it's important to analyze how to combine them to get the strongest quality shield you can. Years ago it was common to see applications with a good unit testing code coverage rate, but with a lot of defects. Many issues come from communication, configuration, or from a dependency with a third party software (database, browser, operating system, etc.). A comprehensive suite should not include only your Unit tests (that are important in many ways) but a set of automated tests that together reduce the risks on all these variables.
Aim for production-like environments
One of the most active movements in the DevOps world is Containerization. Tools like Docker bring a lot of portability and flexibility when deploying applications. You can easily replicate your application environment among different servers, including your development machine. Thanks to containerization you are able to follow this advice: You should always run your acceptance tests in a production-like environment. This applies for all automated acceptance tests, performance tests, security tests, and of course, all manual smoke tests. Leveraging state-of-the-art DevOps tools, a robust Continuous Integration process, and following Continuous Delivery practices is a great help. In the agile world, it is no longer an excuse to say "it was running in my machine". Through discipline and by leveraging the right tools, it is possible to ensure that your platform will run everywhere.
Extreme Programming Practices
Last but not least, Extreme Programming practices bring huge value to quality in the agile world. I would focus on 2 practices. The first one is Test Driven Development. This technique is hard to understand at the beginning, but when you master it you can't go back to not doing it. TDD allows you to write modular and maintainable code, focused only on the given acceptance criteria, and at the same time provides a very complete suite of unit tests that serves as documentation for your piece of code. Aiming to have a controlled technical debt, an application easy to evolve and refactor, TDD is one of the key elements to consider.
Continuous integration is also a very useful practice from Extreme Programming. Your CI servers should check not only that your application compiles and tests are running successfully, but also that quality attributes such as coding standards, code readability, best practices, among others, are part of the code being committed to the repository. A great book to learn more about this can be found here.
We all know that agile needs discipline and has a steep learning curve to be implemented successfully. You should not decide between delivering fast and delivering well. Through a constant effort to be better every day, and by trying and learning how to implement the best practices that you have around (not only applying them without analyzing if they really work for your context) you can get to the point when you not only have an agile approach, but a world-class agile approach, with great quality and happy customers.
Want to know more about how we can improve the quality of your software? Contact us!
About us: PSL is a world-class software vendor partner with more than 30 years of experience in the market. We specialize in outsourcing and nearshoring Agile software development, software maintenance, quality assurance and staff augmentation for Latin and North America.
My take away:
Through a constant effort to be better every day, and by trying and learning how to implement the best practices that you have around (not only applying them without analyzing if they really work for your context) you can get to the point when you not only have an agile approach, but a world-class agile approach
Thanks! You are right. As we always say, we have to leverage the best of each model or technology we know about. Rethinking the whole process is a must in order to really improve a team, a company, or even yourself as a developer.
Hey Sebastian, You have mentioned some good points in your blog and in my opinion software testing and QA is the most important factor to improve the quality of software development process.
"it was running in my machine" is classic
I think TDD is not hard to understand, it's hard to actually implement it.
Great article Sebastian!