文档章节

ScalaInAction测试——静态测试

clebeg
 clebeg
发布于 2015/10/26 20:38
字数 683
阅读 62
收藏 0

ScalaInAction测试——静态测试

前言

首先,我们需要了解如何测试发送和接受消息,包括发送然后不管的模式以及发送之后等待回复的交互式模式。
使用的是 Scala 的测试框架 [ScalaTest]http://www.scalatest.org/。这个框架被设计成可读性性很高。
使用这个工具可以生成可读性很强的测试报告。当然 Akka 也为我们提供了测试工具 akka-test,如果没有这个工具,
我们将面临相比与正常对象更加困难的测试环境。主要有下面四个原因:

  1. 无法准确把握消息到达时间,因为消息是异步发送的
  2. 并发,Actors 之间是并发多线程的,需要考虑更多的问题,如锁、障碍等
  3. 无状态 Actor是无法直接访问对象的,只能通过 ActorRef
  4. 集成测试。如果需要集成测试多个 Actor 就需要在它们直接做拦截,这也是不明确如何去实现的

下面主要从两个方面演示如何利用 akka-testkit + ScalaTest 作测试:

  1. Single threaded unit testing
  2. Multi-threaded unit testing

环境搭建

安装 jdk + sbt + scala, build.sbt 中加入如下内容:

name := "testdriven" #名字随意取,项目名称

version := "0.1-SNAPSHOT"

organization := "com.manning" #公司域名倒过来写,最后可以加入部门简称

scalaVersion := "2.11.7"

libraryDependencies ++= {
  val akkaVersion       = "2.3.12"
  Seq(
    "com.typesafe.akka"       %%  "akka-actor"   % akkaVersion, #注意两个 %% 号的用法基本类
    "com.typesafe.akka"       %%  "akka-slf4j"   % akkaVersion, #日志类
    "com.typesafe.akka"       %%  "akka-testkit" % akkaVersion   % "test", #最后一个 %指定使用范围
    "org.scalatest"           %%  "scalatest"    % "2.2.4"       % "test"
  )
}

静态测试示例1

package packagename
import org.scalatest.WordSpecLike
import org.scalatest.MustMatchers
import akka.testkit.{ TestActorRef, TestKit }
import akka.actor._

package silenttest {

class SilentActorTest extends TestKit(ActorSystem("testsystem"))
    with WordSpecLike
    with MustMatchers
    with StopSystemAfterAll {

    "A Silent Actor" must {

      "change internal state when it receives a message, single" in {
        import SilentActor._

        //  利用TestActorRef 直接生成可以访问实际 Actor 对象的 Actor
        val silentActor = TestActorRef[SilentActor]
        silentActor ! SilentMessage("whisper")
        //  静态的测试方法,直接访问actor的内部对象
        silentActor.underlyingActor.state must (contain("whisper"))
      }
      //<end id="ch02-silentactor-test02"/>
    }
  }


  object SilentActor {
    case class SilentMessage(data: String)
    case class GetState(receiver: ActorRef)
  }

  class SilentActor extends Actor {
    import SilentActor._
    var internalState = Vector[String]()

    def receive = {
      case SilentMessage(data) =>
        internalState = internalState :+ data
    }

    def state = internalState
  }
}

//通用类,目的是及时关闭所有Actor
package common {
  import akka.testkit.TestKit
  import org.scalatest.{Suite, BeforeAndAfterAll}

  trait StopSystemAfterAll extends BeforeAndAfterAll{

    //注意这种混入手法
    this: TestKit with Suite =>
    override protected def afterAll(): Unit = {
      super.afterAll()
      system.shutdown()
    }
  }
}

静态测试示例2

package silentactor03 {

  class SilentActorTest extends TestKit(ActorSystem("testsystem"))
    with WordSpecLike
    with MustMatchers
    with StopSystemAfterAll {

    "A Silent Actor" must {

      "change internal state when it receives a message, multi" in {
        import SilentActor._ 

        val silentActor = system.actorOf(Props[SilentActor], "s3")
        silentActor ! SilentMessage("whisper1")
        silentActor ! SilentMessage("whisper2")
        //通过发送消息获取内部状态
        silentActor ! GetState(testActor) 
        expectMsg(Vector("whisper1", "whisper2")) 
      }

    }

  }


  object SilentActor {
    case class SilentMessage(data: String)
    case class GetState(receiver: ActorRef) 
  }

  class SilentActor extends Actor {
    import SilentActor._
    var internalState = Vector[String]()

    def receive = {
      case SilentMessage(data) =>
        internalState = internalState :+ data
      case GetState(receiver) => receiver ! internalState 
    }
  }
}

参考文献

scala in action

© 著作权归作者所有

clebeg
粉丝 45
博文 40
码字总数 40057
作品 0
广州
程序员
私信 提问
ScalaInAction 数据预处理

ScalaInAction 数据预处理 前言 使用 Spark+Scala 进行数据预处理,最大的优势就是可以处理大数据量而且速度还会很快。 Scala 不仅拥有类似与R语言一样的语法特点,还比R语言更加灵活,可以开...

clebeg
2015/10/27
280
0
Android代码块执行顺序总结

子类、父类变量,代码块,以及构造方法的加载顺序,是我们在程序开发中时不时遇到的一个问题,也是比较容易混淆的。 基础准备: 变量: 成员变量(叫类变量、实例变量)和局部变量 方法: 成...

翻滚吧李博
2017/12/18
0
0
K8S集群使用Ingress实现网站入口动静分离实践

今年3月份在公司的内部k8s培训会上,和研发同事详细探讨了应用部署容器化部署的几个问题,问题简要如下: 1、java应用容器化部署 首先通过自动化部署工具编译出全量的war包,将war包直接编译...

ylw6006
2018/05/16
0
0
Jtest软件:Java静态分析、Java代码检查、Java单元测试和Java运行时错误监测

Jtest软件可以做到: 静态分析— 静态代码分析,数据流静态分析,与度量指标分析 自动化同行代码审查过程—准备、通知、跟踪 单元测试— JUnit 与 Cactus测试创建、执行、优化、与维护 运行时...

liuyifeng
2011/09/21
1K
0
手写promise跑promiseA+规范

问题 面试官经常会这样问promsie promise 是什么,主要用来解决什么 promise 有哪些实例方法和静态方法 promise 为什么可以进行链式调用 怎样实现promise状态的不可逆 promise是什么? Prom...

远洋于梦
09/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

使用TensorFlow的AI程序运行报错AttributeError: module 'tensorflow' has no attribute 'xxx'

使用TensorFlow的AI程序,在运行时报错AttributeError: module 'tensorflow' has no attribute 'xxx',首先检查是否是包路径不对,一般是版本变化所致。...

织梦之魂
今天
3
0
提示浏览器版本低

本文转载于:专业的前端网站➭提示浏览器版本低 网站网页在遇到浏览器低版本(尤其是IE浏览器)时,提示浏览器版本低(如IE8以及以下),建议用户升级浏览器以获得最好体验。以下是代码: 1...

前端老手
今天
6
0
CentOS 7系统增加swap

转载请注明文章出处:CentOS 7系统增加swap swap是位于磁盘上的特殊文件(或分区),属于“虚拟内存”的一部分。通俗点就是内存的备胎,内存充足的情况下,基本上没swap什么事(和设置有关)...

tlanyan
今天
6
0
基于Prometheus和Grafana的监控平台 - 环境搭建

相关概念 微服务中的监控分根据作用领域分为三大类,Logging,Tracing,Metrics。 Logging - 用于记录离散的事件。例如,应用程序的调试信息或错误信息。它是我们诊断问题的依据。比如我们说...

JAVA日知录
今天
6
0
PHP运行时全局构造体

struct _php_core_globals { zend_bool magic_quotes_gpc; // 是否对输入的GET/POST/Cookie数据使用自动字符串转义。 zend_bool magic_quotes_runtime; //是否对运行时从外部资源产生的数据使...

冻结not
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部