scala的配套工具
评估一种开发语言是否能在生产中使用,除了这种语言(语法)本身之外,它的配套工具和生态环境也是必须考虑的重要因素。本文介绍一下scala的配套工具
这个图片我会在很多文章中引用,因为这是我对软件开发基本过程的理解,在考察一个开发环境时,我会考察它在过程中各个节点上的相应配套。scala本身是种编程语言,并不是某种厂商锁定的开发平台,因此需求、分析、设计等阶段并不受限于特定的工具,主要考察一下几方面
在这之前先介绍一下scala的sbaz小工具,这个工具是scala预装的命令行工具,当你把scala下载安装并配置好路径,可以在命令行执行scala的同时,这个sbaz也可用了。这个工具是用来更新和发布一些scala工具和包的,包括scala本身也可以用它来更新,它的官方说明在 http://www.scala-lang.org/node/93 ,不过我觉得记住一下3个命令就行了,因为这个工具并不是很重要,大量的scala包都不在这里发布的,但是在更新scala自身和开发环境时却很有帮助
scalacheck一般不单独使用,前两个框架都有对scalacheck的集成。那scalatest和specs2这两个框架哪个好呢?这也是stackoverflow上的一个热门问题 不过得票第一的答案是scalatest的作者bill venners回答的(⊙ˍ⊙) ,所以。。。其实还是比较中肯啦
BDD风格的单元测试是我开始学scala以后才学到的,现在已经很喜欢这种风格了,因为1、自然,2、可以当作规格说明书看(所以会叫specs2),比如可以这么写
"MemoryObject" should "return 1 memory after mark which is persisted" in {
memoryObject.mark("testHint", "testContent") should be('persisted)
}
it should "recall the content it marked" in {
memoryObject.mark("testHint", "testContent")
memoryObject.recall("testHint").get.content should be("testContent")
}
利用scala提供的强大的设计DSL的能力,两种框架都提供了非常好用的写BDD式单元测试的语法,上面的例子是scalatest的写法,也是我本人的开源项目recall中选用的,上面的代码来自MemorySpec
scalacheck则完全不同,它让你定义一个等式,然后造各种参数来测试这个等式(默认造100个),比如下面的例子
check((hint: String, content: String) => (hint.length() > 0 && content.length() > 0) ==> {
memoryObject.mark(hint, content)
memoryObject.recall(hint).get.content == content
})
这个测试的意思是在hint不为空,content不为空的前提下,只要mark了一个(hint,content),用同样的hint一定recall出同样的content,事实上当时一运行就发现hint或content为空时测试失败,才加上了hint不为空,content不为空这两个前提。。。 这个工具能有效的找到一些你没想到的漏洞,感谢haskell社区的数学家们!
scala与java有很好的交互性(好吧,其实java调scala并不容易,scala调java非常方便),原来java程序员熟悉的maven和ant一样可以用。 不过scala社区一般用自己开发的(不那么simple的)sbt--simple build tool , 这个工具。。。相当复杂,功能也强大,请务必仔细看官网的说明,好好学习。 我个人建议入门可以参考我的配置 我这个recall项目的0.1.0tag 仅有不到300行代码,功能也简单,并且配置好了scalatest, logback(log4j的升级),h2database等,可以取下来编译编译、把玩把玩。
sbt于maven一样,有compile,package,test等命令,它的强大之处有两点,1、可以sbt回车进入交互模式,输入~compile(或其他命令)监听代码改变,改变后自动执行相应的命令;2、极其有用的console模式,输入sbt console,它会加载你开发的代码和你配置文件里定义的依赖库,然后给你个交互窗口,你可以直接在这里面new加载了的对象,调用方法函数等试效果,如果有什么jar包不熟悉,可以在这里把玩把玩,这个作用只有自己去体会
另外提醒一下eclipse用户请参考IntegrationSupport使用IvyDE approach来搞定,其他的不好使
scala代码的测试可以用scalatest,它提供了FeatureSpecz做功能测试,specs2应该也有类似的东西,我没有试过,其他的测试方式我就不熟悉了,毕竟没怎么干过专业测试的活,就不多说了
没有什么特殊的,sbt publish可以发布到maven库里,所以原来怎么管理的还是怎么管理
哦了,希望这篇介绍对你进入scala的实用能有所帮助