Akka TestKit测试包的使用

Akka TestKit测试包的使用

TestKit,测试类必须继承几个接口:

class SendingActor01Test extends TestKit(ActorSystem("testsystem")) //TestKit创建testsystem用于测试
  with WordSpecLike //可以用must,in等语句描述测试方法
  with MustMatchers //must描述assertion,比如"hello" must (contain("hello"))
  with StopSystemAfterAll { //保证所有测试结束后关闭system
"A Silent Actor" must { //测试的文本规范
 "change state when it receives a message, single threaded" in { //每个in内是具体的测试内容
 //Write the test, first fail
 fail("not implemented yet")
 }
 "change state when it receives a message, multi-threaded" in {
 //Write the test, first fail
 fail("not implemented yet")
 }
 }
}

这些接口帮我们实现初始化actor testsystem,testActor,测试结束清理.



测试环境分为:

  • 单线程
  • 多线程
  • 多JVM

单线程

这个环境下,我们一般是简单的测试,使用TestActorRef允许我们直接访问silentActor内部

    //单线程环境
    "A Silent Actor" must {
      "change internal state when it receives a message, single" in {
        import SilentActorProtocol._
        //actor是不能直接访问的,所以使用TestActorRef允许我们直接访问silentActor内部
        val silentActor = TestActorRef[SilentActor]
        silentActor ! SilentMessage("whisper")
        //直接调用silentActor的内部状态,也可以直接调用内部方法
        silentActor.underlyingActor.state must (contain("whisper"))
      }
    }

TestActorRef和LocalActorRef,使用只做测试用的CallingThreadDispatcher作为调度器,CallingThreadDispatcher不会在新线程中调用actor

多线程环境

由于不能直接访问actor,我们只能通过testActor获取actor的message,比如:

    //多线程下测试,不能直接访问actor内部,所以通过testActor做消息的中转
    "A Silent Actor" must {
      "change internal state when it receives a message, multi" in {
        import SilentActorProtocol._
        val silentActor = system.actorOf(Props[SilentActor], "s3")
        silentActor ! SilentMessage("whisper1")
        silentActor ! SilentMessage("whisper2")
        //silentActor将处理结果发送给testActor
        silentActor ! GetState(testActor)
        //expectMsg方法获取testActor收到的message
        expectMsg(Vector("whisper1", "whisper2"))
      }

expectMsg,expectMsgPF方法接受来自test actor的消息。所以当要测试一个actor相应的message,可以将消息发送给testActor,testActor转发到我们的测试方法。

多JVM环境

discuss on chapter 5



我们归类一下actor,有如下三种:

1. SilentActor

不返回,不发送message。我们要测试它是否接受到了message,知否改变了内部状态,是否抛出异常。
对于单线程环境,我们用TestActorRef就可以。多线程环境我们还是要用testActor。

2. SendingActor

会发送message给其他的actor,一般我们测试将其作为黑盒.使用testActor接受消息,并使用expectMsg或者expectMsgPF从testActor获取从被测试actor收到的message。

3.SideEffectingActor

接受一个message,并与一些object交互。当我们发送message给它时,要检测object是变动


TestProbe

TestKit提供了testActor,我们使用:

  • expectMsg
  • expectNoMsg
  • ignoreMsg
  • expectMsgPF

等方法来获取testActor接受的message.如果我们要接受发送给多个actor的message,我们就要用TestProbe了,直接调用TestProbe()即可

总结

大多数情况下,使用testActor测试是最方便的。

时间: 2024-08-31 12:39:16

Akka TestKit测试包的使用的相关文章

用Jython构建JUnit测试包

JUnit 测试框架被越来越多的开发小组所共同使用.归功于各种各样的测试装具模块,现在可以测试构成任何 Java 应用程序的几乎每一个组件.事实上,几乎整个二级市场似乎都是用围绕 Junit 建立的.包括 Cactus.jfcUnit.XMLUnit.DbUnit 和 HttpUnit 这样的装具模块都可以免费供开发人员用于测试应用程序.随着系统的复杂程度的增加,并且有这么多工具可供使用,没有什么理由不依靠单元测试. 不过,开发人员不仅仅是程序员.我们与用户交互以修复 bug 并确定需求.我们参

Java测试包Mockito

Java测试包Mockito 记录一些基本功能,Mockito主要是用于为测试提供Mock. 生成Mock,代替目标对象 List<String> list = mock(List.class); 目标对象方法的返回结果 我们要让mock对象的方法,按照我们的想法返回结果.使用when().then()语法定义. when(list.get(anyInt())).then(new Answer<String>(){ @Override public String answer(In

[流媒体]实例解析MMS流媒体协议,下载LiveMediaVideo[1][修正版,增加了带宽测试包]

[流媒体]按照MMS协议和MS Media Server交互 下载实时交通录像的包分析   编写者 日期 关键词 郑昀@ultrapower 2005-10-17 mms streaming protocol ethereal 协议分析 流媒体          通过mms://220.194.63.17/cebeijing8,我们可以看到交通部门设置在北京西直门上的摄像头的实时录像,从而了解西直门的交通状况.        但是,要是想下载这个流媒体到本地的话,我试验了asfr+.ASF Re

python自动化测试之连接几组测试包实例_python

本文实例讲述了python自动化测试之连接几组测试包的方法,分享给大家供大家参考.具体方法如下: 具体代码如下: class RomanNumeralConverter(object): def __init__(self): self.digit_map = {"M":1000, "D":500, "C":100, "L":50, "X":10, "V":5, "I"

Android版微信5.0测试包放出

摘要: 今天iOS版微信5.0 抢先发布 ,霎时间掀起全民"打飞机"的热潮.无奈的是Android用户只能眼巴巴看着iOS用户打飞机,自己无飞机可打.今晚微信团队也发布了Android版微信5.0测试版( 点 今天iOS版微信5.0抢先发布,霎时间掀起全民"打飞机"的热潮.无奈的是Android用户只能眼巴巴看着iOS用户打飞机,自己无飞机可打.今晚微信团队也发布了Android版微信5.0测试版(点击下载).不过仅有上次申请过内测的用户才有权限使用,没有申请内测的

Akka笔记之日志及测试

英文原文链接,译文链接,原文作者:Arun Manivannan ,译者:有孚 在前两篇笔记中(第一篇,第二篇),我们简单地介绍了一下Actor以及它的消息传递是如何工作的.在本篇中,我们将看下如何解决TeacherActor的日志打印及测试的问题. 简单回顾 前面我们的Actor是这样的: class TeacherActor extends Actor { val quotes = List( "Moderation is for cowards", "Anything

《Android 应用测试指南》——第2章,第2.4节包浏览器

2.4 包浏览器创建完前面提到的两个项目之后,我们打开包浏览器(Package explorer),就会看到像图2.3一样的界面.我们注意到这里存在两个相关的项目,每个项目都有自己独立的组件和项目属性. 图2.3 项目的包浏览视图 如果你已经准备好了这些基本工作,现在开始添加一些测试用例了. 当然,现在还没什么需要测试的.不过,既然我们已经有了"测试驱动开发原则"的知识基础,那么,我们就先添加虚拟测试用例,提前熟悉下相关技术吧. 测试用例最好添加在MyFirstProjectTest中

SimpliFiber多功能光缆测试工具

概述 验证多模和单模光缆 测量光功率以及损耗确保光缆网络的性能 自动感测波长功能防止测量的失误 存储100个测试结果 使用 LinkWare 电缆管理软件管理测试结果并且打印专业的测试报告 产品功能 福禄克网络的 SimpliFiber 便宜并且容易使用,同时支持多模和单模光缆的损耗测试. 紧凑的 SimpliFiber 光源和光表坚固耐用,其紧凑防滑设计,符合人性的手感使得持握更加舒适安全.集成的护盖有效地保护光缆接口.较长的电池使用时间免去了经常更换电池的烦恼. SimpliFiber 光源

光缆测试参数和测试方法

光缆布线系统安装完成之后需要对链路传输特性进行测试,其中最主要的几个 测试项目是链路的衰减特性.连接器的插入损耗.回波损耗等.下面我们就光缆 布线的关键物理参数的测量及网络中的故障排除.维护等方面进行简单的介绍. 一.光缆链路的关键物理参数 衰减: 1.衰减是光在光沿光纤传输过程中光功率的减少. 2.对光纤网络总衰减的 计算:光纤损耗(LOSS)是指光纤输出端的功率Power out与发射到光纤时的功率 Power in的比值. 3.损耗是同光纤的长度成正比的,所以总衰减不仅表明了光 纤损耗本身