SlideShare ist ein Scribd-Unternehmen logo
1 von 36
Downloaden Sie, um offline zu lesen
Mock、Stub勉強会(ruby)

                 瀬尾直利
             2011/05/20
アウトライン

 MockとStubとは
 MockとStubの使い分け
 Mock Frameworkの構文比較
 More about RR (Double Ruby)
MockとStubとは
 Test Doubleという概念の一部。
 Double とは、代役のことで、テスト用にオブジェクトを
 入れ替えるときに一般的に用いられる言葉。




      [1] xUnit Test Patterns by Gerard Meszaros
      http://xunitpatterns.com/Test%20Double.html
Test Doubleの種類
Dummy
  受け渡されることはあるが実際に使用されることはない。パラメータリ
  ストを埋めたいだけといった場合に利用されることが多い。
Fake
  実際に動作するように実装されてはいるが、手抜きされており製品版
  には向かない。
Stub
  テスト時の呼び出しに対してあらかじめ決められた値を返すもの。
Spy
  呼び出しに基づく情報を記録するスタブ。例えば、何通メールが送ら
  れたかだけカウントするメールサービスなどが該当する。
Mock
  テスト時の呼び出しの仕様を表したもの。期待されない呼び出しが行
  なわれた場合は例外をスローできる。期待された呼び出しがすべて行わ
  れたか確認できる。
Mock サンプルコード on Mocha (1)
# expect a class method
Duck.expects(:quack)
Duck.quack
# => verify success

# expect an instance method of a real object
duck = Duck.new
duck.expects(:quack)
# => verify success

# traditional mocking
duck = mock(’duck’)
duck.expects(:quack)
duck.quack
# => verify success
Mock サンプルコード on Mocha (2)
# expect multiple invocations
duck = mock(’duck’)
duck.expects(:quack).times(3)
duck.quack
duck.quack
duck.quack
# => verify success

# specifying parameters and specifying a return value
duck = mock('duck')
duck.expects(:waddle).with(2).returns(3)
duck.waddle(2) # 3
# => verify success
duck.waddle(1) # 3
# => verify failure
Stub サンプルコード on Mocha
# return values and exceptions

duck = Duck.new # = mock('duck')

duck.stubs(:flag).returns(true,false).then.raises(BrokenWingError)

duck.flap # => true
duck.flap # => false
duck.flap # => raises BrokenWingError

※ ここでは返り値のテストはしていない。
イメージ付きま
した?
アウトライン

 MockとStubとは
 MockとStubの使い分け
 Mock Frameworkの構文比較
 More about RR (Double Ruby)
MockとStubの使い分け
 Mock は呼び出しの verification をする。
 Stub はそれをしない。
 → で、結局どう使い分ける?

テストの観点の違い[3]
 相互作用(振る舞い)中心のテスト → Mock。
 状態中心のテスト → Stub。
相互作用中心のテスト
テスト対象のシステムと外部のコンポーネントとの間
で正しいやり取りがされるかのテスト。
いわばプロトコルのテスト。
外部のコンポーネントを Mock で置き換え、システム
が正しい呼び出しをしているかを監視する。
例えば MVC でいう Controller の単体テスト。
Modelが正しく実装された時にControllerが正しく動
作することが、Modelがなくても保証される。
状態中心のテスト
テスト対象のシステムが正しい結果を返すかというテ
スト。
最終的に返ってくる結果だけが重要。
外部のシステムとの統合が面倒な時に Stub を利用
してテストを簡単にする。
入出力の例を Stub を使って記述する。
サンプルコード) 振る舞い中心のテスト
left_tire = mock('left_tire')
right_tire = mock('right_tire')
robot = Robot.new(left_tire, right_tire)

left_tire.expects(:move).with(-5)
right_tire.expects(:move).with(+5)

robot.turn_left

# behaviour verification
left_tire.verify
right_tire.verify
サンプルコード) 状態中心のテスト
left_tire = mock('left_tire').stub(:move).returns(-5);
right_tire = mock('right_tire').stub(:move).returns(+5);
robot = Robot.new(left_tire, right_tire)

initial_position = robot.position
Initial_direction = robot.direction

robot.turn_left

# state verification
assert_equal initial_position, robot.position
assert robot.direction > initial_direction
ここまで
おk?
アウトライン

 Test Double
 MockとStubの違い
 Mock Frameworkの構文比較
 More about RR
Mock Frameworkの構文比較

 RR
 Mocha
 Rspec/mocks
 Flexmock
の構文を比較してみた[4]。
Mock
 期待: Userクラスのfindメソッドに引数'99'が渡され、
 変数userが返される。
RR
mock(User).find('99') { user }

Mocha
User.expects(:find).with('99').returns(user)

Spec/mocks
User.should_receive(:find).with('99').and_return(user)

Flexmock
flexstub(User).should_receive(:find).with('99').and_return(user).once
Stub (1)
 期待: Userクラスのfindメソッドに引数‘99’が渡された場合、
 user1が、それ以外の場合 user2 が返される。
RR
stub(User).find('99') { user1 }
stub(User).find { user2 }

Mocha
User.stubs(:find).with(anything).returns(user2)
User.stubs(:find).with('99').returns(user1)
Stub (2)
 期待: Userクラスのfindメソッドに引数‘99’が渡された場合、
 user1が、それ以外の場合 user2 が返される。
Spec/mocks
users = {
  '99' => user1,
  'default' => user2
}
User.stub!(:find).and_return do |id|
  users[id] || users['default']
end

Flexmock
users = {
  '99' => user1,
  'default' => user2
}
flexstub(User).should_receive(:find).and_return do |id|
  users[id] || users['default']
end
所感

可読性はMochaやrspec
実際のコードに近いのはRR
短くかけるのはRR



     どう?
アウトライン

 MockとStubとは
 MockとStubの使い分け
 Mock Frameworkの構文比較
 More about RR (Double Ruby)
RRの使い方[6]
test/unit
 class Test::Unit::TestCase
    include RR::Adapters::TestUnit
  end

rspec
 Spec::Runner.configure do |config|
   config.mock_with :rr
   # もしくは、バージョンの非互換性で動作しない場合は
   # config.mock_with RR::Adapters::Rspec
 end

単独使用
 require 'rr'
 extend RR::Adapters::RRMethods
 object = Object.new
 mock(object).method_name {:return_value}
 object.method_name # :return_value が返ります
 RR.verify # ダブルの期待を満たしているかを検証します
RRのメソッド
  mock もしくは mock!
  stub もしくは stub!
  dont_allow もしくは dont_allow!
  proxy もしくは proxy!
  instance_of もしくは instance_of!

! が付いているメソッドは純粋なダブルオブジェクトを作成します。

obj = MyObject.new
mock(obj).hello # 上書き。Partial Mocking


obj = mock! # Pure mock object. Traditional Mocking
obj.hello
Mock サンプルコード on RR
   どういう意味でしょうか?
       意味でしょうか
Q. どういう意味でしょうか?
view = View.new
mock(view).render(:partial => "user_info") {"Information"}


次の方法でモックへ渡される引数をいくつでも許せます。
  方法でモックへ渡される引数をいくつでも許せます。
    でモックへ    引数をいくつでも
mock(view).render.with_any_args.twice do |*args|
 if args.first == {:partial => "user_info}
   "User Info"
 else
   "Stuff in the view #{args.inspect}"
 end
end
Stub サンプルコード on RR
   どういう意味でしょうか?
       意味でしょうか
Q. どういう意味でしょうか?
jane = User.new('Jane')
bob = User.new('Bob')
stub(User).find('42') {jane}
stub(User).find('99') {bob}
stub(User).find do |id|
  raise "Unexpected id #{id.inspect} passed to me"
end
dont_allow サンプルコード
決して呼ばれない期待。呼び出されると例外が発生。
 して呼ばれない期待。
        期待    されると例外が発生。
                  例外
dont_allow(User).find('42')
User.find('42') # TimesCalledError 例外が送出されます
mock.proxy サンプルコード
返り値を置き換えない mock
class Test
 def method_a
   “a”
 end
end
test = Test.new
mock.proxy(test).method_a # expects once called
puts test.method_a # a

# normal mock
mock(test).method_a # expects once called
puts test.method_a # 空

実際の処理をさせ、
実際の処理をさせ、返り値を受け取り、偽装して返す。
     をさせ          偽装して返
                    して
view = controller.template
mock.proxy(view).render(:partial => "user_info") do |html|
 html.should include("John Doe")
 "Different html"
end
stub.proxy サンプルコード
返り値をインターセプト
view = controller.template
stub.proxy(view).render(:partial => "user_info") do |html|
 html.should include("Joe Smith")
 html
end
instance_of サンプルコード
あるクラスの全てのインスタンスをStubする。
あるクラスの全てのインスタンスを    する。
                    する
mock.instance_of(User).valid? { false }

※ Mocha だと any_instance_of なのでもう少しわかりやすい・・・
Spy サンプルコード
メソッド呼
メソッド呼び出しの記録
       しの記録
rspec
 subject = Object.new
 stub(subject).foo
 subject.foo(1)
 subject.should have_received.foo(1)
 subject.should have_received.bar # this fails
Double graphs
例) 期待 #foo メソッドが呼び出され、その返り値に対して、
   期待:     メソッドが呼   され、その返   して、
#bar メソッドが呼び出される。
     メソッドが呼    される。

object = Object.new
stub(object).foo.stub!.bar{:baz}
object.foo.bar # success and returns :baz
ワイルドカード
anything
 mock(object).foobar(1, anything)
 object.foobar(1, :my_symbol)

is_a
 mock(object).foobar(is_a(Time))
 object.foobar(Time.now)
numeric
 mock(object).foobar(numeric)
 object.foobar(99)

boolean
 mock(object).foobar(boolean)
 object.foobar(false)
duck_type
 mock(object)foobar(duck_type(:walk, :talk))
 arg = Object.new
 def arg.walk; ‘walk’; end
 def arg.talk; ‘talk’; end
 object.foobar(arg) # expects arg has methods, walk and talk.
ワイルドカード
Ranges
 mock(object).foobar(1..10)
 object.foobar(5)

Regexps
 mock(object).foobar(/on/)
 object.foobar(“ruby on rails”)

hash_including
 mock(object).foobar(hash_including(:blue => "#0000FF“, :red => "#FF0000"))
 object.foobar({:red => "#FF0000", :blue => "#0000FF", :green => "#00FF00"})

satify
 mock(object).foobar(satisfy {|arg| arg.length == 2})
 object.foobar("xy")

any_times
 mock(object).method_name(anything).times(any_times) {return_value}
最後に


  実際のコード
 を見てみよう!
参考文献
[1] Test Double at XUnitPatterns.com
http://xunitpatterns.com/Test%20Double.html
[2] テストダブル
http://capsctrl.que.jp/kdmsnr/wiki/bliki/?TestDouble
[3] ricollab Web Tech Blog » Blog Archive » Mock と Stub について
http://blogs.ricollab.jp/webtech/2009/09/mock_and_stub/
[4] brian - Introducing RR
http://pivotallabs.com/users/brian/blog/articles/352-
introducing-rr
[5] An Introduction to Mock Objects in Ruby by James Mead
http://jamesmead.org/talks/2007-07-09-introduction-to-mock-
objects-in-ruby-at-lrug/
[6] RR README.doc
https://gist.github.com/330284/fb3fdbf2dd91a800ed83de37b8d
15ea84c3dd2c8

Weitere ähnliche Inhalte

Was ist angesagt?

劇的改善 CI 4時間から5分へ〜私がやった10のこと〜
劇的改善 CI 4時間から5分へ〜私がやった10のこと〜劇的改善 CI 4時間から5分へ〜私がやった10のこと〜
劇的改善 CI 4時間から5分へ〜私がやった10のこと〜Recruit Lifestyle Co., Ltd.
 
ZabbixのAPIを使って運用を楽しくする話
ZabbixのAPIを使って運用を楽しくする話ZabbixのAPIを使って運用を楽しくする話
ZabbixのAPIを使って運用を楽しくする話Masahito Zembutsu
 
REST API のコツ
REST API のコツREST API のコツ
REST API のコツpospome
 
IPv6って何?(拡張ヘッダ編)
IPv6って何?(拡張ヘッダ編)IPv6って何?(拡張ヘッダ編)
IPv6って何?(拡張ヘッダ編)nemumu
 
.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理KageShiron
 
GraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ることGraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ることShingo Fukui
 
講演資料: コスト最適なプライベートCDNを「NGINX」で実現するWeb最適化セミナー
講演資料: コスト最適なプライベートCDNを「NGINX」で実現するWeb最適化セミナー講演資料: コスト最適なプライベートCDNを「NGINX」で実現するWeb最適化セミナー
講演資料: コスト最適なプライベートCDNを「NGINX」で実現するWeb最適化セミナーNGINX, Inc.
 
Spectacular Future with clojure.spec
Spectacular Future with clojure.specSpectacular Future with clojure.spec
Spectacular Future with clojure.specKent Ohashi
 
Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~Masahito Zembutsu
 
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版Masahiro Nagano
 
がんばれ PHP Fiber
がんばれ PHP Fiberがんばれ PHP Fiber
がんばれ PHP Fiberinfinite_loop
 
今さらだけどMySQLとライセンス
今さらだけどMySQLとライセンス今さらだけどMySQLとライセンス
今さらだけどMySQLとライセンスHidenori Ishii
 
元OracleMasterPlatinumがCloudSpanner触ってみた
元OracleMasterPlatinumがCloudSpanner触ってみた元OracleMasterPlatinumがCloudSpanner触ってみた
元OracleMasterPlatinumがCloudSpanner触ってみたKumano Ryo
 
서버 성능에 대한 정의와 이해
서버 성능에 대한 정의와 이해서버 성능에 대한 정의와 이해
서버 성능에 대한 정의와 이해중선 곽
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
キャパシティ プランニング
キャパシティ プランニングキャパシティ プランニング
キャパシティ プランニング外道 父
 

Was ist angesagt? (20)

劇的改善 CI 4時間から5分へ〜私がやった10のこと〜
劇的改善 CI 4時間から5分へ〜私がやった10のこと〜劇的改善 CI 4時間から5分へ〜私がやった10のこと〜
劇的改善 CI 4時間から5分へ〜私がやった10のこと〜
 
Are Design Patterns Dead?
Are Design Patterns Dead?Are Design Patterns Dead?
Are Design Patterns Dead?
 
ZabbixのAPIを使って運用を楽しくする話
ZabbixのAPIを使って運用を楽しくする話ZabbixのAPIを使って運用を楽しくする話
ZabbixのAPIを使って運用を楽しくする話
 
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
 
REST API のコツ
REST API のコツREST API のコツ
REST API のコツ
 
IPv6って何?(拡張ヘッダ編)
IPv6って何?(拡張ヘッダ編)IPv6って何?(拡張ヘッダ編)
IPv6って何?(拡張ヘッダ編)
 
.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理
 
GraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ることGraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ること
 
gRPC入門
gRPC入門gRPC入門
gRPC入門
 
講演資料: コスト最適なプライベートCDNを「NGINX」で実現するWeb最適化セミナー
講演資料: コスト最適なプライベートCDNを「NGINX」で実現するWeb最適化セミナー講演資料: コスト最適なプライベートCDNを「NGINX」で実現するWeb最適化セミナー
講演資料: コスト最適なプライベートCDNを「NGINX」で実現するWeb最適化セミナー
 
Spectacular Future with clojure.spec
Spectacular Future with clojure.specSpectacular Future with clojure.spec
Spectacular Future with clojure.spec
 
Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~
 
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
 
Db2 V11 GUIツール
Db2 V11 GUIツールDb2 V11 GUIツール
Db2 V11 GUIツール
 
がんばれ PHP Fiber
がんばれ PHP Fiberがんばれ PHP Fiber
がんばれ PHP Fiber
 
今さらだけどMySQLとライセンス
今さらだけどMySQLとライセンス今さらだけどMySQLとライセンス
今さらだけどMySQLとライセンス
 
元OracleMasterPlatinumがCloudSpanner触ってみた
元OracleMasterPlatinumがCloudSpanner触ってみた元OracleMasterPlatinumがCloudSpanner触ってみた
元OracleMasterPlatinumがCloudSpanner触ってみた
 
서버 성능에 대한 정의와 이해
서버 성능에 대한 정의와 이해서버 성능에 대한 정의와 이해
서버 성능에 대한 정의와 이해
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
キャパシティ プランニング
キャパシティ プランニングキャパシティ プランニング
キャパシティ プランニング
 

Ähnlich wie Ruby test double

基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~normalian
 
タダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitタダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitYasuhiko Yamamoto
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)啓 小笠原
 
新しくプログラミング言語・・・Rubyでやってみた
新しくプログラミング言語・・・Rubyでやってみた新しくプログラミング言語・・・Rubyでやってみた
新しくプログラミング言語・・・RubyでやってみたTomoaki Ueda
 
第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめ第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめhakoika-itwg
 
はこだてIKA 第4回勉強会 単体テスト
はこだてIKA 第4回勉強会 単体テストはこだてIKA 第4回勉強会 単体テスト
はこだてIKA 第4回勉強会 単体テストSeiji KOMATSU
 
Sencha ug3 siesta_share
Sencha ug3 siesta_shareSencha ug3 siesta_share
Sencha ug3 siesta_share久司 中村
 
Ruby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::UnitRuby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::Unithigaki
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜JustSystems Corporation
 
あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)Takuya Tsuchida
 
テストコードの定型化
テストコードの定型化テストコードの定型化
テストコードの定型化Shinichi Hirauchi
 
関西Php勉強会のlimeの話
関西Php勉強会のlimeの話関西Php勉強会のlimeの話
関西Php勉強会のlimeの話Hisateru Tanaka
 
C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?Shinichi Hirauchi
 
pi-15. カプセル化, MVCモデル, オブジェクトのマッピング
pi-15. カプセル化, MVCモデル, オブジェクトのマッピングpi-15. カプセル化, MVCモデル, オブジェクトのマッピング
pi-15. カプセル化, MVCモデル, オブジェクトのマッピングkunihikokaneko1
 
Angular.jsについてちょっとしゃべる
Angular.jsについてちょっとしゃべるAngular.jsについてちょっとしゃべる
Angular.jsについてちょっとしゃべるMasashi Haga
 

Ähnlich wie Ruby test double (20)

基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
 
Introduction to Spock
Introduction to SpockIntroduction to Spock
Introduction to Spock
 
タダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitタダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnit
 
Ajax 応用
Ajax 応用Ajax 応用
Ajax 応用
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
新しくプログラミング言語・・・Rubyでやってみた
新しくプログラミング言語・・・Rubyでやってみた新しくプログラミング言語・・・Rubyでやってみた
新しくプログラミング言語・・・Rubyでやってみた
 
Spock's world
Spock's worldSpock's world
Spock's world
 
Spring と TDD
Spring と TDDSpring と TDD
Spring と TDD
 
第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめ第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめ
 
はこだてIKA 第4回勉強会 単体テスト
はこだてIKA 第4回勉強会 単体テストはこだてIKA 第4回勉強会 単体テスト
はこだてIKA 第4回勉強会 単体テスト
 
Sencha ug3 siesta_share
Sencha ug3 siesta_shareSencha ug3 siesta_share
Sencha ug3 siesta_share
 
Ruby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::UnitRuby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::Unit
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
 
Project lambda
Project lambdaProject lambda
Project lambda
 
あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)
 
テストコードの定型化
テストコードの定型化テストコードの定型化
テストコードの定型化
 
関西Php勉強会のlimeの話
関西Php勉強会のlimeの話関西Php勉強会のlimeの話
関西Php勉強会のlimeの話
 
C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?
 
pi-15. カプセル化, MVCモデル, オブジェクトのマッピング
pi-15. カプセル化, MVCモデル, オブジェクトのマッピングpi-15. カプセル化, MVCモデル, オブジェクトのマッピング
pi-15. カプセル化, MVCモデル, オブジェクトのマッピング
 
Angular.jsについてちょっとしゃべる
Angular.jsについてちょっとしゃべるAngular.jsについてちょっとしゃべる
Angular.jsについてちょっとしゃべる
 

Mehr von Naotoshi Seo

ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜
ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜
ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜Naotoshi Seo
 
HTTP/2 でリバプロするだけでグラフツールを 高速化できた話
HTTP/2 でリバプロするだけでグラフツールを 高速化できた話HTTP/2 でリバプロするだけでグラフツールを 高速化できた話
HTTP/2 でリバプロするだけでグラフツールを 高速化できた話Naotoshi Seo
 
Mobage を支える Ruby の技術 ~ 複数DB編 ~
Mobage を支える Ruby の技術 ~ 複数DB編 ~Mobage を支える Ruby の技術 ~ 複数DB編 ~
Mobage を支える Ruby の技術 ~ 複数DB編 ~Naotoshi Seo
 
Fluentd Hacking Guide at RubyKaigi 2014
Fluentd Hacking Guide at RubyKaigi 2014Fluentd Hacking Guide at RubyKaigi 2014
Fluentd Hacking Guide at RubyKaigi 2014Naotoshi Seo
 
InfluxDB の概要 - sonots #tokyoinfluxdb
InfluxDB の概要 - sonots #tokyoinfluxdbInfluxDB の概要 - sonots #tokyoinfluxdb
InfluxDB の概要 - sonots #tokyoinfluxdbNaotoshi Seo
 
Sinatra Pattern 20130415
Sinatra Pattern 20130415Sinatra Pattern 20130415
Sinatra Pattern 20130415Naotoshi Seo
 
Serf という Orchestration ツール #immutableinfra
Serf という Orchestration ツール #immutableinfraSerf という Orchestration ツール #immutableinfra
Serf という Orchestration ツール #immutableinfraNaotoshi Seo
 
Shadow Server on Fluentd at Fluentd Casual Talks #3
Shadow Server on Fluentd at Fluentd Casual Talks #3Shadow Server on Fluentd at Fluentd Casual Talks #3
Shadow Server on Fluentd at Fluentd Casual Talks #3Naotoshi Seo
 
Is ruby logger thread(process)-safe? at RubyConf 2013
Is ruby logger thread(process)-safe? at RubyConf 2013Is ruby logger thread(process)-safe? at RubyConf 2013
Is ruby logger thread(process)-safe? at RubyConf 2013Naotoshi Seo
 
Haikanko rubykaigi 20130531
Haikanko rubykaigi 20130531Haikanko rubykaigi 20130531
Haikanko rubykaigi 20130531Naotoshi Seo
 
Fluentdcasual 02-haikanko
Fluentdcasual 02-haikankoFluentdcasual 02-haikanko
Fluentdcasual 02-haikankoNaotoshi Seo
 
capistrano-colorized-stream
capistrano-colorized-streamcapistrano-colorized-stream
capistrano-colorized-streamNaotoshi Seo
 

Mehr von Naotoshi Seo (14)

ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜
ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜
ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜
 
HTTP/2 でリバプロするだけでグラフツールを 高速化できた話
HTTP/2 でリバプロするだけでグラフツールを 高速化できた話HTTP/2 でリバプロするだけでグラフツールを 高速化できた話
HTTP/2 でリバプロするだけでグラフツールを 高速化できた話
 
Mobage を支える Ruby の技術 ~ 複数DB編 ~
Mobage を支える Ruby の技術 ~ 複数DB編 ~Mobage を支える Ruby の技術 ~ 複数DB編 ~
Mobage を支える Ruby の技術 ~ 複数DB編 ~
 
Fluentd Hacking Guide at RubyKaigi 2014
Fluentd Hacking Guide at RubyKaigi 2014Fluentd Hacking Guide at RubyKaigi 2014
Fluentd Hacking Guide at RubyKaigi 2014
 
InfluxDB の概要 - sonots #tokyoinfluxdb
InfluxDB の概要 - sonots #tokyoinfluxdbInfluxDB の概要 - sonots #tokyoinfluxdb
InfluxDB の概要 - sonots #tokyoinfluxdb
 
Sinatra Pattern 20130415
Sinatra Pattern 20130415Sinatra Pattern 20130415
Sinatra Pattern 20130415
 
Serf という Orchestration ツール #immutableinfra
Serf という Orchestration ツール #immutableinfraSerf という Orchestration ツール #immutableinfra
Serf という Orchestration ツール #immutableinfra
 
Shadow Server on Fluentd at Fluentd Casual Talks #3
Shadow Server on Fluentd at Fluentd Casual Talks #3Shadow Server on Fluentd at Fluentd Casual Talks #3
Shadow Server on Fluentd at Fluentd Casual Talks #3
 
Is ruby logger thread(process)-safe? at RubyConf 2013
Is ruby logger thread(process)-safe? at RubyConf 2013Is ruby logger thread(process)-safe? at RubyConf 2013
Is ruby logger thread(process)-safe? at RubyConf 2013
 
Yohoushi
YohoushiYohoushi
Yohoushi
 
Haikanko rubykaigi 20130531
Haikanko rubykaigi 20130531Haikanko rubykaigi 20130531
Haikanko rubykaigi 20130531
 
Mina 20130417
Mina 20130417Mina 20130417
Mina 20130417
 
Fluentdcasual 02-haikanko
Fluentdcasual 02-haikankoFluentdcasual 02-haikanko
Fluentdcasual 02-haikanko
 
capistrano-colorized-stream
capistrano-colorized-streamcapistrano-colorized-stream
capistrano-colorized-stream
 

Ruby test double