ciしてるかい?

Post on 20-Dec-2014

5.233 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

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=&quot;javascript&quot;>alert('test');</script> !<>&amp;#@&quot;'' to equal '<script language=&quot;javascript&quot;>alert('test');</script> !<>&#@&quot;''.

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

おわり

top related