無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

Scala+SpecsでMavenなJavaプロジェクトのテストを書く

Specsは、Scalaで使えるBDDなテスティングフレームワークです。JUnit4アダプタが提供されており、Mavenに組み込んで使うことが可能!ということで、MavenJavaプロジェクトのテストをScala+Specsで書く手順をまとめてみます。
といっても基本的には、

  1. pom.xmlScalaでのビルドの設定やspecsへの依存設定を書く。
  2. Specsのテストを書く。
  3. 「mvn test」!

するだけ。依存モジュールなどはMavenが集めてきてくれます。

なお、SpecsについてはQuickStartぐらいしか読んでないので、変なこと書いてたらゴメンナサイ。

MavenJavaプロジェクト

以下のような簡単な構成のJavaプロジェクトを例として説明します。

<プロジェクトルート>
 ├pom.xml
 └src
  └main
   └java
    └com
     └example
      └Kitten.java

src配下の「com.example.Kitten」がテスト対象のクラスです。実装は次の通り。普通のJavaBeanです。

package com.example;

public class Kitten {

    private String name = "";
    private int age = 0;

    public Kitten (){}
    public Kitten ( String name, int age ) {
        this.name = name;
        this.age = age;
    }

    public String getName () {
        return name;
    }
    public void setName ( String name ) {
        this.name = name;
    }
    public int getAge () {
        return age;
    }
    public void setAge ( int age ) {
        this.age = age;
    }
}

1.pom.xmlScalaでのビルドの設定などを書く

Mavenのpom.xmlSpecsを使うために必要な設定を追加していきます。ポイントは次の2つ。

  • maven-scala-pluginを使ってScalaソースコードコンパイルする設定を追加する。
    • 設定の詳細についてはこちらを参照。
    • テストをScalaで書くので、「executions/execution」に「testCompile」を追加すること
      • これにより「src/test/scala」以下のソースが「test」でコンパイルされるようになります。
    • Scalaのバージョンはとりあえず最新に。
      • Specsのサイトにも「tested with Scala 2.7.1-final」としか書かれてないしね。
  • プロジェクトの依存モジュールとして「Specs」と「scala-library」を追加する。

最終的には、こんな感じのpom.xmlになります。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>test</groupId>
  <artifactId>specs-test</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>specs-test</name>
  <build>
    <!-- scalaプラグインを追加 -->
    <plugins>
      <plugin>
        <groupId>org.scala-tools</groupId>
        <artifactId>maven-scala-plugin</artifactId>
        <executions>
          <!-- mvn compile で実行されるようにgoalを追加する。 -->
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>testCompile</goal>
            </goals>
          </execution>
        </executions>
        <!-- scalaのバージョンは最新に。-->
        <configuration>
          <scalaVersion>2.7.1</scalaVersion>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <!-- プラグインの取得先リポジトリの設定 -->
  <repositories>
    <repository>
      <id>scala-tools.org</id>
      <name>Scala-tools Maven2 Repository</name>
      <url>http://scala-tools.org/repo-releases</url>
    </repository>
  </repositories>
  <pluginRepositories>
    <pluginRepository>
      <id>scala-tools.org</id>
      <name>Scala-tools Maven2 Repository</name>
      <url>http://scala-tools.org/repo-releases</url>
    </pluginRepository>
  </pluginRepositories>
  <dependencies>
    <!-- 依存モジュールとして、scala-libraryとspecsを追加 -->
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-library</artifactId>
      <version>2.7.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.specs</groupId>
      <artifactId>specs</artifactId>
      <version>1.3.0</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

2.Specsのテストを書く

Specsのテストを書いて、「src/test/scala」に配置します。

<プロジェクトルート>
 ├pom.xml
 └src
  ├main
  │└java
  │ └com
  │  └example
  │   └Kitten.java
  └test
   └scala ←ここに配置
    └com
     └example
      └KittenSpec.scala

「KittenSpec.scala」の中身は以下のとおり。MavenからはJUnit4のテストケースとして実行するため(→Run your specifications with JUnit4 and Maven)、アダプタ?も定義しておきます。

import org.specs._
import org.specs.runner.JUnit4

import com.example.Kitten

/**
 * Kitten の Specification。
 */
object KittenSpec extends Specification {
  
  "kitten( 'mii', 2 )" should {
      "getNameは'mii'を返す" in {
        new Kitten( "mii", 2 ).getName must be("mii")
      }
      "getAgeは2を返す" in {
        new Kitten( "mii", 2 ).getAge must be(2)
      }
  }
  
}
// JUnit4で実行するためのアダプタも定義しておく。
class KittenTest extends JUnit4(KittenSpec)

3.テストの実行

あとは

$ mvn test

で、JavaソースコードScalaのテストがコンパイルされ、実行されます。また実行結果のレポートが「target/surefire-reports」配下に作成されます。