Testing 什么被认为是;“最佳做法”;在阿克卡测试语义种族条件?

Testing 什么被认为是;“最佳做法”;在阿克卡测试语义种族条件?,testing,concurrency,akka,actor,race-condition,Testing,Concurrency,Akka,Actor,Race Condition,考虑以下参与者: class Stateful(worker: ActorRef) extends Actor { val queue = // immutable queue with details def receive = { case NewJob(details) => worker ! details case JobRejection(details) if sender == worker => // enqueue

考虑以下参与者:

class Stateful(worker: ActorRef) extends Actor {
   val queue = // immutable queue with details
   def receive = {
      case NewJob(details) => worker ! details
      case JobRejection(details) if sender == worker => // enqueue
      case JobRequest if sender == worker => // dequeue and send to worker
   }
}
这个简单的参与者将所有作业转发给其底层工作人员。如果工作人员太忙,他会拒绝该作业,该作业会在以后排队等待。在某个时间点,工作人员完成并从队列中请求另一个作业,依此类推

为了测试这个参与者,我传递了一个假的worker,它拒绝第一个作业,这样我就可以测试它是否真的在队列中(有一条关于这个的
GetJobs
消息,队列是不可变的,所以不用担心)。作业被拒绝后,我
scheduleOnce
延迟
100毫秒的
发送
作业请求

现在,我从测试套件中发送作业,使用
scheduleOnce
技术稍等片刻,然后发送GetJobs消息。如果我幸运的话,这份工作还在排队。我重复这个过程,这次队列应该再次为空。有时的确如此


有没有更好的方法来控制时间?因为基本上有三个延迟,我必须手动调整。而且在添加了另外两个这样的测试之后,也无法保证这种调整会在不同的机器上工作,甚至在我的机器上工作。

不要使用假工人,而是使用一个新的机器。然后,您可以在探测器上使用标准的TestKit方法,并让探测器将消息发送回
Stateful
actor

请参阅参考手册中的