Conf42 DevOps 2024 - Online

Quality Assurance as a DevOps Touchstone

Video size:

Abstract

Quality assurance is a crucial pillar of DevOps. It is essential to understand its real value and ways to ensure its effectiveness. Beyond measuring coverage, let’s explore various methods to evaluate the effectiveness of testing. This discussion aims to emphasize the importance of QA and doing it correctly

Summary

  • In this session I want to talk about the importance of quality assurance in DevOps principles. DevOps is trying to bring development activities and operations together or close to each other as much as possible. As quality assurance we want to contribute to the product or the project goals.
  • The role of quality assurance is to ensure we are developing functionalities which will meet customer expectancies. Whenever we have a new release candidate, there will be some potential risks or vulnerabilities. This would be possible only with an automated quality assurance process set.
  • The products that we are testing are really complex and complicated, right? Because they are deployed in different platforms or execution environments. Our quality metrics can be categorized in two fundamental groups, the speed and the reliability, or the quality of our features. We will discuss these two categories in detail.
  • Execution of test cases is directly affecting the delivery time. Even the reliability is affecting our test execution time. Why do we have even the false alarms or the silent horror cases in our test environments or test frameworks?
  • The second aspect of the quality assurance activities is effective testing. We might have some escape bugs or escaped issues which were not found in our testing activities but just reported from the production environments. To avoid these kind of issues, embracing different test design techniques can be a good approach.
  • Lets discuss the quality assurance improvements that we can do to contribute or bring value to the product perspective. One of the first metrics set from the quality perspective is the issues or the bugs that we have. We can transform them into some visual graphs or charts and monitoring dashboards.
  • So to sum up, we tried to discuss the role or the importance of quality assurance in DevOps practices. We discussed how we can support fast delivery in terms of the execution speed. And eventually, we discussed importance of continuous monitoring to continuously get some insights about potential improvements.

Transcript

This transcript was autogenerated. To make changes, submit a PR.
Hello, my name is Misuthrukal. I'm a quality assurance automation engineer and in this session I want to talk about the importance of quality assurance in DevOps principles. We know that DevOps is trying to bring development activities and operations together or close to each other as much as possible. And quality assurance is an important touchstone in this discipline. I'm starting with a beautiful breed scene, which is not a coincidence because quality assurance is trying to find ways or channels between different parties and make the delivery or the transportation possible between these parties or the stakeholders. So what we will talk about in detail is, as we just briefly started, we will talk about the importance of the role or the place of quality assurance in DevOps. And then we will start talking about the problems or the challenges that we want to cope with, or in other words, the achievements or the targets that we want to hit and aligned with these problems or challenges or the achievements or the targets. We will talk about several metrics or dimensions of quality and I want to focus at least two fundamental categories, which are the speed and the reliability or the health of our quality assurance activities. And eventually we will talk about monitoring activities and aligned with this monitoring, how well we can fit ourselves into the product or the project goals, and how well we can fit in the bigger picture, right? Because as quality assurance we want to contribute to the product or the project goals. So how well we can align in this wider product or the project goal set and how well we can fit in the bigger picture. Starting from the role or the importance of quality assurance, let's first of all consider what we want to do from a wider perspective. We try to provide the best solution to our customers, right? But what is the definition of best solution? So this is the role of Kuala assurance. We try to ensure we are developing a set of functionalities which will meet customer expectancies. So sometimes we try to communicate directly with the end users or maybe the product owners or the product managers to understand what the users or the customers need or what they are expecting from this product. And sometimes we are trying to communicate with the development teams to understand in what ways they implemented these features or the functionalities. So this is why the communication skills are very important for quality assurance members, because we communicate with lots of different parties or stakeholders and sometimes we try to bring all of them together on the same page. And thinking from the modern project management methodologies, we know that we are trying to reduce the delivery time and increase the frequency of deliveries or the deployments. Because speed is very important. We are competing in time and in modern project management ways we try to do the continuous deliveries or the continuous integration activities. So in this perspective, quality assurance is very important because whenever we have a neat release candidate, we have to ensure the quality, not only the accuracy of the functionalities, but also lots of different quality aspects. We have to ensure, for example, performance, usability, maintainability, several abilities of quality dimensions, right? We have to check so with a proper and health quality assurance process this is possible. Otherwise there would be some risks whenever we do not perform the quality assurance activities. Whenever we have a new release candidate, there will be some potential risks or vulnerabilities and this would be possible only with a good, or maybe with an automated quality assurance process set and aligned with this perspective. Of course, in a scenario where the quality assurance teams or members are not involved in the whole development processes, we can understand that there would be some risks because all the quality goals or dimensions would not be covered. And whenever the new candidate or the features or the implementation would be merged into the production environment, there would be some risks which would be resulting in some critical consequences. In the later stages, we will discuss why this is important to find the vulnerabilities or the potential risks as early as possible in the next slides. But first of all, let's try to understand what kind of problems or challenges we have, because doing the problem definition in the first place is important. In this way we can understand in what ways we can contribute or bring value by understanding the challenges that we want to cope with. So nowadays the products that we are testing are really complex and complicated, right? Because they are deployed in different platforms or execution environments, which means they have several integrations and interfaces as well, because they are communicating to different applications as well. There is a large network of applications and we want to do our verification and validation activities in this comprehensive scope with different constraints and limitations. Because there is the time constraints, there is limited budget, limited resources, there are some different constraints as well. So thinking about all these problems and constraints and limitations, we can derive some different quality metrics to understand how well we are proceeding with our achievements or targets. And of course they should be aligned with the bigger perspective, the product metrics. So we can start with think and Dora metrics, which formulates a good set of product metrics. First of all, we can think of the speed of delivery and the quality of delivery. We want to provide a good set of functionalities which will cover the customer expectancies, but we want to do that with a good speed, ideally the continuous integration, right? As fast as possible. On the other hand, there should be a good quality. We should talk about several quality aspects, not only the accuracy of the functionalities, but also that the performance, usability and several quality aspects. So our quality metrics can be categorized in two fundamental groups, the speed and the reliability, or the quality of our features or functionalities. So we will discuss these two categories in detail. And let's start with the first one, the speed of our delivery. So there are several aspects or parameters that will affect the speed of our deliveries. First of all, the direct parameter, which is the execution of test cases, right? Because it is directly affecting our pipelines or delivery time. If the execution of the test cases are slow, which means they are taking too much time. Of course, after some time, everyone will start complaining about the test cases. They will say that whenever we have a new release candidate, of course we want to execute our test cases. But if execution is taking too much time, they will say that they are slowing down the pipelines. So execution of test cases is directly affecting the delivery time. So what we can do is we can do a time analysis and try to understand the slowly running test cases, and we can try to understand the points where it's slowing down the execution and trying to get rid of the unnecessary weights or dummy weights in our test cases. Along with that, on top of the analysis, what we can do is we can parallelize our test executions. We can divide our whole set into some subsets, and we can make our test cases independent from each other. In this way, we can enable the parallelization of test cases, and it will already decrease the total duration of our test execution. On the other hand, even the reliability is affecting our test execution time. Maybe it's not a direct parameter, but eventually how flaky our test cases will be affecting our test execution time. Because if we have some flaky tests, which means one time passing and one times failing, then eventually it means we will need some retries to retry the failing test cases to understand if they are still failing or they will start passing. So this means the retries will increase the total execution duration and it will affect the speed of our delivery. So in terms of reliability, we can discuss different conditions. For example, if our features are properly implemented, they are implemented as desired. But if our test case are failing, then it means it's a false alarm, right? Because our test case is failing. But normally the feature is implemented as expected. So this is not a real bug, this is a false alarm. So in this case, we have to retry our test case, and we have to get rid of this flaky test case, the false alarm. On the other hand, if our test case is just passing whenever there is an unexpected situation in the feature, in the implementation of the feature, it means there is a silent horror in our test cases. There is a potential risk vulnerability. But our test case is just passing, they are not capable of finding the issue. This is a silent horror case. So which means we will maybe just let the issue go in production and we will have some extra cost in the later stages. These are the reliability issues and which we don't want to have in our test execution environments or the test frameworks. But why do we have some reliable issues? Why we would have even the false alarms or the silent horror cases in our test environments or test frameworks? Because we might have several test smells, as we may have several smells in our product code. We can have different test smells in our test automation framework as well. There are several kinds of test smells, like some of them are related to test coverage, or some of them are related to different maintainability aspects of our test code. But we can get rid of all these kind of test smells to reduce the reliable issues in our test automation framework and to reduce these test smells. Of course we need some strong quality gates. Whenever we have some new test implementation, we have to check all the code quality even in our test code. And if we have some issues, then we have to stop that, and we don't want them to let go in production because otherwise there will be some critical consequences. Maybe there will be some silent horror cases, or maybe there will be some false alarms stemming from this kind of testimony. So if we have some quality gates, which can be either static code analysis or doing the code review activities, the peer review activities. But by enabling these kind of quality gates, we can already find the vulnerabilities even in the test code and stop them before merging into our test automation frameworks. So the execution speed of test cases is already affecting the delivery, but also the reliability of the test cases. Because whenever we have a failing test, we have to stop the pipeline and try to understand if the failure is a real bug or a false alarm. And even the maintainability of our test cases is affecting the delivery speed. Because whenever we have a false alarm, which means whenever we have an issue in the test itself, we have to fix the issue in our test code. And until we fix and we make the test passing again, we have to stop the pipeline. And whenever we make the test pass again, then we can continue with the delivery. So this means how easily we can fix the issue in the test or how easily we can maintain our test is a parameter that really affects the delivery speed. So how we can improve the maintainability a very well known example is the UI automation, right? Whenever the layout of the page is changing, then of course the selectors or the locators of our elements on the web page should be updated in the test code. And if we follow good coding practices or some patterns that will contribute to maintainability, then we can easily update, for example by excluding the locators from the test classes or the spec files, then we can easily do that. By following these kind of good practices or different approaches, we can try to improve the maintainability because otherwise it will be slowing down our pipelines to fix the issues in our test code. One more good practice to improve the maintainability is removing the duplication or avoiding the duplication. Because whenever we have repeated core or duplicated code in test spec files, then whenever we need an update or fix, then we have to go to all relevant piece of code and we have to fix in all of them. But if we have only one source of truth, for example a dedicated class file where the implementation is done, then we can go to the relevant part and fix the issue in only one source of truth. These kind of different approaches or good coding practices will help us to improve the maintenance. So summing up the first part in terms of the speed, of course we can improve our execution speed by enabling or embracing the parallelization or improving the reliability of test. By removing the test mass or even improving the maintainability will contribute the delivery of the speed. Now let's investigate the second aspect of the quality assurance activities, which is effective testing. How capable or how good our test cases are to find the issues in the early stages because we might have test cases running very fast or we might have 100% coverage metrics, but still we might have some escape bugs or escaped issues which were not found in our testing activities but just reported from the production environments. But what might we be missing or overlooking? What might be the reasons for having these escaped bugs? Because normally we try to cover all the test cases or all the features with test cases, but still we might have these kind of issues. So we have to go back to verification and validation distinction. Sometimes we just talk to the development teams and try to understand what is being implemented, but this is not the only thing that we have to ensure. Right on top of that, we have to understand if the implementations were already aligned with the requirements in the first place. This is the distinction between verification and validation. What is being implemented and what was supposed to be implemented. So this is aligned with the customer perspective and customer focus. So we have to understand what was expected or required by the customers and what are we delivering or providing as a solution to them. So to try to improve this mindset, we can ensure that we are running the correct scope. We have to update our test cases whenever we have a new implementation or whenever even we have a new refactoring on the code base. Then we can try to check if our test cases are up to date, or if we are running any or if we are running any coverage issues. But not only the test steps or the test context, but also the execution environment is very important because sometimes, for example, let's suppose we have a data upload feature. So this might be running with different data types or data ranges. So not only running with certain data types like integer values or string values, but also running with double values is also important. Or not only with positive values, but also negative values are also important. So supporting the test steps with the relevant test data or running in the correct or supposed potential execution environments is very important because sometimes different users are running on different browsers, with different devices, or with different operating systems. So not only running the correct test steps on a certain environment, but also running on different potential execution environments is also very important. So one more thing that we might try to follow to improve our test coverage is trying to embrace different test design techniques. There are some different techniques like equivalence partitioning or boundary value analysis, not to overlook some corner cases or boundary values or different data ranges. To avoid these kind of issues, embracing different test design techniques can be a good approach or a good test design pattern. But also there is one more thing that we can adapt in our quality assurance activities, which is the personnel based testing. By thinking of different personas or different characteristics, we can come up with different scenarios, for example, thinking of different users from different regions or different ages, or with different characteristics, with different activities or motivations or frustrations, we can think of different use cases or different scenarios. So in this case we try to avoid having or overlooking some different scenarios. For example, aligned with this, we can come up with, for example, for different people, maybe the accessibility or the performance is more important than other aspects, or for other users maybe the usability or the user friendliness of the interfaces is more important. So in this way we can try to cover all the aspects of the quality, not only the functionality, but also all the non functional aspects would be covered by thinking from different perspectives and trying to understand all kinds of or types of different use flows in our product or on our feature. Lets we try to discuss the quality assurance improvements that we can do to contribute or bring value to the product perspective. Right? We try to provide or support the deliveries from two different fundamental aspects, which is the speed and quality, because we want to have a fast and high quality delivery and we try to support it from the quality assurance perspective. But how can we ensure that we are proceeding in the correct direction? Of course we can utilize monitoring activities and we can collect several metrics to understand how well we are proceeding in these dimensions or the aspects of quality. And we can talk about several different metrics. But one of the first metrics set from the quality perspective is the issues or the bugs that we have because it will directly give an idea about how quality how level of quality we have in our products or the feature sets. So we can show different distribution of bugs across their severity levels or across the component on which they were found or the module on which the bugs were found. But apart from those, I want to highlight the importance of having the post mortems which is kind of trying to understand or trying to interpret them, trying to talk to them, because bugs have several meaningful or valuable information. Understand. And if we try to understand what they are trying to tell us, then we can collect some insights and we can try to reveal some weaknesses in our processes and the product. And we can try to introduce some new initiatives and improvements for the future activities. Because quality assurance is not only finding the bugs, this is already good enough, but also trying to avoid them in the future activities. If we try to interpret the previously created bugs, then we can try to understand what kind of weaknesses we had in our past activities. And by trying to improve them, trying to create some new initiatives, we can try to avoid them in the first place in our future activities as well. So not only the bugs of course, we can call several other metrics as well. So what we can do is we can transform them into some visual graphs or charts and monitoring dashboards. Because sometimes interpreting the raw data is not easy. But if we have some visuals then we can easily understand what is going on in our environments and what kind of trends or charts we have. And we can try to collect some insights about the health of our processes and the product and the processes and try to improve them for the future activities as well. So to sum up, we tried to discuss the role or the importance of quality assurance in DevOps practices. We discussed the problems or the challenges we have and we discussed the ways to contribute to our product goals from quality assurance perspective. For example, we discussed how we can support fast delivery in terms of the execution speed. We try to improve the test execution duration or test execution time, and we try to reduce the number of false alarms because whenever we have them we have to stop the pipelines. Or whenever we stop the pipeline, we try to fix the issues in the test code. So we discuss the importance of improving the maintainability of test code because that would directly affect the time where we stop our pipelines. On the other hand, we discussed ways to support the quality of our deliveries whenever we have some reliability issues or coverage issues. We might have some escape bugs, but we discussed ways to embrace different test design techniques, or embracing different Persona based test techniques or different approaches to improve our coverage and the reliability of test framework or test environment or test set to avoid those kind of issues. And eventually, we discussed importance of continuous monitoring to continuously get some insights about potential improvements that we can embrace in our processes and the quality of our products. So thanks a lot for listening to me and if you have any questions or feedback, I would be more than glad to try to answer them.
...

Mesut Durukal

QA Lead @ Indeed

Mesut Durukal's LinkedIn account Mesut Durukal's twitter account



Join the community!

Learn for free, join the best tech learning community for a price of a pumpkin latte.

Annual
Monthly
Newsletter
$ 0 /mo

Event notifications, weekly newsletter

Delayed access to all content

Immediate access to Keynotes & Panels

Community
$ 8.34 /mo

Immediate access to all content

Courses, quizes & certificates

Community chats

Join the community (7 day free trial)