Help us understand the problem. What is going on with this article?

AirSpecを試してみた

AirSpecは、@taroleoさんらが開発している、Scala用の新しいテスティングフレームワークです。

現在、Scala用のテスティングフレームワークとしてはScalaTest一強(Specs2は以前ほど使われなくなった)という印象があります。ScalaTestは実に様々な選択肢を用意してくれており、単純なassertだけを使ったテストから、複雑なDSLを用いたテストまでサポートしており、ScalaTestで機能上不足するものはあまりないものの、一方で、特にテストの書き心地という面から私は以前からもうちょっと良いものがあればと考えていました。

AirSpecの特徴として、

import wvlet.airspec._

class MySpec extends AirSpec

とだけ書けばテストを書き始められる簡単さと、AirSpecを継承したクラス直下にふつうのメソッドを定義すればそれがテストになるというシンプルさがあります。

また、assertするために、Scalaの普通の中置記法で value shouldBe expectedValue と書けるようになっているため、シンプルでありながらも、どちらが期待する値なのかが一目みてわかりやすいようになっています。既存のテスト用DSLは、このために複雑なマッチャを用意してたりして、同じようには書けるものの、IntelliJ IDEAで補完するときに面倒だったり、提供しているAPIがわかりにくかった点が不満だったので、この点は個人的に特に好きな点です。

説明ばかりが続いたので、コード例を晒してみます。昨日作った、LL(1)-likeな算術式パーザのテストをAirSpecで書いたものです。

package com.github.kmizu;

import com.github.kmizu.simplell1.SimpleLL1Parser
import wvlet.airspec._

class SimpleLL1ParserSpec extends AirSpec {
  def `number is parsed`(): Unit = {
    val parser = new SimpleLL1Parser("1")
    parser.expression() shouldBe 1

    parser.reset("10")
    parser.expression() shouldBe 10

    parser.reset("9999")
    parser.expression() shouldBe 9999

    parser.reset("0")
    parser.expression() shouldBe 0
  }
  //...
  def `complex expression is parsed`(): Unit = {
    val parser = new SimpleLL1Parser("1+2*3")
    parser.expression() shouldBe 7

    parser.reset(("(1+2)*3"))
    parser.expression() shouldBe 9

    parser.reset("1+2*3-1/4")
    parser.expression() shouldBe 7

    parser.reset("(1+2*3-1)/4")
    parser.expression() shouldBe 1
  }
}

AirSpecを使う上で必須ではないですが、バッククォートで囲むことで識別子として文章が書けることを利用して、テストメソッド名自体がテストの説明になるようにしています。私はテストの名前の付け方で困ることが多いので、このようにして、テストの説明をメソッド名として書き下せ、しかも、普通にそう書くだけで、そのメソッドがテストとして実行されるのは非常に気持ちが良いです。

AirSpecに関してはまだ本格的に試していないので、完成度がどの程度かまだよくわかっていません。ただ、自分の趣味プロジェクトに使うのには快適そうなので、今後はAirSpecをがんがん使っていこうかなと考えています。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away