您没有等待的物联网(第3部分)。建立模拟模型

正如我在上一部分中已经说过的那样,在开发IoT项目时,与设备交互的协议非常不稳定,并且在更新固件后失去与测试设备联系的机会非常大。有几个团队参与了开发,并且有一个严格的要求-即使丢失设备的闪存会破坏使用传感器的整个流程,也不要失去测试应用程序业务层的能力。

图片

为了使业务分析人员能够在某种程度上类似于现实的数据上测试其假设,我们构建了该设备的仿真模型。因此,如果设备由于新固件而出现故障,并且需要紧急接收数据,我们将启动仿真模型,而不是网络上的真实设备,根据旧格式,该模型将驱动数据并产生结果。

此外,该模型的优势在于,企业永远不会仅仅为了检验假设就购买大量设备。例如,业务分析团队决定预测容器填充时间应该以不同的方式工作。为了检验他们的假设,没有人会购买10,000个传感器。

开发仿真模型


仿真模型本身如下:

图片

垃圾桶状态和行为由常规状态机描述。首先,我们使用状态EMPTY(level = 0)初始化状态机,然后可以对其执行一些操作,即,将垃圾放入容器中。现在您需要确定容器是否为空((level?MAX_LEVEL))还是已满(level> = MAX_LEVEL)`。如果是第二个,则状态变为“ FULL”。

有人可以从满满的容器中卸下垃圾,或者看门人来清理他的烂摊子,我们需要确定要切换到哪种状态。 CHOICE状态负责选择一个动作-在状态机的术语中,类似于if块。

另一个容器可能燃烧,然后状态机状态更改为“ FIRE”。另外,容器可能会掉落,其状态会变为“下降”(在报告中,我谈到了容器掉落可能导致的意外原因)。但是还有另一个“丢失”状态,该状态对其他任何状态都有效-当连接断开时会设置该状态。

这种状态机几乎描述了容器及其上的传感器的所有行为。但是,这还不足以建立仿真模型,因为我们知道了可能的状态和状态转变,但是我们不知道这些事件的发生概率以及何时发生。

实际上,事实证明,发生事件的概率取决于一天中的时间,因为:

  • 承运人在夜间不工作;
  • 人们在某些时间(上班前的早晨和晚上)会扔更多的垃圾。

因此,我们使业务分析团队可以自定义模拟行为。可以设置一天中某个时间发生事件的概率。

简单直观的压力测试


模仿本身具有许多优点,其中之一就是便宜的负载测试。它很便宜,因为模仿实际上是一个单独的线程,用于启动状态机,将状态机应用于状态机,并将事件本身发送到真实服务器。

因此,后端的仿真与真实传感器没有什么不同。如果我们需要运行1000个传感器,请运行1000个线程并开始工作。此外,模拟可完美缩放。

图片

一方面,测试负载是很不礼貌的,但另一方面,仿真使整个项目中逼近大量数据成为现实。而且不要忘了有天赋的中国开发人员,他们忽略了MQTT之类的标准协议,并在套接字之上看到了他们的协议。因此,我们必须自己实现服务器的实现,该服务器根据此专有协议接受套接字上的数据。

这样的服务器必须是多线程的,因为有很多输入传感器。并且这部分还需要使用性能测试进行单独测试。您可以选择JMeter(编写典型的测试脚本),JMH / JCStress(测试隔离的零件并制定更薄的基准)或您自己的其他东西。当您在类似情况下做出决定时,建议您听取专业人士的意见,例如Alexei Shipilev。在JPoint 2017上,他非常冷静地谈到了如何对不同的事物进行基准测试以及进行性能测试时需要考虑的问题。


我们选择了自己做某事的选项,因为该项目采用了非典型的质量检查方法-我们没有单独的测试人员团队,而后端团队本身对功能进行了测试。也就是说,编写套接字服务器的人必须用普通的单元,集成和性能测试来覆盖代码。

我们有一个小工具,可以快速描述负载情况并在适当数量的并行线程中运行它:

StressTestRunner.test()
                .mode(ExecutionMode.EXECUTOR_MODE)
                .threads(THREADS_COUNT)
                .iterations(MESSAGES_COUNT)
                .timeout(5, TimeUnit.SECONDS)
                .run(() -> sensor.send(MESSAGE));

Awaitility.await()
          .atMost(5, TimeUnit.SECONDS)
          .untilAsserted(() ->
            verifyReceived(MESSAGES_COUNT)
          );

我们说您需要运行多少个线程,要发送多少消息,需要多长时间以及将数据发送到每个线程中的套接字。剩下的只是等待我们的服务器正确处理所有这些数据。仅发布了几行代码,任何后端开发人员都可以编写这些代码。

网络问题仿真


在模仿的帮助下,我们能够模拟质量较差的插槽和特定的工作。传感器中的GSM SIM卡没有“白色” IP地址,我们一天可以接收来自不同IP的数据50次。经常会发生这样的情况:打开连接,我们开始传输数据,然后更改IP地址,然后服务器打开新连接而不关闭旧连接。如果不考虑这一点,那么几天之内我们将耗尽服务器上的可用端口。

图片

不同的速度传感器也存在问题。速度较慢的设备可能会打开一个连接并冻结一段时间,而速度较快的设备会发送一些消息。所有这些都需要正确处理。在模仿中,使用暂停很容易模拟类似的情况。

图片

这只是可以纳入模型的部分方案。

发现


在我看来,正是将模拟与IoT区别于其他项目的可能性恰好。模拟设备行为比人类行为容易。在输入时,我们获得与模型很好相关的确定性值,而不是随机的人为行为。因为从逻辑上说,设备的行为比人的行为更容易描述,所以测试系统也变得更加容易。

我们研究了物联网开发中的许多不同方面。

图片

如果您跳过了本文的前两部分,则可以在这里找到它们:

没有等待的IoT(第1部分)-
没有等待IoT 的主题领域和问题(第2部分)-特定事物的应用程序体系结构和IoT测试

Github有问题的测试工具。

. , Heisenbug , IoT. , ! JPoint, . Heisenbug JPoint 6 . !

All Articles