SlideShare ist ein Scribd-Unternehmen logo
1 von 20
Downloaden Sie, um offline zu lesen
株式会社フレクト 
2014/11/20 
小西俊司
テストがなくて辛い 
しかし、仕様がころころ変わるSI案件ではテストをメン テナンスするコストが高すぎる 
◦ていうか無理 
◦巷間語られるテストの理想はサービスではまだしもSIでは難 しい気がする 
◦ていうか仕様変わりすぎ。。。(-- 
なんとかして楽してテストを作りたい
PROTE 
https://github.com/shunjikonishi/prote 
プロキシーで、テストをなんとかする
リバースプロキシの一種 
経由する全リクエスト/レスポンスをファイルに保存 
◦HOST, Referer等は対象サーバに書き変えている 
◦扱いやすいようにheadersとbodyは別ファイルにしている 
WebSocketにも対応 
同一ブラウザからのリクエストのライブモニタリングが 可能 
リクエストを選択してテストをジェネる 
リクエスト/レスポンスをインターセプトして一部を置 き換えることも可能
Proteの受けたリ クエスト/レスポン スを一部のヘッダ を書き換えて転送 
Request 
◦Host 
◦Origin 
◦Referer 
Response 
◦Location
実装はPlay2 
◦activator.jarがプロジェクトルートにあるのでJDKがあればsbtや scalaのインストールは不要 
環境変数TARGET_HOSTにテスト対象のホスト名を設定 
TARGET_HOSTがhttpsを必要とする場合はhttps.port の指定が必要 
◦playが自動的に自己署名証明書を生成 
gitclone https://github.com/shunjikonishi/prote.git 
cdprote 
set TARGET_HOST=xxxx.herokuapp.com 
activator –Dhttps.port=9443 run
メッセージをローカルにファイル保存しているため 1Dynoでないとちゃんと動かない 
◦当然キャプチャしたメッセージは1日(Dyno再起動)で消える 
httpsはHerokuのルータがハンドルするので設定不 要 
他者のセットアップしたサーバをうかつに実行しては いけない 
◦Printlnを仕込むだけであっさりと全情報を盗める 
herokucreate –b https://github.com/heroku/heroku-buildpack-scala 
gitpush herokumaster 
herokuconfig:setTARGET_HOST=xxxx.herokuapp.com
localhost:9000で起動している場合 
http://localhost:9000/CONSOLE/mainにアクセ スしてライブモニタを起動 
◦/CONSOLE/xxxxだけは対象サーバに転送されない 
◦「CONSOLE」の部分は環境変数CONSOLE_CONTEXTで設 定可能 
http://localhost:/9000/ など任意のパスにアクセ ス 
◦対象サーバの画面が表示される 
◦ライブモニタには実行されたリクエストの一覧が表示される 
◦CORSで複雑なことをしていなければ問題なく動作するはず
同一ブラウザからのリクエストをリアルタイムで参照
各種フィルタ 
◦イメージを隠す 
◦Js/cssを隠す 
◦パスの部分一致でフィルタリング 
JSONのprettyPrint 
UrlEncodedのデコード 
テストの生成 
リクエスト/レスポンスを同時に表示するので見やすい 
WebSocketが見られるのは便利(ChromeのDevToolで は日本語が化ける) 
ネットワークの見られないIE8で特に重宝する
実行するリクエストを選択してテストを生成 
現在はJavaScript(Mocha)のテスト生成にのみ対応
選択したリクエストを順次実行し、保存したレスポンス と比較する 
◦ステータスコード 
◦レスポンスがJsonの場合は保存したBodyと各項目を比較 
日付やオートインクリメントの項目があると、あっさり 失敗する(-- 
◦レコードの新規作成時のキーや作成日は毎回異なるのでそ のままでは使えない 
現在WebSocketのテストには未対応 
multipart/form-dataにも未対応 
◦必要に迫られたら作る
テスト生成時にExternal Scriptを指定することで外 部スクリプトを差し込むことができる 
varhttp = require("http"), 
https = require("https"), 
assert = require("chai").assert, 
external = require("./custom.js"), 
querystring = require("querystring");
拡張ポイントは以下の3つ 
◦buildTestData: テストデータをカスタマイズする 
◦hookRequest: リクエスト(パラメータ)をカスタマイズする 
◦validate: 独自のassertionを行う。Trueを返した場合はデ フォルトの検証はスキップされる 
module.exports= { 
buildTestData: function(request, data) { return data;}, 
hookRequest: function(prevResponse, request) { return request;}, 
validate: function(request, response) { return false;} 
}
アイテムを新規作成後に削除 
varextend = require("extend"), 
IGNORE_VALUE = "__IGNORE__"; 
module.exports= { 
buildTestData: function(request, data) { 
//新規作成時はキーと日付項目を無視 
if (request.path=== "/item/new") { 
data = extend(data, { 
"id" : IGNORE_VALUE 
"updatedatetime" : IGNORE_VALUE 
}); 
} 
return data; 
}, 
hookRequest: function(prevResponse, request) { 
//削除時はパスのキー部分を変更 
if (request.path.indexOf("/item/delete/") === 0) { 
request.path= "/item/delete/" + prevResponse.body.newId; 
} 
return request; 
} 
}
RSpecやJUnit用のテストを独自に作成することが可 能 
◦SourceGeneratorの実装クラスを作成し、 
◦SourceGeneratorResistryに登録 
ただし、Cookieのハンドリングはかなり面倒 
◦ほとんどの場合なんらかのワンタイムトークンがあるのでそ れを引き回す必要がある 
参考 
◦MochaTest.scala.txt 
◦MochaTestGenerator.scala 
◦MessageWrapper.scala 
PullRequestください
以下のフックが可能 
◦リクエストをサーバに転送せず独自のレスポンスを返す 
◦リクエストをサーバに転送する前に改変 
◦サーバから受けたレスポンスを改変してブラウザに返す 
Interceptorの使用例 
◦フロントエンド開発時にとあるレスポンスの一部だけ変更した ものが欲しいがそれ以外はオリジナルデータを使いたい 
◦ログインでユーザ名、パスワードを入力するのが面倒なので 毎回同じテストユーザでログインしたい 
◦開発環境のデータを使いつつCSSだけはローカルで編集した い(デザイナー向けに有用)
Interceptorの実装クラスを作成し、 
InterceptorResistryに登録 
参考: SampleInterceptor.scala 
packageinterceptors 
importmodels.RequestMessage 
importmodels.ResponseMessage 
traitInterceptor { 
//リクエストのフック 
//改変したリクエスト、または独自レスポンスを返す 
defhookRequest(request: RequestMessage): Either[RequestMessage, ResponseMessage] 
= Left(request) 
//レスポンスのフック 
//改変したレスポンスを返す 
defhookResponse(request: RequestMessage, response: ResponseMessage): ResponseMessage 
= response 
}
FileInterceptorをInterceptorResitoryに登録 
objectInterceptorRegistry{ 
… 
private vallist: Seq[(Pattern, Interceptor)] = Seq( 
"/assets/css/style.css" -> new FileInterceptor("text/css", new File(…)), 
".*" -> defaultInterceptor 
).map{case (s, v) => (s.r.pattern, v)} 
… 
}
テストの自動生成は思ったより難しい 
◦Cookieが超絶面倒だった 
◦レスポンスの検証方法は課題(JSON以外もどうにかしたいがノーア イデア) 
◦Seleniumとの連携でなんかできそうな気もするがイマイチ思いつ かない 
Interceptorはかなり使える 
◦当初の予定にはなかったが、社内勉強会での意見を元に実装して みた 
◦FLECTでは特にCSS差し替えが使えそう 
◦ユースケースが見えてきたらコード編集なしでコンソールから設定 できるようにするかも 
カスタマイズ可能なProxyエンジンと考えれば他にも色々 な使い道があるかも 
決して悪用してはならない 
◦インターネット上でやったらフィッシングです。。。(-- 
まだまだ発展途上

Weitere ähnliche Inhalte

Was ist angesagt?

究極のバッチフレームワーク(予定)
究極のバッチフレームワーク(予定)究極のバッチフレームワーク(予定)
究極のバッチフレームワーク(予定)
fumoto kazuhiro
 
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
Akio Katayama
 
Next-L Enju 第1回開発ワークショップ資料
Next-L Enju 第1回開発ワークショップ資料Next-L Enju 第1回開発ワークショップ資料
Next-L Enju 第1回開発ワークショップ資料
Kosuke Tanabe
 
JS開発におけるTDDと自動テストツール利用の勘所
JS開発におけるTDDと自動テストツール利用の勘所JS開発におけるTDDと自動テストツール利用の勘所
JS開発におけるTDDと自動テストツール利用の勘所
Koji Nakamura
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
Naoyuki Yamada
 
VPとSPIDERを使ったMySQL運用
VPとSPIDERを使ったMySQL運用VPとSPIDERを使ったMySQL運用
VPとSPIDERを使ったMySQL運用
Ryuta Kamizono
 
System4 detail for_h
System4 detail for_hSystem4 detail for_h
System4 detail for_h
Jun Chiba
 
Gasライブデモ20210715
Gasライブデモ20210715Gasライブデモ20210715
Gasライブデモ20210715
Hayato Ito
 
System4 comment h
System4 comment hSystem4 comment h
System4 comment h
Jun Chiba
 
Handlersocket 20140218
Handlersocket 20140218Handlersocket 20140218
Handlersocket 20140218
akirahiguchi
 

Was ist angesagt? (18)

オンプレでもクラウドでも データベースサーバの運用
オンプレでもクラウドでも データベースサーバの運用オンプレでもクラウドでも データベースサーバの運用
オンプレでもクラウドでも データベースサーバの運用
 
究極のバッチフレームワーク(予定)
究極のバッチフレームワーク(予定)究極のバッチフレームワーク(予定)
究極のバッチフレームワーク(予定)
 
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
 
Next-L Enju 第1回開発ワークショップ資料
Next-L Enju 第1回開発ワークショップ資料Next-L Enju 第1回開発ワークショップ資料
Next-L Enju 第1回開発ワークショップ資料
 
What is doobie? - database access for scala -
What is doobie? - database access for scala -What is doobie? - database access for scala -
What is doobie? - database access for scala -
 
JS開発におけるTDDと自動テストツール利用の勘所
JS開発におけるTDDと自動テストツール利用の勘所JS開発におけるTDDと自動テストツール利用の勘所
JS開発におけるTDDと自動テストツール利用の勘所
 
Drupal Elasticsearch Connector の日本語検索の質を高める
Drupal Elasticsearch Connector の日本語検索の質を高めるDrupal Elasticsearch Connector の日本語検索の質を高める
Drupal Elasticsearch Connector の日本語検索の質を高める
 
RとSQLiteによるオミックス解析の促進
RとSQLiteによるオミックス解析の促進RとSQLiteによるオミックス解析の促進
RとSQLiteによるオミックス解析の促進
 
OSC2008 Tokyo/Spring REST勉強夜会
OSC2008 Tokyo/Spring REST勉強夜会OSC2008 Tokyo/Spring REST勉強夜会
OSC2008 Tokyo/Spring REST勉強夜会
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
 
VPとSPIDERを使ったMySQL運用
VPとSPIDERを使ったMySQL運用VPとSPIDERを使ったMySQL運用
VPとSPIDERを使ったMySQL運用
 
System4 detail for_h
System4 detail for_hSystem4 detail for_h
System4 detail for_h
 
図解 ngrx
図解 ngrx図解 ngrx
図解 ngrx
 
MySQL のオンラインバックアップ & リカバリ
MySQL のオンラインバックアップ & リカバリMySQL のオンラインバックアップ & リカバリ
MySQL のオンラインバックアップ & リカバリ
 
Gasライブデモ20210715
Gasライブデモ20210715Gasライブデモ20210715
Gasライブデモ20210715
 
System4 comment h
System4 comment hSystem4 comment h
System4 comment h
 
Handlersocket 20140218
Handlersocket 20140218Handlersocket 20140218
Handlersocket 20140218
 
20180123 power shell
20180123 power shell20180123 power shell
20180123 power shell
 

Andere mochten auch (9)

Heroku meetup 13_shuttlebus-heroku
Heroku meetup 13_shuttlebus-herokuHeroku meetup 13_shuttlebus-heroku
Heroku meetup 13_shuttlebus-heroku
 
HerokuからSalesforceを使ってみた
HerokuからSalesforceを使ってみたHerokuからSalesforceを使ってみた
HerokuからSalesforceを使ってみた
 
Herokuのログ解析ツール
Herokuのログ解析ツールHerokuのログ解析ツール
Herokuのログ解析ツール
 
Salesforceのハッカソンに参加した話
Salesforceのハッカソンに参加した話Salesforceのハッカソンに参加した話
Salesforceのハッカソンに参加した話
 
MochaとChaiでやるJavaScriptテスト
MochaとChaiでやるJavaScriptテストMochaとChaiでやるJavaScriptテスト
MochaとChaiでやるJavaScriptテスト
 
クラウド x IoT実践事例のご紹介
クラウド x IoT実践事例のご紹介クラウド x IoT実践事例のご紹介
クラウド x IoT実践事例のご紹介
 
カスタムアプリケーションプラットフォーム Salesforce Heroku ~ ソーシャルアプリケーションを支える技術 ~
カスタムアプリケーションプラットフォーム Salesforce Heroku~ ソーシャルアプリケーションを支える技術 ~カスタムアプリケーションプラットフォーム Salesforce Heroku~ ソーシャルアプリケーションを支える技術 ~
カスタムアプリケーションプラットフォーム Salesforce Heroku ~ ソーシャルアプリケーションを支える技術 ~
 
Javascriptのあれやこれやをまとめて説明してみる
Javascriptのあれやこれやをまとめて説明してみるJavascriptのあれやこれやをまとめて説明してみる
Javascriptのあれやこれやをまとめて説明してみる
 
Salesforce連携のためのOData入門
Salesforce連携のためのOData入門Salesforce連携のためのOData入門
Salesforce連携のためのOData入門
 

Ähnlich wie プロキシーを使ってテストを楽にする

Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
linzhixing
 
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
Yuki Takei
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
Takayoshi Tanaka
 
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration
Kazuki Nakajima
 
スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門
Hisashi HATAKEYAMA
 

Ähnlich wie プロキシーを使ってテストを楽にする (20)

[使い倒し]GitHubのIssueとTFS/VSOのWorkItem連動に挑む(2015/08/26)
[使い倒し]GitHubのIssueとTFS/VSOのWorkItem連動に挑む(2015/08/26)[使い倒し]GitHubのIssueとTFS/VSOのWorkItem連動に挑む(2015/08/26)
[使い倒し]GitHubのIssueとTFS/VSOのWorkItem連動に挑む(2015/08/26)
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
 
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
 
Introduction to JShell #JavaDayTokyo #jdt_jshell
Introduction to JShell #JavaDayTokyo #jdt_jshellIntroduction to JShell #JavaDayTokyo #jdt_jshell
Introduction to JShell #JavaDayTokyo #jdt_jshell
 
できる!サーバレスアーキテクチャ
できる!サーバレスアーキテクチャできる!サーバレスアーキテクチャ
できる!サーバレスアーキテクチャ
 
Djangoフレームワークの紹介
Djangoフレームワークの紹介Djangoフレームワークの紹介
Djangoフレームワークの紹介
 
traceur-compilerで ECMAScript6を体験
traceur-compilerで ECMAScript6を体験traceur-compilerで ECMAScript6を体験
traceur-compilerで ECMAScript6を体験
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
 
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
 
Java EE8 Report
Java EE8 ReportJava EE8 Report
Java EE8 Report
 
Java による Web アプリケーションのプロトタイプのために最近使っている構成
Java による Web アプリケーションのプロトタイプのために最近使っている構成Java による Web アプリケーションのプロトタイプのために最近使っている構成
Java による Web アプリケーションのプロトタイプのために最近使っている構成
 
Data Factory V2 新機能徹底活用入門
Data Factory V2 新機能徹底活用入門Data Factory V2 新機能徹底活用入門
Data Factory V2 新機能徹底活用入門
 
ADRという考えを取り入れてみて
ADRという考えを取り入れてみてADRという考えを取り入れてみて
ADRという考えを取り入れてみて
 
[Japan Tech summit 2017] DEP 006
[Japan Tech summit 2017] DEP 006[Japan Tech summit 2017] DEP 006
[Japan Tech summit 2017] DEP 006
 
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
 
ScalaMatsuri 2016
ScalaMatsuri 2016ScalaMatsuri 2016
ScalaMatsuri 2016
 
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration
 
スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門
 
JavaScriptでWebDriverのテストコードを書きましょ
JavaScriptでWebDriverのテストコードを書きましょJavaScriptでWebDriverのテストコードを書きましょ
JavaScriptでWebDriverのテストコードを書きましょ
 

Mehr von Shunji Konishi

WebSocketでリアルタイムクイズアプリを作ってみた
WebSocketでリアルタイムクイズアプリを作ってみたWebSocketでリアルタイムクイズアプリを作ってみた
WebSocketでリアルタイムクイズアプリを作ってみた
Shunji Konishi
 
Dyno cycling behavior of Heroku
Dyno cycling behavior of HerokuDyno cycling behavior of Heroku
Dyno cycling behavior of Heroku
Shunji Konishi
 
Herokuで使えるRDBMS管理者ツール
Herokuで使えるRDBMS管理者ツールHerokuで使えるRDBMS管理者ツール
Herokuで使えるRDBMS管理者ツール
Shunji Konishi
 

Mehr von Shunji Konishi (16)

SendGridサンプルの紹介
SendGridサンプルの紹介SendGridサンプルの紹介
SendGridサンプルの紹介
 
セキュリティの考え方
セキュリティの考え方セキュリティの考え方
セキュリティの考え方
 
一番簡単なWebSocketの試し方
一番簡単なWebSocketの試し方一番簡単なWebSocketの試し方
一番簡単なWebSocketの試し方
 
WebSocketでリアルタイムクイズアプリを作ってみた
WebSocketでリアルタイムクイズアプリを作ってみたWebSocketでリアルタイムクイズアプリを作ってみた
WebSocketでリアルタイムクイズアプリを作ってみた
 
良質なコードを高速に書くコツ
良質なコードを高速に書くコツ良質なコードを高速に書くコツ
良質なコードを高速に書くコツ
 
Heroku tips1
Heroku tips1Heroku tips1
Heroku tips1
 
Playframework1でSeleniumテスト
Playframework1でSeleniumテストPlayframework1でSeleniumテスト
Playframework1でSeleniumテスト
 
Heroku Dyno再起動時の振る舞い
Heroku Dyno再起動時の振る舞いHeroku Dyno再起動時の振る舞い
Heroku Dyno再起動時の振る舞い
 
Dyno cycling behavior of Heroku
Dyno cycling behavior of HerokuDyno cycling behavior of Heroku
Dyno cycling behavior of Heroku
 
Herokuで使えるRDBMS管理者ツール
Herokuで使えるRDBMS管理者ツールHerokuで使えるRDBMS管理者ツール
Herokuで使えるRDBMS管理者ツール
 
Play1 to Play2
Play1 to Play2Play1 to Play2
Play1 to Play2
 
お手軽Ajaxアプリケーションの作り方
お手軽Ajaxアプリケーションの作り方お手軽Ajaxアプリケーションの作り方
お手軽Ajaxアプリケーションの作り方
 
Excel2 canvas
Excel2 canvasExcel2 canvas
Excel2 canvas
 
特盛!Heroku
特盛!Heroku特盛!Heroku
特盛!Heroku
 
文字コードのお話
文字コードのお話文字コードのお話
文字コードのお話
 
High traffic questionnaire site
High traffic questionnaire siteHigh traffic questionnaire site
High traffic questionnaire site
 

プロキシーを使ってテストを楽にする