第十章:Scala之单元测试

主要内容:

  1. ScalaCheck自动化
  2. 使用JUnit来测试Scala代码
  3. 使用依赖注入编写更好的测试
  4. Specs行为驱动开发
  5. 基于actor系统测试

截至目前为止,所展示的代码都没有单元测试——为什么我们现在要关心这个问题?围绕代码写测试,而又不提及它做了什么,是希望你更专注于Scala语言本身。现在,本章的目标是希望编写自动化的Scala单元测试,用于更好地构建高质量的软件。

编写精良1的代码,从你编程单元测试开始。通常感性认识是很难编写单元测试,但这章要改变这种心态。我将为你展示,如测试驱动开发和持续集成的练习开始,如何在你的Scala项目中编写测试。测试驱动开发(test-driven development,TDD)就是指在你编写代码之前编写测试。我知道这有点落后,但我保证,这章结束后它将更有意义。你将学习的测试,更多的是设计一个测试,正如设计你的软件一样。你的设计工具将会是代码——更特别地,测试的代码。

我将由介绍自动化测试和开发者如何在真实环境中使用来开始。有两种自动化测试:一种是你自己写的,一种是从你的代码中生成的。首先要介绍的是代码生成的测试,使用ScalaCheck工具,因为它比较容易。Sala是一个强静态类型语言,利用这点,诸如ScalaCheck这样的工具可以为你构建在类型上的函数或类生成单元测试。ScalaCheck是自动化测试的一种很好实现。但要完全信服自动化测试带来的好处,你需要手动编写它们。

Read more

第九章:Scala之并发编程

主要内容:

  1. 并发编程挑战
  2. actor编程模型
  3. actor中的错误处理
  4. 并发编程中组合Future和Promise

在本章将介绍Scala中最为激动人心的特性:actor库。可以把一个actor认为是一个对象,该对象处理一个消息(请求)并封装状态(actor间的状态是不共享的)。接收一个消息,并在相应中执行一个动作的能力,这样的对象称为一个actor。更高层面上讲,actors是你做面向对象编程(OOP)时应该实现的方式。要记得actor模型鼓励不共享状态的体系架构。在本章,我将解析为什么在任何并发编程里面,这是一个重要的性质。

Future 和 Promise以非阻塞(nonblocking)的方式提供了执行并发操作的抽象。这是一个很好的方式来创建多并发和平行计算,以此计算你的工作(job)。这和你如何组合函数很相似,但,在这里,函数被并发(concurrently)地或平行(parallel)地执行。Future可以认为是一个代理对象,你可以为一个以后会用到结果进行创建。你可以用Promise有提供的结果来完成一个Future。我们将在本章循序渐进得探索Promise 和 Future。首先,让我们先理解下我所理解的并发、并行编程。

Read more

第八章:构建可伸缩的、可扩展的组件

主要内容:

  1. 构建组件。
  2. 丰富的类型系统。
  3. 即时-多态(Ad hoc polymorphism)。
  4. 解决表述问题。

我们有一段时间没有把专注力放在Scala的类型系统(type system)上。The type system is a tractable syntactic method for proving the absence of certain program behaviors by classifying phrases according to the kinds of values they compute1.(类型系统是一个易于处理的语法方法,它通过计算得出的分类词汇,为该方法提供正确的缺省的编程处理)。

本章学习类型系统的要点是 理解其背后理论。这对学习类型系统基础很有帮助,本章不会过多在练习上关于理论内容。这里,将探索Scala提供给我们的各种各样的类型,并带有例子让我们更好理解。为什么类型系统如此重要?它提供了一下几点特性:

  • Error detection:就像编译器编译单元测试,可以探测普通类型和其它编程错误。
  • Abstractions:本章重点。你将学习类型系统是如何提供抽象给构建组件。
  • Documentation:函数或方法签名,告诉你它是做什么的。
  • Efficiency:类型系统帮助编译器生成优化的二进制码。

本章的主要目的是告诉你,Scala类型系统是如何构建重用组件的。这里的 组件(component) 是一个 涵盖性术语(umbrella term),如重用的库、类、模组、框架、web service。

构建重用的组件并不简单。通过可装配组件(assembling components)来构建软件的目标仍然是梦一般的存在,甚至不能扩展成为我们想要的。构建可重用组件的挑战是,还要它所引用的上下文环境。典型地,修改组件以适应当前的需求,最终带来的是一个组件的多个版本。这导致了维护上的问题。在本章的第一小节,你会学习使用Scala类型系统来构建简单的、可重用的组件。

Read more

第七章:连接到数据库

主要内容:

  1. SBT构建数据库。
  2. webKanban中,通过Squeryl连接数据库。
  3. 完善weKanban。

第六章,我们学习了如何使用SBT(Simple Build Tool)和Scalaz HTTP模组构建一个简单的Web应用。但这个应用在前面章节中未算竣工。原因是:构建一个函数式的Kanban应用,你的应用需要存储信息,即存储到持久化环境中。

注意 本章是第六章的延续,如果你未曾读过上一章节,一些本章节的相关部分很难跟进。

本章将完成上一个章节未完成的部分。你将学习如何检索数据并存储到关系型数据中。我将介绍一个Scala ORM(Object Relational Mapping)工具——Squeryl。并将探索如何安全地模拟数据字典。你将构建一个应用存储,以及在Kanban面板上展示该存储数据。在此过程中,你将探索Scala中如何与数据库工作。尽管本章关注于数据库方面的内容,也会介绍到Scalaz和SBT在数据库方面的使用。在构建应用之前,让我们回顾一下我们所需要实现weKanban应用的用户故事:

As a customer I want to create a new user story so that I can add stories to the ready phase.
As a developer I want to move cards (stories) from one phase to another to signal progress.

下面开始构建基于用户故事的weKanban应用。

Read more

第六章:构建函数式风格的Web应用

主要内容:

  1. 使用SBT(Simple Build Tool)工具构建项目。
  2. Scalaz HTTP 模块。
  3. 创建一个WEB应用程序weKanban。

本书的第二部分开始,将关注于Scala函数式编程的实际应用。现在早已有Web应用框架 LiftPlayframework 开构建web应用程序。但是本章介绍的是一个有趣的Scala http库——Scalaz。这个简单的库让你更加专注于函数式web应用的构建,而不用担心全栈的Web框架带来的复杂性问题。
HTTP 请求并产生一个HTTP响应。每个URL端点被映射到一个函数中,这个函数则用来处理request。因为你创建的是一个函数式风格,web应用程序的状态被显式地被指定在每个请求中。这样想的好处是,你可以将web应用程序进行组合或者使用高阶的组合。web框架的对应策略是无状态的和可变的。在本章内容中,你将学习到使用函数式编程来构建一个web应用框架。
要到达终点,首先要知道如何创建一个应用程序,如何使用。或许我们使用过了比较多的构建工具,但是比较标准的构建工具是SBT。这里将介绍如何配置和使用SBT来构建Scala Web项目。

Read more