2014年8月26日火曜日

iutest v1.10.0 をリリースしました

iutest v1.10.0 をリリースしました。
変更点は以下の通りです。

  • 追加
    • --verbose コマンドラインオプションを追加
    • --iutest_default_package_name コマンドラインオプションを追加
    • operatoer == のないオブジェクトの IUTEST_*_EQ 対応
    • operatoer != のないオブジェクトの IUTEST_*_NE 対応
    • junit xml 出力に対応(--iutest_output=junit)
    • IUTEST_FLAG(ostream_formatter) を追加
    • tuple 要素を取得する GetParam tempalate 関数を追加
    • ARM対応
  • 修正
    • --iutest_break_on_failure でスキップや警告でも停止していた不具合を修正
    • Visual Studio 14 CTP 3 対応
    • バグ修正

今回は追加が多めです。

コマンドラインオプション
コマンドラインオプションが2つ追加されました。
1つ目は --verbose オプションで、これを付けるとログ出力が増えます。
具体的には、テスト終了時に SKIP,DISABLED のテストリストが出力されるようになります。

2つ目は --iutest_default_package_name オプションで、これでルートパッケージ名を指定できるようになりました。
具体的には、Jenkins で集計した際に (root) と表示されていたところが変更されます。
指定なし:

--iutest_default_package_name=All:

また、これまで --iutest_output には xml しか指定できませんでしたが、junit が指定できるようになりました。

構造体の比較
struct TestObjectX
{
    int a,b,c;
};
上記のような構造体が等しいかテストする場合、これまでは以下のように書くことができませんでしたが、v1.10.0 から記述可能になりました。
IUTEST(AssertionTest, MemCmpEQ)
{
    TestObjectX x={0,1,2};
    TestObjectX y={0,1,2};
    IUTEST_ASSERT_EQ(x, y);
}

IUTEST(AssertionTest, MemCmpNE)
{
    TestObjectX x={0,1,2};
    TestObjectX y={0,1,3};
    IUTEST_ASSERT_NE(x, y);
}

比較は memcmp で行います。それ以外の方法での比較が必要な場合は、適宜 operator を定義してください。

ostream formatter
これまでアサーションが出力する数値は10進数でした。ただ、16進数で表示したこともあるだろう、ということで IUTEST_FLAG(ostream_formatter) を追加しました。
使い方は、標準ライブラリのストリームと同じように ioマニピュレーター を使った方法や、関数呼び出しでも変更できます。
::iutest::IUTEST_FLAG(ostream_formatter) << ::std::hex;
::iutest::IUTEST_FLAG(ostream_formatter) << ::std::setw(8) << ::std::setfill('0');
::iutest::IUTEST_FLAG(ostream_formatter) << ::std::setprecision(5);
この設定は全体に適用されます。もとの設定に戻すには明示的に再設定が必要ですのでご注意ください。

template 版 GetParam
パラメーターに複数の要素を持たせたい場合、パラメーターの型を tuple にすることで実現できます。
しかし、パラメーター取得関数の GetParam はパラメーターの型で返すため、各要素を取り出すには
std::get<1>(GetParam());
のようにする必要がありました。

v1.10.0 ではこの std::get と同じ働きをする template 版の GetParam 関数を用意しました。
以下のように使用します。
class TupleGetTest : public ::iutest::TestWithParam< ::iutest::tuples::tuple<bool, int> >
{
};

IUTEST_P(TupleGetTest, Test)
{
    IUTEST_ASSERT_TRUE(GetParam<0>());
    IUTEST_ASSERT_EQ(10, GetParam<1>());
}

IUTEST_INSTANTIATE_TEST_CASE_P(A, TupleGetTest
    , ::iutest::Values( ::iutest::tuples::tuple<bool, int>(true, 10) ) );
少しだけ、記述が簡単になりましたね。

修正
修正および追加点として Visual Studio 14 CTP 3 への対応とプロジェクトを追加しました。
対応といっても大した修正はありません。
正式版は 2015年リリースらしいので楽しみです。

最後に
iutest のご意見ご要望があればこちらにお願いします。
直接 twitter とかで言っていただいても OK です。

2014年8月20日水曜日

[Jenkins] プラグインのダウングレード

今回は Jenkins のプラグインのダウングレード方法をメモっておきます。

最新のプラグインに不具合などがあった場合、安定バージョンにダウングレードで対処することが多いと思います。
だいたいの場合、1つ前(アップグレード前)のバージョンに戻すので、「プラグインの管理」の「インストール済み」タブから前回バージョンへのダウングレードボタンを押すだけで対処できると思います。

今回は、さらに前のバージョンにダウングレードする場合の方法を説明します。


※ 例として Subversion Plugin をダウングレードしました。


  1. https://updates.jenkins-ci.org/download/plugins/ から
    ダウングレードしたいプラグインの hpi ファイルをダウンロードする
  2. 「プラグインの管理」の「高度な設定」タブを開く
  3. プラグインのアップロードからダウンロードしたファイルを選択し、「アップロード」ボタンを押す
  4. アップデートセンターページに移るので正常に終了するのを待つ
  5. Jenkins を再起動する



何か不具合があった場合など、ダウングレードが必要になることもあると思うので覚えておくとよいでしょう。

2014年8月11日月曜日

[Jenkins] groovy postbuild plugin で使うスクリプトの共通化

Groovy postbuild plugin
とっても便利なので皆さん、ガシガシ使っていることと思います。

、いろんなジョブに同じようなスクリプトを書いていませんか?
スクリプトを変更したけど、別のジョブのスクリプトの変更を忘れていた、なんてことはないですか?

ということで、似たようなスクリプトは共通化してメンテナンスコストを下げましょう!

スクリプトを共通化
まずは、共通点を抜き出したスクリプトファイルを用意します。
今回は、単純に println するスクリプトを作成しました。
static test(manager)
{
  manager.listener.logger.println "test"
}
作成したファイルは「Hoge.groovy」として保存します。
ファイル分割については、こちらを参考にしました。
Groovyでのスクリプトの分割、共通化 - みちしるべ

Jenkins で使えるようにする
先ほど作成したファイルを、「${JENKINS_HOME}/userContent/groovy」に保存します。このパスは任意ですのでお好きなパスにしてください。

ジョブの設定ページを開き、「Groovy Postbuild」の「Additional groovy classpath」に先ほどのパスを記入します。

設定は以上です。

使う
使うときは、以下のように呼び出します。
Hoge.test(manager)

実行するとこのようにログ出力されます。


簡単ですね!

説明は以上です。これで、Groovy postbuild Plugin がもっと楽に使えるようになりますね^^

2014年8月4日月曜日

[Jenkins][スクリプトコンソール] 各スレーブのシステムプロパティを出力

各スレーブの任意のシステムプロパティを出力するスクリプトです。

def printSystemProperty(key)
{
  def jenkins = hudson.model.Hudson.instance
  def slaves = jenkins.slaves
  slaves.each {
    def com = it.toComputer()
    def properties = com.getSystemProperties()
    if( properties != null )
    {
        def ver = properties[key]
        if( ver != null )
        {
          println(it.getNodeName())
          println(ver)
        }
    }
  }
}

printSystemProperty("java.version")