unit-testing - Lua 中增加 os.clock()

标签 unit-testing lua sleep

摘要:我可以让时间(看起来)通过我的脚本而不需要忙等待吗?使用os.execute('sleep 1')没有削减它(而且还浪费时间)。

详情
我有a library在特定的时间间隔后确实有效。我目前通过将表注入(inject)按时间排序的列表来安排此操作。大致:

local delayedWork = {}
function handleLater( data, delaySeconds )
  local delayedItem = { data=data, execTime=os.clock() + delaySeconds }
  local i=1
  for _,existing in ipairs(delayedWork) do
    if existing.execTime > delayedItem.execTime then break else i=i+1 end
  end
  table.insert(delayedWork,i,delayedItem)
end

后来我会定期检查要做的工作。大致:

function processDelayedWork()
  local i,last = 1,#delayedWork
  while i<=last do
    local delayedItem = delayedWork[i]
    if delayedItem.execTime <= os.clock() then
      table.remove(delayedWork,i)
      -- use delayedItem.data
      last = last-1
    else
      i=i+1
    end
  end
end

(事实上,这使用 CPU 时间而不是挂机时间,这是另一个问题的问题。事实上,我在处理过程中重复移动数组而不是一次压缩过程,这是一种与此处无关的优化。)

当我运行系统的单元测试时,我需要让时间过去,最好比正常情况更快。但是,调用os.execute('sleep 1')消耗一挂钟秒,但不会导致 os.clock()增加。

$ lua -e "require 'os' print(os.clock()) os.execute('sleep 1') print(os.clock())"
0.002493
0.002799

我无法使用os.time()因为这只是整数秒(并且小于编译为使用 float 而不是 double 来表示数字的系统上的秒数):

$ lua -e "require 'os' print(os.time()) os.execute('sleep 0.4') print(os.time())"
1397704209
1397704209

我可以强制时间传递我的脚本而不只是忙着等待吗?

最佳答案

Paul 已经回答了这个问题:让 os.clock 返回您需要的任何内容。

我正在添加一个实现,让您可以根据 os.clock 控制时间流逝的速度\\\\\\\\\\\\\\\\\\\\\\\.

do
    local realclock = os.clock
    local lasttime = realclock()
    local faketime = lasttime
    local clockMultiplier = 1
    function setClockMultiplier(multiplier)
        clockMultiplier = multiplier
    end
    function adjustTime(offsetAmount)
        faketime = faketime + offsetAmount
    end
    function os.clock()
        local now = realclock()
        adjustTime((now - lasttime) * clockMultiplier)
        lasttime = now
        return faketime
    end
end

您现在可以调用 setClockMultiplier 来自由减慢或加快 os.clock 报告的时间流逝。您可以调用 adjustTime 将时钟提前或延迟任意量。

关于unit-testing - Lua 中增加 os.clock(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23124023/

相关文章:

php - 如何在 PHPUnit 中模拟 Doctrine PersistentCollection

Lua用户数据GC

lua - Lua新手——表操作

unit-testing - 在 Jenkins 中运行多个单元测试项目只记录第二组结果

unit-testing - 通过一些更改从 Const 初始化变量

Java事件循环, sleep "gently"

windows - 如何让机器在执行期间停止 sleep /hibernate

database - 延迟或等待声明

android - 使用 Retrofit 测试 MVP Android

从lua脚本调用c函数