ciしてるかい?
DESCRIPTION
第7回 アジャイルサムライ読書会 BIGLOBE道場 (11/22) で話しました。CIについてです。http://atnd.org/events/21918TRANSCRIPT
Copyright(C) NEC BIGLOBE, Ltd. 20111
CIしてるかい?
Copyright(C) NEC BIGLOBE, Ltd. 20112
バグ多いですか?
Copyright(C) NEC BIGLOBE, Ltd. 20113
はい
Copyright(C) NEC BIGLOBE, Ltd. 20114
自己紹介• 安西(やすにし)剛と申します(twitter:@tsuyok FB:本名)
• 2001年からFWとか見慣れない技術使った機能とか作ってました
• 今年からBIGLOBEでスクラムで開発しています
• 先日認定スクラムマスター(CSM)取りました
• 趣味はオーケストラで打楽器やってます
Copyright(C) NEC BIGLOBE, Ltd. 20115
まずは
ウォーターフォールで人間が手動でテストとビルド
とか想像してみましょう
Copyright(C) NEC BIGLOBE, Ltd. 20116
3ヶ月 1ヶ月 1ヶ月
実装・単体テスト 結合テスト 総合テスト
例1
Copyright(C) NEC BIGLOBE, Ltd. 20117
実装3ヶ月後の結合評価環境向けビルド
Copyright(C) NEC BIGLOBE, Ltd. 20118
コンパイルエラー!上手く動かんー!
Copyright(C) NEC BIGLOBE, Ltd. 20119
要件定義
基本設計
詳細設計
実装・単体テスト
機能テスト
結合テスト
総合テスト
評価環境へビルド
テスト
例2
Copyright(C) NEC BIGLOBE, Ltd. 201110
バグ出たらテストのやり直し
Copyright(C) NEC BIGLOBE, Ltd. 201111
要件定義
基本設計
詳細設計
実装・単体テスト
機能テスト
結合テスト
総合テスト
評価環境へビルド(コンパイルも)
やりなおし
バグ
Copyright(C) NEC BIGLOBE, Ltd. 201112
しかも手作業で・・・・
Copyright(C) NEC BIGLOBE, Ltd. 201113
総合テストでバグったら単体テストからやりなおします?
Copyright(C) NEC BIGLOBE, Ltd. 201114
みんなホントやってます?
Copyright(C) NEC BIGLOBE, Ltd. 201115
バグ多いですか?
Copyright(C) NEC BIGLOBE, Ltd. 201116
はい
Copyright(C) NEC BIGLOBE, Ltd. 201117
そこで
Copyright(C) NEC BIGLOBE, Ltd. 201118
実装
commit
テスト
バグ
Copyright(C) NEC BIGLOBE, Ltd. 201119
常にコードをcommitしたら自動ビルドと自動テスト
Copyright(C) NEC BIGLOBE, Ltd. 201120
要件定義
基本設計
詳細設計
実装・単体テスト
機能テスト
結合テスト
総合テスト
評価環境へビルド(コンパイルも)
やりなおし
バグ
今までのウォータフォール
Copyright(C) NEC BIGLOBE, Ltd. 201121
要件定義
基本設計
詳細設計実装
commit
テスト
実装
commit
テスト
実装
commit
テスト
実装
commit
テスト
実装・単体テスト
機能テスト
結合テスト
総合テスト
これからのウォータフォール
バグ
バグ
バグ
バグ
Copyright(C) NEC BIGLOBE, Ltd. 201122
プランニング実装
commit
テスト
バグ
実装
commit
テスト
バグ
実装
commit
テスト
バグ
デモ
スプリント1
プランニング実装
commit
テスト
バグ
実装
commit
テスト
バグ
実装
commit
テスト
バグ
デモ
スプリント2
プランニング実装
commit
テスト
バグ
実装
commit
テスト
バグ
実装
commit
テスト
バグ
デモ
スプリント3 ....スクラムでやってみると・・・
Copyright(C) NEC BIGLOBE, Ltd. 201123
継続的インテグレーション!CI:Continuous Integration
Copyright(C) NEC BIGLOBE, Ltd. 201124
では、我々でやってることを紹介します
Copyright(C) NEC BIGLOBE, Ltd. 201125
やっていること• テストコードの実行
1. 評価環境(本番サーバと同スペック)で15分に1回テストコード実行
• ブラウザテスト
1. Jenkinsをトリガーに、Seleniumを使ってJavaScriptのテストを1時間に1回
2. 同様に、機能(シナリオ)テストも行う
Copyright(C) NEC BIGLOBE, Ltd. 201126
継続的インテグレーションサーバ(Windows)
評価環境(本番と同スペックのLinux)SVN
開発メンバー
checkout
Jenkins
checkout
export
Selenium
・JavaScriptテストコード実行・ブラウザのテストパターン実行 (IE、Chrome、Fx)
・テストコードの実行・コードカバレッジ作成
エラーメール
エラーメール
Copyright(C) NEC BIGLOBE, Ltd. 201127
1.テストコード実行
Copyright(C) NEC BIGLOBE, Ltd. 201128
やっていること• TDDでテストコードとプロダクトコードを記述
• 本番環境と同一の環境でテストを行いたかったので、評価環境で実行
• シェルでデプロイ(svnからexport)とPHPUnitでのテストを15分に1回起動
• DBは評価環境とは別にUT専用のDBを作成し使用
• エラーだった場合、開発メンバーのMLにメール送付
• エラーを出しちゃった人はコスプレ命令
Copyright(C) NEC BIGLOBE, Ltd. 201129
SVN
開発メンバー
checkout
export
エラーメール
やっていること評価環境(本番と同スペックのLinux)
・テストコードの実行・コードカバレッジ作成
PHPUnit実行シェル
PHPUnit
テストコード
Copyright(C) NEC BIGLOBE, Ltd. 201130
やっていることエラーはこんな感じで来ます2011/10/11 20:45:01Yukarin' Unit Test Error...(T.T)coverage: /norelease/coverage/
PHPUnit 3.5.10 by Sebastian Bergmann.
............................................................ 61 / 1382 ( 4%)
.........................................F.................. 732 / 1382 ( 52%)
............................................................ 1342 / 1382 ( 97%)
.......................................
Time: 08:37, Memory: 192.75Mb
There was 1 failure:
1) Application_Service_Comments_UnitTest::testGetCommentsList with data set "該当データあり(since)" ('1', '2011-05-29 00:00:00', array(array(array('1', '00', '1', '1', '1', 'ヤサイマシマシ', '308367568', 'ゆかり01', 'yukaritest01', ', '0', '2011-04-29 00:00:00', '2011-05-29 00:00:00'))))--- Expected+++ Actual@@ @@
Copyright(C) NEC BIGLOBE, Ltd. 201131
良かったこと• おかしなコードをcommitするとすぐにバレる→中途半端なコードをcommitしなくなる
• 修正の影響があった別のコードのテストがエラーに→修正後の影響範囲がわかる
• テストがあることで、修正の安心感がある→TDDの話しかな。これはこの後のセッションで
• リファクタリングをする勇気が出る
• コスプレは笑いのネタになる
Copyright(C) NEC BIGLOBE, Ltd. 201132
実はカバレッジ率9割超え!
Copyright(C) NEC BIGLOBE, Ltd. 201133
やりすぎ?
Copyright(C) NEC BIGLOBE, Ltd. 201134
いや、品質は高い、と思います
Copyright(C) NEC BIGLOBE, Ltd. 201135
2.ブラウザテスト
Copyright(C) NEC BIGLOBE, Ltd. 201136
やっていること• Jenkinsで1時間に1回ビルドとテスト実行
• テスト実行はPHP版antであるphingを使用
• Selenium+PHPUnitでテストコードを記述
• Jasmine(JavaScriptのBDDテストFW)+Selenium+PHPUnitでテスト自動実行
• ついでに静的ソース解析もしている(CPD:重複コード、PMD:バグが潜んでいそうな部分をチェック)
Copyright(C) NEC BIGLOBE, Ltd. 201137
Copyright(C) NEC BIGLOBE, Ltd. 201138
Jenkinsの6つのメリット
Jenkins実践入門(技術評論者)より
Jenkinsは継続的インテグレーションサーバの基本的な機能となる、継続的にビルドを実行する機能を備えています。特に優れているのが以下の6点です。
1.インストールが簡単2.Webブラウザだけで操作ができる3.大規模でも複数環境でも対応できる4.プラグインで好みの機能を追加できる5.オープンソースで公開されている6.さまざまな言語で利用できる
Copyright(C) NEC BIGLOBE, Ltd. 201139
Copyright(C) NEC BIGLOBE, Ltd. 201140
継続的インテグレーションサーバ
SVN
開発メンバー
checkout
Jenkins
checkout
Selenium
・JavaScriptテストコード実行・ブラウザのテストパターン実行 (IE、Chrome、Fx)
エラーメール
やっていること
CPD+PMD
実行 実行
Copyright(C) NEC BIGLOBE, Ltd. 201141
JavaScriptのテスト• SeleniumとJasmineの組み合わせのテストフレームワークは無い
• IEとFireFoxとChromeでテスト
• しょうがないので、PHPUnitを使って自作
1. Jasmineのテスト結果のHTMLをPHPでパース
2. エラーメッセージ部分を抽出
3. Jenkinsエラーメールに含めるよう整形
Copyright(C) NEC BIGLOBE, Ltd. 201142
Copyright(C) NEC BIGLOBE, Ltd. 201143
JavaScriptのテストエラーはこんな感じに来ます
■service.transferListメソッドは(error:1)
1)item要素(2)の ダブルクォートがエスケープされている
Expected '<script language="javascript">alert('test');</script> !<>&#@"'' to equal '<script language="javascript">alert('test');</script> !<>&#@"''.
Copyright(C) NEC BIGLOBE, Ltd. 201144
サービスの機能テスト• PHPUnitでSeleniumのコードを作成する
• IEとFireFoxとChromeでテスト
• コンセプトは、詳細をテストするのではなく、正常系のパスを通す→HTMLの内容までチェックするとテストコードのメンテナンスが追いつかないため
• 主に登録、検索など画面遷移をテストする
• サービスの実行環境はlocalhostとして構築→評価環境だと動作が安定せず、エラーになる場合があるため
• Twitter連携はモックで→上記と同様に、twitter本家に問い合わせると不安定なため
Copyright(C) NEC BIGLOBE, Ltd. 201145
サービスの機能テスト
前画像 現画像 差分画像
画面キャプチャを取って、ImageMagickで画像比較
Copyright(C) NEC BIGLOBE, Ltd. 201146
良かったこと• JavaScriptのテストコードが複数のブラウザで実行できた。V8エンジンを使って自動実行するなど方法は出てきているが、あくまでV8エンジンでしか動作確認ができないため、不十分。
• サービスの機能テストは、PHPのUTにエラーが無くても、実機能に修正が影響することがあり、それをすぐに検知できた。何度もリリース前にこれで救われた。
Copyright(C) NEC BIGLOBE, Ltd. 201147
3.まとめ
Copyright(C) NEC BIGLOBE, Ltd. 201148
CIの5つのメリット1. 手戻りの削減および品質の維持ができる
2. いつでも、誰でも、実行可能なソフトウェアが作成できる
3. ビルド、テスト、結果フィードバック当の作業コストを削減できる
4. 機械による実行で、作業の正確さ・緻密さ、曖昧性の排除、が可能となる
5. 品質・生産性を継続的に分析およびカイゼンできるJenkins実践入門(技術評論者)より
Copyright(C) NEC BIGLOBE, Ltd. 201149
ビルドとテストは最後に行うのではない
Copyright(C) NEC BIGLOBE, Ltd. 201150
常に行うものなのだ!
Copyright(C) NEC BIGLOBE, Ltd. 201151
これからやること1. Jenkinsの分散ビルドをやって、評価環境のUT実行結果もJenkinsで集中管理する
2. Selenium2のWebdriverを使ってテストコードを書く(PHP版は公式には無いが、別PJとして作られている)http://code.google.com/p/php-webdriver-bindings/
3. スマートフォンでの自動テスト
4. JavaScriptのカバレッジ出力
Copyright(C) NEC BIGLOBE, Ltd. 201152
おわり