您如何测试对时间敏感的软件?


9

时间敏感的意思是,例如,一个脚本每月仅运行一次,或者一个脚本连续运行,但每月仅输出一次特定的输出。显然,您可以对很多情况进行单元测试,但是有一些例外(据我所知)。

我遇到的一个最近的例子是设置一个cron作业,以便在每个月的第二天到最后一天运行。这需要使用带有cron选项卡的shell脚本来获取cron的正确月份,例如:

1 0 [shell command] * * [my script]

我通常不熟悉该脚本,也不熟悉shell脚本,因此除了等待月底来看看脚本是否正确执行之外,没有其他方法可以对其进行测试(实际上,我的解决方案是找到一个共同的合作伙伴,我对cron和shell脚本了解更多的工作人员)。

所以我很好奇是否有任何有用的解决方法来测试对时间敏感的脚本。


3
您可以在VM上运行此命令,并将系统时间设置为方便的时间,例如恰好在脚本运行前一天的午夜或类似时间。
Vitor Py

2
crontab执行常规的shell脚本,您无需等待crontab即可简单地手动执行脚本(在沙箱或vm中,如果您担心它会做什么)
crasic

2
对于您的特定情况,我的答案可能是矫kill过正:只需运行脚本。但是,更大的问题将需要诸如虚拟化和检测之类的解决方案。
Macneil

Answers:


7

除了单元测试之外,还有两种其他策略可用于设置自动测试以解决特定于操作系统的问题:

  • 虚拟化:您可以使用所需的确切配置设置多个OS映像(例如,使用VMWare),设置一种自动提取二进制文件进行测试的方法(通常是通过在VM的空间中装入特殊目录),然后执行测试。

要么:

  • 工具:手动if向程序添加特殊条件,这会使程序的行为有所不同。在Unix下,这可以通过检查是否设置了某个环境变量来完成,例如FOOBAR_TEST_TIME_WITH_T=500。然后,您的自动化测试将仅使用环境变量的不同设置以及不同的环境变量来执行所需的操作。

如果可以在库级别表示交互,则也可以链接到不同的库,可以将其视为虚拟化(如果“库”是OS内核)或一种检测技术。这两个术语都可以使用,尽管当今使用的虚拟化一词几乎总是像VMWare之类。专门用于返回固定值或重新运行特定交互的库将是模拟或存根方法。

也有自动检测工具,可以重写您的二进制文件以获得其他所需的效果,例如文件系统已满。

总体而言,您的目标是发现错误。要检查奇怪的情况(例如文件系统已满),仅手动检测程序是最简单且仍然有效的方法,很少使用虚拟化或手动计算机配置路由。


我认为您的“库虚拟化”被称为模拟,或更确切地说,是使用模拟库。
哈维尔

10

最有效-更改测试机器的日期。在需要运行时将其设置一小段时间,然后验证它何时启动并正确运行。但是,如果涉及到多台计算机,或者如果需要资源而您的公司无法控制,则这并非总是可能的。但是,请确保要进行数月的检查,并确保将年份更改两次以测试2月。


1
如果您在有限的时间内安装了具有(n个评估)许可证的软件,则修改时钟可能会触发它们阻止其执行。
Marjan Venema

在某些公司中,所有登录网络的工作站都不应偏离“服务器”时间5分钟,否则工作站将被锁定。它发生在我身上:-)
OnesimusUnbound

1

我不知道您的脚本,但是我尝试使用某种参数来设置日期。对于您的情况,如果未指定日期,则默认为月底。在代码中,使用date参数,如果今天是前两天,则运行它。您不仅可以进行测试(从现在起两天内输入日期),而且还可以在第二天运行,以防万一它在正常情况下(电源故障,服务器关闭等)无法运行。


1

自从您提到crontab以来,我假设您正在nix环境中运行。在这种情况下,我认为值得您抽出时间来检查libfaketime:http :
//www.code-wizards.com/projects/libfaketime/

通过LD_PRELOAD的魔力,我们可以加载自定义版本的库函数,只要它们与接口匹配即可。libfaketime的作用是加载时间版本的系统调用,这些调用允许您通过环境变量自定义其行为。您可以强制time()返回一个硬编码的值或与当前时间的偏移量,而不会影响框上的任何其他内容。


0

测试cron并不需要太多,因为它已经经过了许多世代的测试(“生产测试”)。当然,如果您使用的是Shell脚本,则可以在虚拟机中设置日期/时间。

解决此问题的首选方法是“模拟时钟”,使用一种或多种编程技巧来伪造时间。在shell脚本中,可以使用$ {:-}语法来使用环境变量中设置的日期,如果没有强制设置,则使用实际时间。

在其他语言中,我们使用模拟库或全天候构建抽象。

模拟时钟很好,因为您可以使它自动化,而不必手动设置测试。在以后修改脚本/代码时,这是一个很大的好处,您可以轻松判断它是否仍然有效。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.