19 Jun 2013, 10:09

Rubyで書かれた統合C言語TDD開発環境 「Ceedling」 がけっこう便利そうな件

UnityやCMockについて色々調べて来ましたが、今日はそれらを束ねるツール Ceedlingにつついて調べました。

[toc]

Ceedlingとは

Ceedlingとは、UnityとCMockを使ってテストを実行するためのテスト管理用フレームワーク。テストを助けるための便利なツールがRubyスクリプトで書かれていて、それらを利用してC言語でのTDDをウマクやるためのツール。

Ceedlingのインストール

CeedlingはRuby,Rakeが必要なので、まずはrubyとrakeをインストールしておくこと。また、Rubygemもパッケージ取得のために必要。入れておくこと。

Ceedlingのインストールは以下のコマンドで実施する。

gem install ceedling

Ceedlingプロジェクトの作成する。

ceedling new ceedling_study

Unity・CMockを利用するためのテスト環境が一気に自動生成される。かっこ良い。(・∀・)

デフォルトでいろんなモードが用意されている。これらがテストを実施するためのお助けツール。詳しくは、使い方のドキュメントを参照。

% rake -T
rake clean# Delete all build artifacts and temporary products.
rake clobber  # Delete all generated files (and build artifacts).
rake environment  # List all configured environment variables.
rake files:header # List all collected header files.
rake files:source # List all collected source files.
rake files:test   # List all collected test files.
rake logging  # Enable logging
rake module:create[module_path]   # Generate module (source, header and test files)
rake module:destroy[module_path]  # Destroy module (source, header and test files)
rake paths:source # List all collected source paths.
rake paths:support# List all collected support paths.
rake paths:test   # List all collected test paths.
rake summary  # Execute plugin result summaries (no build triggering).
rake test:*   # Run single test ([*] real test or source file name, no path).
rake test:all # Run all unit tests.
rake test:delta   # Run tests for changed files.
rake test:path[dir]   # Run tests whose test path contains [dir] or [dir] substring.
rake test:pattern[regex]  # Run tests by matching regular expression pattern.
rake verbosity[level] # Set verbose output (silent:[0] - obnoxious:[4]).
rake version  # Display build environment version info.

vendor配下にunityとcmockのディレクトリを持ってくる。

cd vendor
git clone git://github.com/ThrowTheSwitch/Unity.git
git clone git://github.com/ThrowTheSwitch/CMock.git

仕様のドキュメントは vendor/ceedling/docs配下にある。

docs/
├── CExceptionSummary.pdf
├── CMock Summary.pdf
├── CeedlingPacket.pdf
└── Unity Summary.pdf

設定ファイルは project.ymlをいじるけれども、まずはデフォルトでOk.

Unityといっしょに使ってみる

Unityのテストコートを書いてみます。

#include "unity.h"
#include "hogehoge.h"

void setUp(void)
{
}

void tearDown(void)
{
}

void test_hogehogefirst(void)
{
  TEST_IGNORE_MESSAGE("Here");
}

実行結果

[tsu-nera]% rake test:all

Test 'Testhogehoge.c'
---------------------
Generating runner for Testhogehoge.c...
Compiling Testhogehoge_runner.c...
Compiling Testhogehoge.c...
Linking Testhogehoge.out...
Running Testhogehoge.out...

-------------------------
IGNORED UNIT TEST SUMMARY
-------------------------
[Testhogehoge.c]
  Test: test_hogehogefirst
  At line (14): "Here"

-------------------------
OVERALL UNIT TEST SUMMARY
-------------------------
TESTED:  1
PASSED:  0
FAILED:  0
IGNORED: 1

ちなみに、unity fixture形式のテストの書き方だとうまく動作しなかった。ここ3週間、仕事でUnityFixture形式のテストを書きまくったので、どうやって移植しようか。。。ウマクやる方法がわかったら追記する。

CMockといっしょに使ってみる

テストファイルに、モックしたいソースのヘッダファイルを以下の形式で書くと、CeedlingはCMockを利用してモックを自動生成する。

#include "mock_xxxxx.h"

prefixのmock_はproject.ymlの以下のパラメータを変更すれば調整可能。

:cmock:
  :mock_prefix: mock_

CMockサンプル

以下のように、uhauha()の先でhogehogeをコールしている。hogehogeをモックしたい。

uhauha.c

#include "uhauha.h"
#include "hogehoge.h"

void uhauha(void)
{
  hogehoge();
}

テストコードを以下のようにかく。

Testuhauha.c

#include "unity.h"
#include "uhauha.h"
#include "mock_hogehoge.h"

void setUp(void)
{
}

void tearDown(void)
{
}

void test_uhauhafirst(void)
{
  hogehoge_ExpectAndReturn(2);
  uhauha();
}

gcovといっしょに使ってみる

gcovを利用して、gcovデータを生成する。project.ymlにgcovプラグインの記述を追加する。

:tools:のところにgcovを追加。

:plugins:
  :load_paths:
    - vendor/ceedling/plugins
  :enabled:
    - stdout_pretty_tests_report
    - module_generator
    - gcov(ここに追加)

rakeコマンドでgcovを実行。build/gcov/outに gcnoができる。

rake gcov:all

xUnit形式のxmlファイルを生成して、Jenkinsで表示する

もともと、Unityでのテスト結果をxUnit formatのXMLに変換する方法を調べていたらceedlingを見つけたので、これがやりたかったこと。project.ymlに以下を追加する。

:plugins:
  :load_paths:
    - vendor/ceedling/plugins
  :enabled:
    - stdout_pretty_tests_report
    - module_generator
    - xml_tests_report

rakeコマンドでtestを実行。/build/artifacts/testに report.xmlができる。

<?xml version='1.0' encoding='utf-8' ?>
<TestRun>
        <FailedTests/>
        <SuccessfulTests>
                <Test id="1">
                        <Name>test/Testuhauha.c::test_uhauhafirst</Name>
                </Test>
        </SuccessfulTests>
        <IgnoredTests>
                <Test id="2">
                        <Name>test/Testhogehoge.c::test_hogehogefirst</Name>
                </Test>
        </IgnoredTests>
        <Statistics>
                <Tests>2</Tests>
                <Ignores>1</Ignores>
                <FailuresTotal>0</FailuresTotal>
                <Errors>0</Errors>
                <Failures>0</Failures>
        </Statistics>
</TestRun>

このファイルをJenkinsから表示すればよい。表示するためには、xUnit Pluginを入れる。

xUnit Plugin – Jenkins – Jenkins Wiki

xUnit Pluginには、Unity用の選択肢がない。CppUnitと形式が似ているため、xml生成用のRubyスクリプトに手を入れる。

まず、CppUnitには、Ignoreという概念がないので、L38,L100のIgnore関連の記述をコメントアウト。

L38.

=begin
    write_tests( results[:ignores], stream, 'IgnoredTests' )
=end

L100.

=begin
    stream.puts "\t\t<Ignores>#{counts[:ignored]}</Ignores>"
=end

L68行目にもバグがあるので、修正。

      stream.puts "\t\t</FailedTest>"
      # stream.puts "\t\t</Test>"

Ceedling / Discussion / Ceedling Forum:XML report

これで、Jenkinsでも結果が表示されたた。

13 Oct 2012, 01:37

Eclipse CDTで gcovの結果を見てみる

gcovの出力結果をEclipseでみる方法を調べてみた。

Eclipse 3.7(Indigo)までは CDT gcov pluginが動いたけど、Eclipse4.2 (Juno)からは、動かない・・・。しかし、代わりに、Eclipse Juno では GCov pluginが動作した。

というわけで、2つの方法を紹介する。

その1CDT gcov plugin

インストール

以下のサイトからダウンロード。

http://sourceforge.jp/projects/ginkgo/

ダウンロードファイルを解凍すると featuresとpluginというファイルがある。

それぞれeclipse.exeと同じフォルダにあるfeaturesとpluginにコピーする。(org.ginko.gcov.feature_0.2.2とorg.ginkgo.gcov_0.2.2.jar)

あとは、- cleanオプションをつけてEclipse再起動。

CDT gcov pluginの設定

[プロジェクトエクスプローラ]からカバレッジを出したいプロジェクトを右クリックしてオプションを選択。

C Coverageという項目があるので、Activate natureを有効にする。

image

gcovを実行して、出力用データを作成する

Eclipseで表示するには、.gcovという形式のファイルをつくる必要がある。
以下の3ステップで作成する。

ビルドして hogehoge.gcnoを作成

ビルドして.gcnoファイルを作成する。
ビルドするときに、以下のオプションをつける。

-fprofile-arcs -ftest-coverage

MakefileだとCFLAGSに追加すればよい。

CFLAGS += -fprofile-arcs -ftest-coverage

実行ファイルを実行して、hogehoge.gcdaを作成

実行ファイル(.exe)を実行すると、*.gcdaができる。
自分の場合はGoogleTestでテストコードを書いて、テストを実行することで、カバレッジを得る。

gcovコマンドを実行して、hogehoge.c.gcovを作成

Eclipseでカバレッジを得るには、もう一工夫必要。
実行してできた、hogehoge.gcdaに対し、以下のコマンドを実行するとhogehoge.c.gcovというファイルができる。

gcov hogehoge.gcda

 

その2 GCov plugin を使う

以下からダウンロード。
http://wiki.eclipse.org/Linux_Tools_Project/GCov/User_Guide

ちなみに、Pleades日本語プロジェクトからEclipse 4.2 CDTを落としてきたら、Defaultでついていた。
http://mergedoc.sourceforge.jp/index.html#/pleiades.html

hogehoge.gcdaを作る

つくりからは上に同じ。
作成したら、プロジェクトビューから、作成したhogehoge.gcdaを開く。
実行バイナリファイルに含まれるすべてのカバレッジデータを出力するか、ファイル単位で出力するかを選択する。

image

ファイル単位で開いてみると、カラー表示されたカバレッジ出力結果が表示される。

image

実行バイナリファイル単位で表示すると、gcovビューにカバレッジの集計が見える。
(開くまで時間がかかる)

image

(GCovユーザガイド)http://wiki.eclipse.org/Linux_Tools_Project/GCov/User_Guide#Installation_and_Set-Up

06 Oct 2012, 07:08

gcovrをWindowsバッチコマンドから実行したらimort siteエラーでハマる

Cygwin環境で、gcovrをWindowsのコマンドプロンプトで実行しようとすると、以下のエラーが出た。 gcovrとは、gcovの結果をCoverture形式のXML出力結果に変換するPythonスクリプトだ。

‘import site’ failed : use 窶砺 for trackback

Pythonを使ったことがないからよくわからないが、調べてみると環境変数にパスが正しく設定されていないと、これが表示されるらしい。

回避方法は以下のサイトによると、

import PYTHONHOME=/usr

を打ち込めばいいらしい。

参考 _ Python ‘import site’ failed; use -v for traceback

これがWindowsのコマンドプロンプトからだと、

set PYTHONHOME=/usr

で回避できた。

環境変数の設定からなんとかしようといろいろ試したけれど、よくわからなかった。
とりあえず、gcovrを実行する前におまじないを叩いてから実行するという、若干ダメな回避方法で凌ぐ。

正しい方法がわかったら、またメモしよう。

22 Sep 2012, 22:20

C言語でのgcovカバレッジ計測結果をJenkinsで表示させる

C言語でのカバレッジ計測結果をJenkinsで表示させる方法について調べてみた。

2つの方法があるみたい。

  1. lcov + HTML Publisher plugin で出力

    Hudsonの使い方21 Hudsonでユニットテスト網羅率測定(C言語)

  2. gcovr + Coberturaプラグイン で

    Jenkinsでテストとカバレッジの結果をグラフ表示できるようにする

    Jenkins を iOS アプリ開発に導入してみた (gcov編)

今回は2番目の方法で試してみた。 流れとしては以下のとおり。

C言語のプロダクトコード

↓(gcov)

カバレッジデータ

↓(gcovrでCobertura形式のXML出力)

XMLカバレッジ結果

↓(Jenkins Cobertura Plugin)

Jenkinsて結果出力

C言語の定番カバレッジツール gcov でカバレッジを計測する

まずはC言語の定番カバレッジツール gcov でカバレッジを計測してみる。

Cygwinではデフォルトでgcovコマンドがある。

gcovを使うためには、コンパイルをするときに、以下のコンパイルオプションをつける必要がある。

-fprofile-arcs -ftest-coverage

Makefileをいじるときは、以下を追加すればよい。

CFLAGS += -fprofile-arcs -ftest-coverage
LDFLAGS += -fprofile-arcs

すると、.gcno というファイルができる。 実行ファイルを実行すると、.gcdaというファイルができる。

これが、カバレッジ計測結果データ。次に、これをXML形式に変換する。

gcovrでXML形式のカバレッジ結果を出力する

gcovrとは、gcovでの出力結果を編集して出力してくれるツール。

Jenkinsで結果を見るにはCoberturaと呼ばれるXMLフォーマットに変換する必要がある。

まずは、以下からダウンロードする。 公式のページはココPythonで記述されたコードなので、適切なことろに保存する。(/usr/local/bin/とか)

gcovr

コマンドラインからだと、以下のコマンドで取得

wget https://software.sandia.gov/trac/fast/export/2799/gcovr/trunk/scripts/gcovr

保存したら、実行権限を与える。

chmod u+x gcovr

gcovrは以下の形式で実行する。

gcovr --xml --output=(出力ファイル名).xml (ディレクトリ名)

サンプル

gcovr --xml --output=gcovr_result.xml src/  

これで、XMLファイルができた。次はこれをJenkinsで出力する。

Cobertura PluginでJenkins上でカバレッジ結果を見る

まずは、Cobertura PluginをJenkinsにインストールする。

[Jenkinsの管理] > [プラグインの管理] から Cobertura Pluginを選択して、インストール。

カバレッジ出力するための設定は、[設定] > [ビルド] で、gcovrのコマンドを追加する。

ちなみに、Windowsバッチコマンドだと以下のようなコマンドを追加したら動いた。 gcovrの前にpython2.6.exeを入れると動くが、 gcovrだけだったり、python gcovrだと動作しなかったりするのがナゾ。

python2.6.exe gcovr --xml --output=gcovr_result.xml src/

[ビルド後の処理] に [Cobertura カバレッジレポートの集計] という項目が追加されているので、選択。

Cobertura XMLレポート パターンという項目に、xmlファイル名を追加する。

(カスタムワークスペースを設定していない場合はパスも込で)

image

これで、ビルドを実行すればカバレッジが表示される。

カバレッジ表示結果

プロジェクト画面に[カバレッジレポート]という画面が現れる。

カバレッジはここで見ることができる。

image