我读过很多地方,明确的睡眠语句在自动化测试中是不好的做法,即使我偶尔使用它们。它们可能很烦人(在测试中造成不必要的等待),但我想不出任何例子来说明它们为什么实际上是有害的。
在自动化测试中造成伤害的睡眠语句有哪些示例?
我读过很多地方,明确的睡眠语句在自动化测试中是不好的做法,即使我偶尔使用它们。它们可能很烦人(在测试中造成不必要的等待),但我想不出任何例子来说明它们为什么实际上是有害的。
在自动化测试中造成伤害的睡眠语句有哪些示例?
硬编码的 sleep 语句通常应该表示应用程序中的某种模拟延迟,在测试期间不存在。
这样做的有害方面是硬编码值不能代表它所模拟的实际存在的复杂性。
以网络延迟为例。您的生产系统通常需要 4 秒钟才能通过网络输出,获取一些数据,然后通过网络返回结果。因此,您只需模拟数据,延迟 4 秒,然后将其返回。听起来很简单。
因为它很简单——几乎太简单了。如果您的网络上的某些内容发生了变化,那么您的测试现在是不准确的。您看不到例程在异常重或异常轻的网络负载下将如何反应。换句话说,您正在尝试测试您无法控制的内容。您正在制作可重复的东西(4 秒睡眠),但实际上是不可重复的(网络上的任何运行都不会重复两次)。
如果测试的正确性依赖于一个无效且可能经常变化的假设,那么这对测试的可靠性有何影响?
当您在 Sleep 语句中使用的时间值不适合当前的测试实例时,就会出现主要危害。
您的脚本可能会休眠 4 秒,因为这是在您创建脚本时某个重要对象出现所需的时间。然后脚本继续使用该新对象执行操作。
但是当你重新运行脚本时,不能保证这次对象会在 4 秒内出现。依赖于 4 秒后存在的对象的脚本可能会失败,或者运行异常,或者报告错误 - 所有这些都必须在以后进行分析。
您打算编写的脚本是“睡眠直到出现所需的对象”。有时“睡眠 4 秒”并不能很好地代表这种意图。
硬编码的睡眠使您的脚本对不同时间的容忍度降低,更脆弱,并且不太可能执行您想要的操作。
在软件中,有几种方法可以等待事件发生。一种方法是让事件通知您。有时这是可能的,有时则不是。另一种方法是轮询:等待一段时间,检查事件是否发生,如果没有发生,则再次执行。
轮询的一种变体是等待一段时间,然后假设事件已经发生。当然,如果你这样做,你最好等待足够长的时间。有时,显式睡眠表示等待时间的猜测。这种猜测在一种情况下可能很好,但在另一种情况下是错误的。当您移动到较慢的机器、较慢的网络连接或由于必须更努力地工作而变慢的服务器时,您的猜测可能是错误的。
我有一系列大约 50 个 Selenium 测试,运行时间不到 10 分钟。通过编写测试,我已经能够将执行时间缩短几分钟,这样sleep()
就不需要知道输出何时到达。
我发现当我sleep()
在测试中使用它时,当我没有一个好的方法来实际监控我正在测试的事物的状态时,它实际上已经完成了它正在做的事情。使用sleep()
数量来表示“你准备好了吗?你准备好了吗?” @Dmitry Zhariy 指出,在测试中添加 sleep 会导致延迟。这是不好的。您的测试应始终尽可能快地运行。如果您的项目运行出现不可避免的延迟,那就这样吧(但请尝试看看您是否能找到一种方法让这些延迟运行得更快。)