Conf42 Internet of Things (IoT) 2023 - Online

End-to-end testing strategy for IoT systems

Video size:

Abstract

IoT solutions are evolving, hence a comprehensive thought process is required to test them. There exists known testing practices and activities, but density & combination of technologies are changing. As solution, we deconstruct the system in layers & build Small automation around them.

Summary

  • Vipin Jain is a senior delivery manager and head of the QA department at Metacube Software. IoT is his second love after his job as a delivery manager. How to develop a strategy to test IoT end to end. In his talk he will give you certain suggestions from his experiences.
  • Why do we even need to end to end test IoT setups when we can test each aspect of the application? Testing become very changing as it involves many applications working in tandem. The challenges in IoT testing are different from the challenges we have faced in testing noniot applications.
  • A test plan should include a combination of unit testing, integration testing, and endtoend testing. The more complex the solutions is, the more important unit tests become. Use a blended approach for testing IoT, deconstruct the system into layers.
  • IoT testing is challenging, but it is not difficult. You have to upgrade yourself from your normal testings to IoT testing. You also have to upskill yourself from testing softwares to testing hardwares. I'm open to any kind of questions.

Transcript

This transcript was autogenerated. To make changes, submit a PR.
Hello everyone. My name is Vipin Jain and I am speaking from a beautiful city of India called as Jaipur. It is also called as the pink city of India. As already told in my introduction, I work for a company called as Metacube Software. As a senior delivery manager and head of the QA department. IoT is my second love after my job as a delivery manager. And this has been always a challenge in front of me. How to develop a strategy to test IoT end to end. Now, end to end testing, we all know where we do the system testing, the integration and unit testing. But since IoT is not just a single software or a single hardware, it is a mesh of hardware, software, lots of protocols, there are APIs, there is a huge bandwidth connection between them. So I always ponder about how to test or how to develop a strategy for embedded systems, particularly Iot. About end to end testing. So in my talk end to end testing strategy for embedded systems, I will give you certain suggestions from my experiences. So let's move forward now. First and foremost question that comes to our mind is why do we even need to end to end test IoT setups when we can test each aspect of the application? So we can test software separately, we can test hardware, protocols, firmware, everything can be tested in a separate way. So why we need to perform or develop a strategy to test the IoT application end to end? Because we do not want to be in such a situation. This is a brilliant example of evolving an end to end solutions without developing a strategy. And you can end up in such a situation. So let's begin by a very brief history. So in the very early phase, IoT was developed as a two layer architecture where you have lots of devices and then you have lots of sensors or the things. IoT is Internet of things, so lot of things which produced data, and there is a two way combination between them and the cloud and the devices. As the application started getting complex, the IoT infrastructure or the architecture also started becoming complex. And then we introduced the third layer. And hence IoT became a three layer architecture. Where there is an application layer, a transportation layer and an interception layer, the things become more complex, the infrastructure becomes more complex, and similarly the software has become more complex. And ultimately, after lots of, I would say development and lots of thinking, a new seven layered architecture was introduced. And this is the one which is currently being used. If I quickly take you to what this seven layers architecture means, these are the seven layers where the lowest level or the things which produce the data, they are the physical device layers. Then there is a connectivity layers, edge computing layer, data accumulation, data abstraction, application layer and finally the collaboration and process layer. Now all these layers were introduced because the modern day applications are very complex and lot of communication happened between layers. So then in order to develop it or in order to test it, we need to apply our logics at every layer. And this is the base of my strategy. Now, what are the challenges in IoT testing? As I've just explained, IoT is a multilayered system. Then there are lots of dissimilar technologies being used in developing these systems, changing from very low level microcontrollers and very high level server programming. The functionalities span across multiple layers. Hence the communication between two layers become very important. Then the devices follow protocols, but then different protocols can be applicable to different devices, which means the protocols can become incompatible. The functionalities were developed by different teams or the teams which are sitting geographically very apart. So hence, because those teams are not working together, sitting together, there are scenarios where the use cases, they do not match with each other. The solution looks simpler because there is a very limited UI, but below that interface there is a very, very complex architecture and code is very less to justify your testing because I can write 100 test cases and can say that look, everything is working fine, but those 100 test cases are actually just testing the code which is written, which can be only 10% of the entire architecture and not enough test cases are written to test that architecture. So these are some challenges which are different from the challenges we have faced in testing noniot applications. So what is the general practice when we start talking about e two e testing? Organizations use e two e testing at system level. They follow the most logical option available, like assemble the system fully and then test it, which gives a realistic simulation of the end user experience. But the issues that they face, as I explained earlier, also systems cannot simulate all the situations. Building such a system is very time consuming and costly. You need to gather every component, make sure all the components are connected with each other, the protocols are compatible and so on. Testing become very changing as it involves many applications working in tandem. APIs become very, very important here. The error detection happens in late cycle because everything is made, then it has been simulated and now if you can find an error then the entire setup or entire development process Iot needs to be reworked upon. This ultimately results in a lot of delay in the time to market and the responses to that application are very verified and they become very difficult to handle. I take a very simple example which is called as a blood glucose tracking system. Now what happens here is, as you can see in this diagram, there are two variables. One is the glucose sensor and the other is the insulin injector. And then there is a smartphone which acts as the middleware. So very simply put, there is a glucose sensor, like a small, I would say a patch which has a chip and that is inserted on. There's a small pin inserted inside your stomach and the patch is stuck on your stomach. And then it is constantly checking the blood sugar level. If the sugar level goes above or below a certain threshold value, it sends a message to the mobile. And from the mobile which acts as a middleware, it goes to cloud where lot of healthcare management system takes place. And as a result it sends an instruction back to the insulin pump if required, so that the pump gets activated and some insulin is secreted inside the body of the patient. So he gets immediate attention despite of where he is standing or sitting in the world. So this is the blood dugout tracking system that I want to explain. So this sensor monitor the blood for certain parameter, and the insulin injector follows a programmed schedule. But the problem is, if it is disconnected from the other components of the system, then there can be issues, right? And we'll see each issue one by one. Let's see this diagram in detail. So now you can see all the movements of the data and the instructions between various places. And let me explain each one of them. So, as I mentioned, the smartphone app serves as a middleware. And in addition to providing simple analysis to the user, the app forwards glucose level information to cloudbased healthcare system for additional processing. This cloud application compares the current measurement to the historical data of the patient and perform advanced analysis. And IoT constantly keeps looking for some unwanted patterns. If any unwanted pattern is found and IoT can lead to a potential danger, the system sends a warning directly to the user or reports to a human medical staff. Specialized medical consultant can immediately analyze the data and decides whether or not a special alert needs to be generated for the patient. The patient receives an alarm and guidance for the next steps, which can include change in the medication dosing. After the patient's approval, the change are delivered to the injector. But there can be a scenario where the patient is IoT able to respond. In that case, the medical consultants can send the GPS information packaged with the smartphone data to send an ambulance. Your mobile's automation can be tracked and immediate medical help can be sent. Right? So this is the entire blood tracking system diagram which I just explained. So this healthcare system covers everything here the phone acts as the middleware and immediate helps from the doctor to the patient. Can happen if the healthcare system alerts this and all this data gets recorded in the cloud, so that the next time something happens, it is again matched to the historical data which is already present. Let's see some wider scenarios. So what is the basic use case here? The blood sensor is simulated, the data package is selected, the data moves to the cloud, the cloud generate alerts. After comparing the current data with the existing data, the medical staff responds to the alert either by injecting the insulin or by changing the dose of the insulin, or by alerting some medical staff and ambulance nearby. The patient also receives those alert and notifications and ultimately the injection schedule and the injecting of insulin is completely automated. And all of these things still have to follow, still have to cater to these market requirements. Test early and test often speed versus quality time to market automation. We need to still perform all of these. But this is a typical IoT application. And if you see there is a cloud storage, there are data moving, there are bandwidth involved, there are devices, there is mobile, there is Internet speeds, all of these need to be tested. And then only we can say that I have what is called as an end to end testing strategy for testing blood glucose patient monitoring systems. So what is the solution, how to perform these kind of testing? Deconstruct the system into layers for more effective testing. So rather than taking the entire application as a whole, break it down into perception layer, network layer, middlewares, business layer and application layer. Your perception layer consists of the physical objects, sensors. The network layer consists of the transmissions, three g, four g. The middleware layers consist of information, process, action, the storage, whereas the business layer, it takes a look at the analytics and flowcharts to see the data. And finally, the application layer where the smart applications and their management resides. And then in each layer, isolate the components and test early. So if every layer just separate out the components. So your wireless, IoT devices, IoT smartphone, laptops, security gateways, security devices, just separate them and then test each one of them. Few are already required as tested by their vendors and few we have to test as testers. Right? So this is the two things that I want to explain. And now let's move forward. Deconstruct the system into layers, which is the first one. What are the primary challenges? Designing the system in such a way that it can be conducive to deconstruct in smaller blocks with well defined interfaces. Just like we say that in manual and automation testing automation needs to be built into the code so that when we automation engineers want to perform it, then they can do it. Similarly, the system should be designed here in such a way that it can be broken down or deconstructed into smaller blocks, and each block should have a well defined interface. And then you have to build automation around these blocks. And there is always a discussion that goes on between unit testing versus functional testing. So in general, a test plan should include a combination of unit testing, integration testing, and endtoend testing. The proportion of unit test to integration test may vary depending on the complexity of the solution. The more complex the solutions is, the more important unit tests become, because as the complexity grows, it become more and more difficult to simulate high level interfaces that ensure that various paths are executed. Unit testing, though, is expensive. We all know that, and it is expensive in terms of time and resources. Therefore, someone with a programmatic experience, for example, an engineer, must write the test, and because they are closely tied to the code, unit tests are also brittle, which means changing in a code could easily impact them. So an engineer is required consistently to maintain the tests as you move further up the stack. Function level tests are less prone to breakage, but it becomes hard to identify systematic issues when a unit test fails. On the other hand, identifying the root cause is very simpler, so you have to actually do a trade off to find a balance or create a blended approach to see a balance between unit test and functional testing. So use a blended approach for testing IoT, deconstruct the system into layers, right. So what we want to discuss here. So for IoT solutions, the first natural layer contains the wireless communication components. This is where the subsystem interacts with the APIs. Now, underneath the APIs are messaging protocols such as MQTT or HTTP, which send payloads like JSON and Rest, as well as the proprietary protocol and binary payloads. In the IoT world, the communication usually follows a publish subscribe model or a request response model. This model involves broadcasting data while other components listen for and then consume the published data and perform an action in request response model. We just send a message to the server directly and asynchronously waiting for a response. Automation is the key. What does that mean? To do this, you have to have a framework for simulating the sut system under test and verify its response, as shown here. For simple scenarios, Python or simpler steps can serve as service testing solutions. There are a number of stepping utilities that easily allow you to send payloads for testing purposes, but this tactic doesn't scale as the number of test scenarios grows from few hundred to few thousand, adding and changing the scripts become difficult and inefficient. So implementing more complex parameters is very difficult to do. With simple scripting tools. For smaller small sized things, it becomes very useful. You also can automate the server components. For example, you see this cloud healthcare system. There is this API layer. The message or the payload is sent to the services. The response comes back and then from the cloud two messages can go, one to the medical point location system and other to the medical staff consultation center. So this is a back end, right? The database contains all the historical data. The process is similar to testing the sensor. Simulate the system by sending a simulated package of data from the patient. Now the blood scan report, which comes back if it has some deviation, which means a warning needs to be produced. High priority warning involves human medical staff, low consultation. The warning message is sent back to the patient may contain information about the nearest hospital, urgent care or other medical facility. The testing framework will execute a number of test cases containing different values for different patients and expect specific warnings to be generated in the response. We can isolate the components and stress early, so let's also use a case here. Scan blood to determine glucose level we could potentially place the sensor probe in a liquid with a known level of glucose and other parameters corresponding to real blood, but this approach is neither practical nor it is scalable. A better approach would be to intercept the function call that reads from the probe and redirect it to the testware stub or mock for generating and simulating a response. It will eliminate the probe itself from the testing process while enabling the opportunity to perform automated testing of all the other parts of the system. A mock of the interaction needs to be installed to emulate a hardware function call. The stuff should be able to respond with reasonable values during the test process, using hard coded values or reading test data from an external data source. You also have to isolate the server side components, which again looks like the client side components, but there is some difference. For simple test cases, you can use a stuff that contains a node JS script to produce the standard responses. But for more advanced scenarios, a service virtualization tool can allow you to define a response depending on the input pattern. You can also use service virtualization to record actual traffic and replay it to simulate the real operations of a connected system. In some cases, you may want to switch even between a real system or a virtual asset. So a group of medical experts here are connected to this prioritized queue for consultation requests. The first person that becomes available, processes the next highest priority request to enable the automated testing, we need to replace this part of the system with a virtual equivalent. So this is how we can separate the components and then test them separately, whether they are the server side components or whether they are the client side components. So you have to remember a few things. IoT systems require thinking about the software quality in a larger scope. IoT solutions, such as our medical device examples, they are different from the normal systems because an individual feature may span multiple layers of the solution. Which means if we start testing these individual functionality, you actually have to traverse between various layers. That means the communication between any two layers becomes very important. The response request models or the published consume models are again very important because data gets published from one layer, may get consumed at some other layer. Similarly, the response sent or the request sent from one layer may receive a response from another layer. So at every layer we need to ensure that we should be able to send data or we should be able to receive data. Then delivering a high quality system, it requires testing capabilities at every layer. But the problem here is the low level layer has a lot of c code, the API testing layers, and then there is a backend part which is the very hard to access layer. So you have to develop strategy to cover all of these. You also have to consider a lot of cost which is associated with the system, because the reason is quite simple, a design failure that can outweigh the cost of deploying or testing solution. If you encounter such, ensure that you have a testing solution which enables you to isolate the test components or the API testing or the backend testing. So with this I come to the end of this talk. I hope you got some valuable information out of it. IoT testing is challenging, but it is not difficult. You have to upgrade yourself from your normal testings to IoT testing, and you also have to upskill yourself from testing softwares to testing hardwares. Firmwares have a mix of all kind of testing, and then you should be able to test Iot quite easily. Thank you. Thank you for hearing me patiently. I'm open to any kind of questions. Thank you.
...

Vipin Jain

QA Head & Project Delivery Manager @ Metacube Software

Vipin Jain's LinkedIn account Vipin Jain's twitter account



Awesome tech events for

Priority access to all content

Video hallway track

Community chat

Exclusive promotions and giveaways