ciしてるかい?

52
Copyright(C) NEC BIGLOBE, Ltd. 2011 1 CIしてるかい?

Upload: tsuyoshi-yasunishi

Post on 20-Dec-2014

5.233 views

Category:

Documents


1 download

DESCRIPTION

第7回 アジャイルサムライ読書会 BIGLOBE道場 (11/22) で話しました。CIについてです。http://atnd.org/events/21918

TRANSCRIPT

Page 1: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 20111

CIしてるかい?

Page 2: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 20112

バグ多いですか?

Page 3: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 20113

はい

Page 4: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 20114

自己紹介• 安西(やすにし)剛と申します(twitter:@tsuyok FB:本名)

• 2001年からFWとか見慣れない技術使った機能とか作ってました

• 今年からBIGLOBEでスクラムで開発しています

• 先日認定スクラムマスター(CSM)取りました

• 趣味はオーケストラで打楽器やってます

Page 5: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 20115

まずは

ウォーターフォールで人間が手動でテストとビルド

とか想像してみましょう

Page 6: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 20116

3ヶ月 1ヶ月 1ヶ月

実装・単体テスト 結合テスト 総合テスト

例1

Page 7: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 20117

実装3ヶ月後の結合評価環境向けビルド

Page 8: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 20118

コンパイルエラー!上手く動かんー!

Page 9: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 20119

要件定義

基本設計

詳細設計

実装・単体テスト

機能テスト

結合テスト

総合テスト

評価環境へビルド

テスト

例2

Page 10: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201110

バグ出たらテストのやり直し

Page 11: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201111

要件定義

基本設計

詳細設計

実装・単体テスト

機能テスト

結合テスト

総合テスト

評価環境へビルド(コンパイルも)

やりなおし

バグ

Page 12: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201112

しかも手作業で・・・・

Page 13: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201113

総合テストでバグったら単体テストからやりなおします?

Page 14: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201114

みんなホントやってます?

Page 15: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201115

バグ多いですか?

Page 16: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201116

はい

Page 17: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201117

そこで

Page 18: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201118

実装

commit

テスト

バグ

Page 19: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201119

常にコードをcommitしたら自動ビルドと自動テスト

Page 20: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201120

要件定義

基本設計

詳細設計

実装・単体テスト

機能テスト

結合テスト

総合テスト

評価環境へビルド(コンパイルも)

やりなおし

バグ

今までのウォータフォール

Page 21: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201121

要件定義

基本設計

詳細設計実装

commit

テスト

実装

commit

テスト

実装

commit

テスト

実装

commit

テスト

実装・単体テスト

機能テスト

結合テスト

総合テスト

これからのウォータフォール

バグ

バグ

バグ

バグ

Page 22: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201122

プランニング実装

commit

テスト

バグ

実装

commit

テスト

バグ

実装

commit

テスト

バグ

デモ

スプリント1

プランニング実装

commit

テスト

バグ

実装

commit

テスト

バグ

実装

commit

テスト

バグ

デモ

スプリント2

プランニング実装

commit

テスト

バグ

実装

commit

テスト

バグ

実装

commit

テスト

バグ

デモ

スプリント3 ....スクラムでやってみると・・・

Page 23: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201123

継続的インテグレーション!CI:Continuous Integration

Page 24: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201124

では、我々でやってることを紹介します

Page 25: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201125

やっていること• テストコードの実行

1. 評価環境(本番サーバと同スペック)で15分に1回テストコード実行

• ブラウザテスト

1. Jenkinsをトリガーに、Seleniumを使ってJavaScriptのテストを1時間に1回

2. 同様に、機能(シナリオ)テストも行う

Page 26: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201126

継続的インテグレーションサーバ(Windows)

評価環境(本番と同スペックのLinux)SVN

開発メンバー

checkout

Jenkins

checkout

export

Selenium

・JavaScriptテストコード実行・ブラウザのテストパターン実行 (IE、Chrome、Fx)

・テストコードの実行・コードカバレッジ作成

エラーメール

エラーメール

Page 27: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201127

1.テストコード実行

Page 28: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201128

やっていること• TDDでテストコードとプロダクトコードを記述

• 本番環境と同一の環境でテストを行いたかったので、評価環境で実行

• シェルでデプロイ(svnからexport)とPHPUnitでのテストを15分に1回起動

• DBは評価環境とは別にUT専用のDBを作成し使用

• エラーだった場合、開発メンバーのMLにメール送付

• エラーを出しちゃった人はコスプレ命令

Page 29: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201129

SVN

開発メンバー

checkout

export

エラーメール

やっていること評価環境(本番と同スペックのLinux)

・テストコードの実行・コードカバレッジ作成

PHPUnit実行シェル

PHPUnit

テストコード

Page 30: Ciしてるかい?

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@@ @@

Page 31: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201131

良かったこと• おかしなコードをcommitするとすぐにバレる→中途半端なコードをcommitしなくなる

• 修正の影響があった別のコードのテストがエラーに→修正後の影響範囲がわかる

• テストがあることで、修正の安心感がある→TDDの話しかな。これはこの後のセッションで

• リファクタリングをする勇気が出る

• コスプレは笑いのネタになる

Page 32: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201132

実はカバレッジ率9割超え!

Page 33: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201133

やりすぎ?

Page 34: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201134

いや、品質は高い、と思います

Page 35: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201135

2.ブラウザテスト

Page 36: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201136

やっていること• Jenkinsで1時間に1回ビルドとテスト実行

• テスト実行はPHP版antであるphingを使用

• Selenium+PHPUnitでテストコードを記述

• Jasmine(JavaScriptのBDDテストFW)+Selenium+PHPUnitでテスト自動実行

• ついでに静的ソース解析もしている(CPD:重複コード、PMD:バグが潜んでいそうな部分をチェック)

Page 37: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201137

Page 38: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201138

Jenkinsの6つのメリット

Jenkins実践入門(技術評論者)より

Jenkinsは継続的インテグレーションサーバの基本的な機能となる、継続的にビルドを実行する機能を備えています。特に優れているのが以下の6点です。

1.インストールが簡単2.Webブラウザだけで操作ができる3.大規模でも複数環境でも対応できる4.プラグインで好みの機能を追加できる5.オープンソースで公開されている6.さまざまな言語で利用できる

Page 39: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201139

Page 40: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201140

継続的インテグレーションサーバ

SVN

開発メンバー

checkout

Jenkins

checkout

Selenium

・JavaScriptテストコード実行・ブラウザのテストパターン実行 (IE、Chrome、Fx)

エラーメール

やっていること

CPD+PMD

実行 実行

Page 41: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201141

JavaScriptのテスト• SeleniumとJasmineの組み合わせのテストフレームワークは無い

• IEとFireFoxとChromeでテスト

• しょうがないので、PHPUnitを使って自作

1. Jasmineのテスト結果のHTMLをPHPでパース

2. エラーメッセージ部分を抽出

3. Jenkinsエラーメールに含めるよう整形

Page 42: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201142

Page 43: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201143

JavaScriptのテストエラーはこんな感じに来ます

■service.transferListメソッドは(error:1)

1)item要素(2)の ダブルクォートがエスケープされている

Expected '<script language=&quot;javascript&quot;>alert('test');</script> !<>&amp;#@&quot;'' to equal '<script language=&quot;javascript&quot;>alert('test');</script> !<>&#@&quot;''.

Page 44: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201144

サービスの機能テスト• PHPUnitでSeleniumのコードを作成する

• IEとFireFoxとChromeでテスト

• コンセプトは、詳細をテストするのではなく、正常系のパスを通す→HTMLの内容までチェックするとテストコードのメンテナンスが追いつかないため

• 主に登録、検索など画面遷移をテストする

• サービスの実行環境はlocalhostとして構築→評価環境だと動作が安定せず、エラーになる場合があるため

• Twitter連携はモックで→上記と同様に、twitter本家に問い合わせると不安定なため

Page 45: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201145

サービスの機能テスト

前画像 現画像 差分画像

画面キャプチャを取って、ImageMagickで画像比較

Page 46: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201146

良かったこと• JavaScriptのテストコードが複数のブラウザで実行できた。V8エンジンを使って自動実行するなど方法は出てきているが、あくまでV8エンジンでしか動作確認ができないため、不十分。

• サービスの機能テストは、PHPのUTにエラーが無くても、実機能に修正が影響することがあり、それをすぐに検知できた。何度もリリース前にこれで救われた。

Page 47: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201147

3.まとめ

Page 48: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201148

CIの5つのメリット1. 手戻りの削減および品質の維持ができる

2. いつでも、誰でも、実行可能なソフトウェアが作成できる

3. ビルド、テスト、結果フィードバック当の作業コストを削減できる

4. 機械による実行で、作業の正確さ・緻密さ、曖昧性の排除、が可能となる

5. 品質・生産性を継続的に分析およびカイゼンできるJenkins実践入門(技術評論者)より

Page 49: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201149

ビルドとテストは最後に行うのではない

Page 50: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201150

常に行うものなのだ!

Page 51: Ciしてるかい?

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のカバレッジ出力

Page 52: Ciしてるかい?

Copyright(C) NEC BIGLOBE, Ltd. 201152

おわり