什么被认为是测试akka中语义竞争条件的“最佳实践”?

时间:2013-03-31 17:44:35

标签: 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
      case JobRequest if sender == worker => // dequeue and send to worker
   }
}

这个简单的演员将所有作业转发给其底层工作者。如果工人太忙,他就会拒绝这份工作,这项工作将在以后入队。在某些时候,工作人员已完成并从队列中请求另一个工作,依此类推。

为了测试这个actor,我正在传递一个拒绝第一个作业的假工作者,所以我可以测试它是否实际上在队列中(这里有一条GetJobs消息,队列是不可变的所以不用担心)。在我的工作被拒绝后scheduleOnce发送JobRequest delay 100 millis

现在我从我的测试套件发送作业,稍等一下使用scheduleOnce技术并发送GetJobs消息。如果我很幸运,这份工作就在队列中。我重复这个过程,这次队列应该再次为空。有时它是。

有更好的方法来控制时间吗?因为基本上有三个延迟,我手动调整。并且没有任何保证,在添加另外几个这样的测试之后,这种调整将在不同的机器上工作,甚至在我的机器上工作。

1 个答案:

答案 0 :(得分:1)

使用TestProbe而不是假工作者。然后,您可以在探针上使用标准的TestKit方法,并让探针将消息发送回Stateful actor。

请参阅参考手册中的section on using Probes