cruisecontrol.net設置

43
自自 Test 自 CruiseControl.NET Kuniaki IGARASHI 2006.8.21 http://igarashikuniaki.net/

Upload: kuniaki-igarashi

Post on 24-May-2015

4.669 views

Category:

Documents


3 download

DESCRIPTION

CruiseControl.NET設置

TRANSCRIPT

Page 1: CruiseControl.NET設置

自動 Test とCruiseControl.NET

Kuniaki IGARASHI

2006.8.21

http://igarashikuniaki.net/

Page 2: CruiseControl.NET設置

目次

各種テストの向き不向き 自動テストのメリット 自動テストツール CruiseConterol.NET 自動テストの始め方 参考文献

目標みなさんが自動テストを始める際の最初の一歩をお手伝い

Page 3: CruiseControl.NET設置

ところで、

テストを行う理由はなんでしょうか?

不具合を可及的速やかに発見したいから。

(たぶん)

Page 4: CruiseControl.NET設置

バグ早期発見のメリットゼロ欠陥法 ( 某 M$ 社 )

「いかなる場合でも新しいコードを書く前にバグを取り除くことを最優先とする」

→ バグを発見する手段の 1 つがテストである。

理由 コスト

バグ修正にとりかかるまでの時間が長くなればなるほど、修正にかかるコストは(時間においても金額においても)高くなる

スケジュール見積もりバグが存在している場合、スケジュールの見積もりは非常に困難。既存のバグを修正する時間よりも、新機能を実装する時間の方が遙かに見積もりし易い

Page 5: CruiseControl.NET設置

テストいろいろ

UnitTest主にメソッド単位のテスト。コード修正が行われるごとに回す。バグ発見までの時間が短い。 定期自動 Test大量のテストデータに関してテストを回す。毎日実行することでバグが入り込んだタイミングがわかる。 人の手によるテスト万能だが、時間と手間がかかる。

テストには様々な種類がある

特徴を理解して適材適所のテストを行うと効果大

Page 6: CruiseControl.NET設置

UnitTest

メソッドを実行し、

戻り値、副作用が妥当であることを確認するテスト ツール : CppUnit, JUnit, NUnit など

CAddition cadd; // 引数の和を返し、メンバ変数 m_lastResult に結果を格納するクラス

int result = cadd.arg2(2,3); // テスト対象のメソッドを実行して

CPPUNIT_ASSERT_EQUAL((int) 5, result); // 結果を確認CPPUNIT_ASSERT_EQUAL((int) 5, cadd.m_lastResult); // 結果を確認

UnitTest の Code例

閾値に関する UnitTest をしっかり書けば、

バグの出やすい閾値付近でのバグ発生率減少

リファクタリング時には UnitTest は必須

Page 7: CruiseControl.NET設置

UnitTest – テスト駆動開発

メリット テストコードを書くことで仕様が固まる インターフェイスの曖昧さが解消 テストし易いコードを書ける

テスト駆動開発

実装する前にテストを書く

Page 8: CruiseControl.NET設置

定期自動テスト

定期的にビルドを行い、

あらかじめ記述したテストスケジュールを実行するメリット たくさんのテストを回すことができる バグが入り込んだタイミングがわかる 実行コストが非常に安価 (PC1 台から

可 )

Page 9: CruiseControl.NET設置

常時結合定期的にテストを行うためには、

常時、自動でビルド ( 結合 ) する必要があります。メリット

リポジトリ上ソースのビルド失敗を早期発見CVS add 忘れやソリューション構成変更忘れなどを早期検出可能。他の開発者への影響を最小限で防ぐ → リポジトリ上のソースがビルドできない場合、

時差のある 2 拠点開発では最悪丸 1 日仕事不能 バグ発生箇所の追求が容易

ビルドアーカイブを保管することで、過去のある不明な時点で発生したバグを二分検索可能

テスト担当とのスムースな連携テスト担当者が常に最新のビルドを手にいれることができる

Page 10: CruiseControl.NET設置

定期自動テストのメリット

デイリーテストの実際の成果

お行儀の悪い入力でエラー処理が不適切なのを発見 外部製 library 置き換えによる挙動変更に気づく 実装した場所とは違う場所への副作用を発見 出力ファイルの差分をとることで発覚した不定値問題 過去に不具合のあった入力をテストし不具合再発防止

Page 11: CruiseControl.NET設置

デイリーテストってばすげー!

ここまでのお話で、

デイリーテストをやってみようかなと、ちょっと思ったり。

デイリーテストを導入したいですか?Yes : これから具体的な方法を説明します。

No : 大人の対応をお願いします。

Page 12: CruiseControl.NET設置

CruiseControl.NET概要

OpenSource の定期テスト実行ツール(Apache Software License, BSD License)

定期的なビルド、テストが実行可能 Multi Platform 対応

.NET 環境の CruiseControl.NET

JAVA 環境の CruiseControl

CruiseControl.NET(CC.NET)  常時結合ツールの 1 つ

Page 13: CruiseControl.NET設置

CruiseControl.NET でできること 定期的なコマンド実行 定期的なソース取得、差分確認 定期的なビルド メール、 web 、アプリケーションで

のビルド結果報告複数マシンでの分散ビルド環境構築

パトライトでエラー時に警告するシステムを構築している人もいます。

Page 14: CruiseControl.NET設置

CruiseControl.NETを使う 6 つの理由 毎日テストを実行することにより、直前 24 時間

の新規実装で発生したバグを発見できます 別環境でビルドすることで CVS add 忘れなどを

早期発見できます エラー処理やタイムアウトが可能 (bat ファイル

やスクリプトでは途中で処理が止まってしまった場合に後続の処理まで影響を受ける )

複数マシンでの分散ビルドが可能 MulitPlatform 展開する場合に、テストパターン

の書き換えが容易 (Path の書き換え程度 ) テスト OK によって得られる安心感 - Priceless

Page 15: CruiseControl.NET設置

スクリーンショットMail でのビルド結果レポート

Web でのビルド結果レポート

Page 16: CruiseControl.NET設置

動作環境

All 32-bit MS Windows (95/98/NT/2000/XP)

Visual Studio .NET CVS Client (CVS を使用する場合 ) IIS (Webレポートを使用する場合 ) SMTP ( メールレポートを使用する場合 )

Page 17: CruiseControl.NET設置

対応ソース管理システム

VSS, CVS, Subversion 他

Page 18: CruiseControl.NET設置

インストール - IIS

ContorolPanel→ プログラムの追加と削除→Windows コンポーネントの追加と削除 よりインターネットインフォメーションサービス (IIS) をインストールします。http でアクセスできるように設定してください。ファイアーウォールの設定にも注意。

Page 19: CruiseControl.NET設置

インストール - CC.NET

http://sourceforge.net/projects/ccnet/から Download してインストールしてください。

注意点:Webレポート機能を使う場合は、IIS を先にインストールした方が設定が楽です。

Page 20: CruiseControl.NET設置

インストール – IIS の設定

管理ツールのインターネットインフォメーションサービスで CC.NET web dashbord が加えられていることを確認してください。

また、 asp.net(aspnet_client) も必要です。入っていない場合は以下のコマンドを実行してインストールしてください。 > %windir%\Microsoft.NET\Framework\v1.1.xxxx\aspnet_regiis.exe -i xxxx にはインストールされたバージョンが入ります。

Page 21: CruiseControl.NET設置

Windowsサービス設定

■Windows サービスの起動設定・デフォルトでは手動起動の設定となっているので、自動起動に変更・ログオンの項目で適切なユーザーを指定しないと、認証ができず CVS の実行で失敗します。・ CC.NET サービスが起動していると、コマンドラインからは実行できないので注意。( CC.NET は 1 つしか起動できない。)■ コマンドラインから手動で起動する場合> [CruiseControl.NET Path]\server\ccnet.exe -config:ccnet.config■CVS 認証・サービスで指定したユーザーで、 CVS login コマンドを実行して認証をしておきます。> cvs.exe -d :pserver:[user]:[repository] login

Page 22: CruiseControl.NET設置

CC.NET設定ファイル

ビルドの指示は以下の xml ファイルに記述します。C:\Program Files\CruiseControl.NET\server\ccnet.config

--- 例 ( 概略 )---<5 分ごとに CVS 監視 >< 変更があれば以下のタスクを実行 > < ソースディレクトリを削除 > <CVS CheckOut> <Build> <Mail 送信 >

Examples フォルダ以下に設定ファイルの例が置いてあります。

Page 23: CruiseControl.NET設置

CC.NET 設定ファイル

<project name="BuildProject"> <name> BuildProject </name> <workingDirectory>D:\CruiseControlWork\Src</workingDirectory> <artifactDirectory>D:\CruiseControlWork\Src</artifactDirectory> <modificationDelaySeconds>60</modificationDelaySeconds> <publishExceptions>true</publishExceptions>

workingDirectory : ソースをチェックアウトするパス

artifactDirectory : ビルドログを格納するパス

modificationDelaySeconds : 最後のチェックインから x 秒間はビルドを開始しない

publishExceptions : CVS などが応答しない場合の Exception エラーを通知

Page 24: CruiseControl.NET設置

CC.NET設定ファイル

トリガー各種Interval Trigger<intervalTrigger name="continuous" seconds="30" buildCondition="IfModificationExists"/>30 秒ごとにソースリポジトリを監視、変更があればタスク実行

Schedule Trigger<scheduleTrigger time="23:30" buildCondition="ForceBuild“/>決まった時間にタスク実行

Url Trigger<urlTrigger url="http://server/page.html" seconds="30" buildCondition="IfModificationExists"/>

URL で指定したファイルを監視、変更があればタスク実行

Project Trigger<projectTrigger serverUri="tcp://server:21234/CruiseManager.rem" project="Server“/>他の CC.NET プロジェクトの状態を監視、条件にあえばタスク実行

Page 25: CruiseControl.NET設置

CC.NET設定ファイル

Visual Studio Task ー VS でビルド実行 (Release, Debug など指定可 )

Build Publisher ビルド生成物をコピーー

NAnt Task – NAnt を実行

Executable Task 実行ファイルを実行ー

ForceBuildPublisher 他のー CC.NET プロジェクトを実行

NUnit Task ユニットテスト実行ー

Email Publisher – mail 送信

タスク各種

Page 26: CruiseControl.NET設置

CC.NET を使った分散ビルド

Project Trigger<projectTrigger serverUri="tcp://server:21234/CruiseManager.rem" project="Server“/>他の CC.NET プロジェクトの状態を監視、条件にあえばタスク実行

ForceBuildPublisher<publishers>

<forcebuild><project>AcceptanceTestProject</project><serverUri>tcp://buildserver2:21234/CruiseManager.rem</serverUri>

</forcebuild></publishers> 他の CC.NET プロジェクトを実行

CC.NETマシンが他の CC.NETマシンを統率または監視してタスクを指示できる。

監視

指示

Page 27: CruiseControl.NET設置

CC.NET からの通知

メール

Web

CCTray( ローカルアプリケーションに通知 )

ユーザーのタスクトレイにテスト結果通知

Page 28: CruiseControl.NET設置

CruiseControl.NET でできないこと、困ること

まっさらな状態からの CVS Chekout解決案→ CVS Command を実行する bat で実行→ NAnt(Build ツール ) と連携 CVS Checkout でロックをかけている ?ローカル各マシンでの commit が遅くなる解決案→CVS の機能を使ってコミット時に連絡用ファイルを作成、連絡用ファイルを監視

Page 29: CruiseControl.NET設置

常時結合

まずは常時結合から始めるのがオススメです。

リポジトリ監視、変更があればビルド

ビルド履歴の保管UnitTest 定期実行

Page 30: CruiseControl.NET設置

次に定期テストをやってみましょう。

例えばこんなテストはどうでしょう。

Page 31: CruiseControl.NET設置

テストの基本はお手本との差分

テスト出力結果 正しい出力結果

ソース変更後、意図しない差分がないか調べる

では、具体的にどんなテストができるか見ていきましょう。

差分比較ツール Fc - Windows 標準コマンドラインツール Diff - Unix, Linux

ExamDiff - Windows GUI ツール シェアウェア

Page 32: CruiseControl.NET設置

出力比較テスト

Output Reference

テスト対象

ソースコード

差分比較

Input

以前に出力して問題がないと確信が持てるものを Reference として使用

Page 33: CruiseControl.NET設置

ログ比較テストソースコードの要点にログ書き出しを仕込んで置く。変数 Dump や、関数の In/Out など。変数の内容や処理経路が異なる場合に発見できる。

下回りのライブラリが置き換えられた場合も、自分たちのコード上を通る経路が変わる場合は違いに気づける。

Output

テスト対象

ソースコード

Log

お手本

Log

差分比較

Input

Page 34: CruiseControl.NET設置

出力適格判断テスト

Output

テスト対象

ソースコード

出力が規格に適合しているか調べる

規格 Checker

規格適合性

チェックツールを

入手または作成

結果

Reference

差分比較

Input

Page 35: CruiseControl.NET設置

仮想上位モジュール

API テスト

Output

テスト対象

ソースコード

メソッド呼び出し(引数 )

戻り値

LogReference

差分比較

Input

Page 36: CruiseControl.NET設置

パフォーマンス測定パフォーマンスを定期的に測ることでパフォーマンス悪化を早期発見、原因把握

Output

テスト対象

ソースコード 出力にかか

る時間を測定

グラフ化

→ コード履歴をみれば悪化の原因を絞り込める

Input

Page 37: CruiseControl.NET設置

マルチプラットホームテスト

多くのプラットホーム、 OS でのテストも自動なら簡単

こんなことを発見できます。 API の OS Ver.依存 Windows のホームディレクトリなど OS Ver.依存の設

定 アクセス権依存のコード (制限ユーザーで実行など ) 変数 bit 量の違いによる不具合 エンディアネス(リトルエンディアン、ビッグエンディ

アン)

Page 38: CruiseControl.NET設置

他のテスト

接続過多テストバーチャル OS をがんがん起動して一斉に接続→ できなくはないが、毎日回すテストではない

かも。

過負荷テスト→CPU使用率を狙って上げてテストこれも毎日回すテストではないかも。

Page 39: CruiseControl.NET設置

デイリーテスト事例デイリーテストカレンダー

テスト名

●NG

●予告 NG

●AllOK

平穏な日々 不穏な時期リリース

その日の結果

Page 40: CruiseControl.NET設置

参考文献 http://confluence.public.thoughtworks.org/display/CCNET

/Welcome+to+CruiseControl.NET – Download site

http://confluence.public.thoughtworks.org/display/CCNET/Configuring+the+Server - configuration file reference

http://www.archway.co.jp/tabid/71/Default.aspx - 解説 PDF とパトライト ( 日本語 )

http://tsune.japan.webmatrixhosting.net/NWiki.aspx?page=CruiseControl.NET1.0 – 日本語 wiki

達人プログラマー / デビッド・トーマス著ISBN:475614599X (同名の別書があるので注意 )

Joel on Software / Joel Spolsky著 ISBN:4274066304

Page 41: CruiseControl.NET設置

キーワード

NCover

コードのテスト通過率を測定FxCop

コーディング規約チェック

調べる時間がなかったけど、面白そうなものたち

Page 42: CruiseControl.NET設置

リポジトリ変更ドリブントリガーソースが変更されたか監視するのではなくて、リポジトリにコミットされたタイミングでビルド。リポジトリコミット時のイベントでCC.NET が監視している箇所にダミーファイルを生成することで、 CC.NET の監視する量が激減。

調べる時間がなかったけど、面白そうなものたち

Page 43: CruiseControl.NET設置

NAnt とは何が違うの?

レイヤーが違います。

CC.NET は統合ツール

Mail機能、 webページ作成機能などがあります。

NAnt はビルドツール

CC.NET でも NAnt の豊富な機能を利用してビルドなどの作業を行うことができます。 CC.NETでも簡単なビルド指示は出すことができます。