山椒は小粒でもピリリと辛い

2013/06/11

[Dart] Unittest と drone.io #dartlangjp

DartでUnitTestのお話 Dartでテストはどう書くの?というお話と
drone.ioというCIサーバーの導入のお話です。

sample project

code,project解説

http://www.dartlang.org/articles/dart-unit-tests/
 で解説されているUnitTestをhttps://drone.io/で実行するところまで
持って行きたいと思います。

DartでのunitTestは、pubにライブラリがあり、 http://api.dartlang.org/docs/releases/latest/unittest.htmlを使用します。

ディレクトリ構成

Dartのライブラリを見ていると以下の構成がデファクトスタンダードに近いようです。
  • package
  • mylib
  • test
    • quicksort_test.dart
    • run_all.dart
    • run.sh

今回用意したプロジェクトのファイルを以下に解説。
quicksortを実装したdartファイルのテストを行います。

■ quicksort_test.dart
実際のテスト内容を記述してあります。
test()にて、テスト名と、実行するfunctionを記載。
library quicksort_test;

import 'dart:io';
import 'package:unittest/unittest.dart';
import '../quicksort.dart';

main(){
  test('QuickSort', () =>
  expect(quickSort([5, 4, 3, 2, 1]),
  orderedEquals([1, 2, 3, 4, 5]))
 );
}
■ run_all.dart
すべてのテストを実行するためにGroupにまとめています。
addGroup()を用いて、test用のdartファイルを記述。
library test.run_all;

import 'dart:io' show Options;
import 'package:unittest/compact_vm_config.dart';
import 'package:unittest/unittest.dart';
import 'quicksort_test.dart' as quicksort_test;

main() {
  var args = new Options().arguments;
  var pattern = new RegExp(args.length > 0 ? args[0] : '.');
  useCompactVMConfiguration();

  void addGroup(testFile, testMain) {
    if (pattern.hasMatch(testFile)) {
      group(testFile.replaceAll('_test.dart', ':'), testMain);
    }
  }

  addGroup('quicksort_test.dart', quicksort_test.main);
}
■ run.sh
dartanalizerとunittestを実行するためのシェルスクリプトを記述します。
drone.ioはこのスクリプトを実行することでテストを行います。
#!/bin/bash

echo Analyzing library for warnings or type errors

dartanalyzer --package-root packages --fatal-warnings --fatal-type-errors *.dart || \
  echo "ignore analyzer errors"

dart --enable-type-checks --enable-asserts test/run_all.dart $@

drone.ioの準備

https://drone.io/のアカウントを取得し、projectを作成します。
Github,bitbucket,google codeのいずれかのcodeを取得します。今回はgithubを利用。
■ テストするプロジェクトを選択。
スクリーンショット 13 06 11 13 53
■ こんな感じでCommandsを記述
他のプロジェクトを真似したはずなのですが[sh test/run.sh]と記述しないと
permission deniedによりエラーが… why?
スクリーンショット 13 06 11 13 54 drone.io
pub install
dartanalyzer --version

sh test/run.sh

Build nowボタンで実行!

■ Build now!!!testが失敗していますね。
スクリーンショット 13 06 11 13 59

■ githubに修正版をpush!!! うまくいきましたね
githubに変更があった場合、drone.ioはすみやかにテストを実行してくれます。 スクリーンショット 13 06 11 14 05 ↓こんな感じのバッジも表示できます。Dartのプロジェクトではよく見ますね。
駆け足でしたが、実行可能なprojectもアップしてありますのでご参照いただけば
とおもいます。 このエントリーをはてなブックマークに追加