SlideShare a Scribd company logo
1 of 50
Download to read offline
2013年6月15日
Ruby初級者向けレッスン 46回
— Test::Unit —
ひがき @ Ruby関西
お品書き
• テスト フレームワーク
• テスト駆動開発
– Red–Green–Refactor
• Test::Unit の小技
• Test Double
テスト フレームワーク いろいろ
• Test::Unit
• RSpec
• Cucumber
• Capybara
• etc.
Test::Unit
• プログラムの単体テストを行う
• Ruby用の xUnit
– MiniTest::Unit — 標準添付
– Test::Unit — 標準添付
∗ 内部で MiniTest::Unit を使用
– Test::Unit Gem
RSpec
• プログラムの振舞いを記述する (BDD)
• ドメイン特化言語 (DSL)
• 参考
– http://jp.rubyist.net/
magazine/?0021-Rspec
Cucumber (::)
• 自然言語に近い形式で書ける
• 受け入れテスト向け
• これからは Turnip なの?
http://magazine.rubyist.net/
?0042-FromCucumberToTurnip
Capybara
• Webアプリケーション向け
– ブラウザ上のユーザ操作
– JavaScript
自動テストのメリット
• 機能的な保証
– バグの検出
– バグ混入を監視
• 開発支援
– 不安を解消
– リファクタリング
テスト駆動開発
1. まずテストを書き、失敗することを確認する
2. テストが成功するように、製品コードを書く
3. テストはそのまま、コードをきれいに
Red–Green–Refactor
テスト プロダクト
Red Green
Refactor
-
?
テスト駆動開発をやってみよう
• プロダクトコード — myarray.rb
• テストコード — test myarray.rb
• MyArray が空のとき
MyArray#empty? は真であるべき
Step 0 プロダクト
class MyArray
def initialize
@array = []
end
end
Step 0 テスト
require ’test/unit’
require ’./myarray’
class TestMyArray  Test::Unit::TestCase
def setup
@array = MyArray.new
end
def test_empty_by_empty_myarray
assert(@array.empty?)
end
end
テストのながれ
テストごとに、以下を実行する。
1. setup — 準備
2. test ∼ — テスト本体
3. teardown — 後始末
• テストの実行順序は無保証
• 各テストは他のテストに依存してはいけない
Step 0 ERROR 実行
$ ruby test_myarray.rb
...
E
===================================================
Error: test_empty_by_empty_myarray(TestMyArray)
NoMethodError: undefined method ‘empty?’ for
#MyArray:0x802ea72c @array=[]
test_myarray.rb:12:in ‘test_empty_by_empty_myarray’
...
1 tests, 0 assertions, 0 failures, 1 errors,
0 pendings, 0 omissions, 0 notifications
Step 1 プロダクト
class MyArray
def initialize
@array = []
end
def empty? # = 追加
end # = 追加
end
Step 1 Red 実行
$ ruby test_myarray.rb
...
F
===================================================
Failure: nil is not true.
test_empty_by_empty_myarray(TestMyArray)
test_myarray.rb:12:in ‘test_empty_by_empty_myarray’
...
1 tests, 1 assertions, 1 failures, 0 errors,
0 pendings, 0 omissions, 0 notifications
Step 2 プロダクト
class MyArray
def initialize
@array = []
end
def empty?
true # = 追加
end
end
Step 2 Fake it! 実行
$ ruby test_myarray.rb
Loaded suite test_myarray
Started
.
Finished in 0.000942 seconds.
1 tests, 1 assertions, 0 failures, 0 errors,
0 pendings, 0 omissions, 0 notifications
100% passed
assert
式が真なら、テストが通る。
assert(.empty?, 空であること)
assert(obj.nil?, nil であること)
assert equal
第1引数 == 第2引数 なら、テストが通る。
assert_equal(0, array.size)
assert_equal(’matz’, author)
assert_equal(0.3, 0.2 + 0.1, Fail!!)
Fail!!
0.3 expected but was
0.30000000000000004
assert in epsilon
第1引数と第2引数の誤差が
第3引数の許容範囲内なら、テストが通る。
assert_in_epsilon(0.3, 0.2 + 0.1, 1e-15)
assert raise
ブロック内で、第1引数の例外が発生したら、
テストが通る。
ex = assert_raise(IndexError) do
[].fetch(0)
end
Step 3 プロダクト
class MyArray
...
def empty?
true # = Fake it!
end
def  o # = 追加
@array  o # = 追加
self # = 追加
end # = 追加
end
Step 3 テスト
...
class TestMyArray  Test::Unit::TestCase
...
def test_empty_by_empty_myarray
assert(@array.empty?)
end
def test_empty_by_nonempty_myarray # = 追加
@array  1st # = 追加
assert(!@array.empty?) # = 追加
end # = 追加
end
Step 3 Triangulate 実行
$ ruby test_myarray.rb
...
.F
===================================================
Failure: false is not true.
test_empty_by_nonempty_myarray(TestMyArray)
test_myarray.rb:17:in ‘test_empty_by_nonempty_myarra
...
2 tests, 2 assertions, 1 failures, 0 errors,
0 pendings, 0 omissions, 0 notifications
Step 4 プロダクト
class MyArray
...
def empty?
@array.empty? # = 修正
end
def  o
@array  o
self
end
end
Step 4 Green 実行
$ ruby test_myarray.rb
Loaded suite test_myarray
Started
..
Finished in 0.00123 seconds.
2 tests, 2 assertions, 0 failures, 0 errors,
0 pendings, 0 omissions, 0 notifications
100% passed
小技 --help
$ ruby test_myarray.rb --help
Test::Unit automatic runner.
Usage: test_myarray.rb [options] [-- untouched argum
-r, --runner=RUNNER Use the given RUNNE
--collector=COLLECTOR Use the given COLLE
--ignore-name=NAME Ignores tests match
-t, --testcase=TESTCASE Runs tests in TestC
...
-h, --help Display this help.
Deprecated options:
--console Console runner (use
小技 --verbose
$ ruby test_myarray.rb --verbose
Loaded suite test_myarray
Started
TestMyArray:
test_empty_by_empty_myarray: .: (0.000630)
test_empty_by_nonempty_myarray: .: (0.000499)
Finished in 0.001676 seconds.
2 tests, 2 assertions, 0 failures, 0 errors,
0 pendings, 0 omissions, 0 notifications
100% passed
小技 テストの指定
$ ruby test_myarray.rb -v -n /_non/
Loaded suite test_myarray
Started
TestMyArray:
test_empty_by_nonempty_myarray: .: (0.000499)
Finished in 0.000892 seconds.
1 tests, 1 assertions, 0 failures, 0 errors,
0 pendings, 0 omissions, 0 notifications
100% passed
こんなときどうする
require ’person’
class TestPerson  Test::Unit::TestCase
def test_age
matz = Person.new(
’matz’, Time.local(1965, 4, 14))
assert_equal(48, matz.age)
# 来年はテストに失敗する!?
end
end
Test Double
• テスト対象 (プロダクト) が依存している
コンポーネントを置き換える
– ダミーオブジェクト
– テストスタブ
– テストスパイ
– モックオブジェクト
– フェイクオブジェクト
http://goyoki.hatenablog.com/entry/
20120301/1330608789
例えば影武者を使う
require ’kagemusha/time’
class TestPerson  Test::Unit::TestCase
def test_age
matz = Person.new(
’matz’, Time.local(1965, 4, 14))
Kagemusha::Time.at(2013, 6, 15) do
assert_equal(48, matz.age)
end
end
end
もしくは Mocha を使う
require ’mocha/setup’
class TestPerson  Test::Unit::TestCase
def test_age
matz = Person.new(
’matz’, Time.local(1965, 4, 14))
Time.stubs(:now)
.returns(Time.local(2013, 6, 15))
assert_equal(48, matz.age)
end
end
あるいは RR を使う
require ’rr’
class TestPerson  Test::Unit::TestCase
def test_age
matz = Person.new(
’matz’, Time.local(1965, 4, 14))
mock(Time).now{Time.local(2013, 6, 15)}
assert_equal(48, matz.age)
end
end
まとめ
• テスト フレームワーク
• テスト駆動開発
– Red–Green–Refactor
• Test::Unit の小技
• Test Double
演習問題 0
今日のレッスンで分からなかったこと、疑問に
思ったことをグループで話し合ってみよう。
演習問題 1
• スタッククラスを作ろう!
– テスト駆動開発で「スタック」クラスを作っ
てみよう。
– push で順に要素を追加できること。
– pop で最後から順に要素を取り出せること。
– このような動作を LIFO (Last In, First
Out) という。
実装するメソッド
• empty?
– スタックが空なら真、空でなければ偽を返す。
• size
– スタックの要素数を返す。
• push(val)
– 引数の値をスタックの最後に積む
• pop
– スタックの最後の値を取り除いて返す。
– スタックが空ならStack::EmptyStackErrorを発生さ
せる。
Step 1 empty?
• 新しいスタックの empty? は真であること。
• テストが失敗することを確認しよう。Red
• Stack#empty? で真を返そう。Fake it!
Step 2 push pop
• 新しいスタックに 3 を push して、
pop すると 3が返ること。
• テストが失敗することを確認しよう。Red
• pop で 3 を返そう。Fake it!
Step 3 size
• 新しいスタックに 3 を push すると
size が 1 になること。
• テストが失敗することを確認しよう。Red
• Stack#size で 1 を返そう。Fake it!
Step 4 size
• 新しいスタックに 3 を push した後、
5 を push すると size が 2 になること。
• Fake it! が通らなくなることを確認しよう。
Triangulate
• テストが通るように修正しよう。
Step 5 empty?
• 新しいスタックに 3 を push すると
empty? は偽であること。
• Fake it! が通らなくなることを確認しよう。
Triangulate
• テストが通るように修正しよう。
Step 6 pop
• 新しいスタックから pop すると
Stack::EmptyStackErrorが発生すること。
Step 7 pop
• 新しいスタックに 3 を push した後、5 を
push し、pop すると size が 1 であること。
Step 8 pop
• 新しいスタックに 3 を push した後、
5 を push し、pop すると 5 が返ること。
自己紹介
• 名前 (ニックネーム)
• 普段の仕事・研究内容・代表作
• Ruby歴・コンピュータ歴
• 勉強会に来た目的
• などなど
参考
• るりま
http://doc.ruby-lang.org/ja/
• サンプルコード
https://github.com/higaki/
learn ruby kansai 58
• XP祭り関西にてユニットテストの
保守に関する発表
http://goyoki.hatenablog.com/entry/
20110202/1296663870

More Related Content

What's hot

xUnit Test Patterns - Chapter16
xUnit Test Patterns - Chapter16xUnit Test Patterns - Chapter16
xUnit Test Patterns - Chapter16Takuto Wada
 
ありえるえりあ勉強会@五反田~テスト編~ Part3
ありえるえりあ勉強会@五反田~テスト編~ Part3ありえるえりあ勉強会@五反田~テスト編~ Part3
ありえるえりあ勉強会@五反田~テスト編~ Part3Tomoyuki Sato
 
gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)tnoda
 
Unit test in android
Unit test in androidUnit test in android
Unit test in androidTatsuya Maki
 
xUTP Chapter19 (2). Testcase Class
xUTP Chapter19 (2). Testcase ClassxUTP Chapter19 (2). Testcase Class
xUTP Chapter19 (2). Testcase ClassTakuto Wada
 
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...なおき きしだ
 
xUTP Chapter26. Dependency Injection
xUTP Chapter26. Dependency InjectionxUTP Chapter26. Dependency Injection
xUTP Chapter26. Dependency InjectionTakuto Wada
 
Let s database_testing
Let s database_testingLet s database_testing
Let s database_testingYuji Shimada
 
Xtend30分クッキング
Xtend30分クッキングXtend30分クッキング
Xtend30分クッキングShinichi Kozake
 
あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)Takuya Tsuchida
 

What's hot (18)

xUnit Test Patterns - Chapter16
xUnit Test Patterns - Chapter16xUnit Test Patterns - Chapter16
xUnit Test Patterns - Chapter16
 
講座Java入門
講座Java入門講座Java入門
講座Java入門
 
Junit4
Junit4Junit4
Junit4
 
Akka Unit Testing
Akka Unit TestingAkka Unit Testing
Akka Unit Testing
 
Effective Java 輪読会 項目53-56
Effective Java 輪読会 項目53-56Effective Java 輪読会 項目53-56
Effective Java 輪読会 項目53-56
 
ありえるえりあ勉強会@五反田~テスト編~ Part3
ありえるえりあ勉強会@五反田~テスト編~ Part3ありえるえりあ勉強会@五反田~テスト編~ Part3
ありえるえりあ勉強会@五反田~テスト編~ Part3
 
131026 kansai-emacs
131026 kansai-emacs131026 kansai-emacs
131026 kansai-emacs
 
gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)
 
Unit test in android
Unit test in androidUnit test in android
Unit test in android
 
xUTP Chapter19 (2). Testcase Class
xUTP Chapter19 (2). Testcase ClassxUTP Chapter19 (2). Testcase Class
xUTP Chapter19 (2). Testcase Class
 
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
 
Spock's world
Spock's worldSpock's world
Spock's world
 
xUTP Chapter26. Dependency Injection
xUTP Chapter26. Dependency InjectionxUTP Chapter26. Dependency Injection
xUTP Chapter26. Dependency Injection
 
Let s database_testing
Let s database_testingLet s database_testing
Let s database_testing
 
Xtend30分クッキング
Xtend30分クッキングXtend30分クッキング
Xtend30分クッキング
 
あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)
 
Go guide for Java programmer
Go guide for Java programmerGo guide for Java programmer
Go guide for Java programmer
 
Clojrue 13 testing
Clojrue 13 testingClojrue 13 testing
Clojrue 13 testing
 

Similar to Ruby初級者向けレッスン 第46回 ─── Test::Unit

Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodAtsuhiro Kubo
 
タダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitタダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitYasuhiko Yamamoto
 
第5回勉強会
第5回勉強会第5回勉強会
第5回勉強会Mugen Fujii
 
Test Retrospective #kyon_kao_wedding in Tokyo
Test Retrospective #kyon_kao_wedding in TokyoTest Retrospective #kyon_kao_wedding in Tokyo
Test Retrospective #kyon_kao_wedding in Tokyokyon mm
 
第4回勉強会 Groovyの文法からSpockまで
第4回勉強会 Groovyの文法からSpockまで第4回勉強会 Groovyの文法からSpockまで
第4回勉強会 Groovyの文法からSpockまでMugen Fujii
 
Gradleどうでしょう
GradleどうでしょうGradleどうでしょう
GradleどうでしょうTakuma Watabiki
 
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発Kentaro Ohkouchi
 
継承を用いたコードのテスト
継承を用いたコードのテスト継承を用いたコードのテスト
継承を用いたコードのテストYu Kobayashi
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaYuta Kawadai
 
ソフトウェア工学2023 11 テスト
ソフトウェア工学2023 11 テストソフトウェア工学2023 11 テスト
ソフトウェア工学2023 11 テストToru Tamaki
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜JustSystems Corporation
 
C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?Shinichi Hirauchi
 
Getting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitGetting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitAtsuhiro Kubo
 
テスティングフレームワークに入門してみた - Swift編
テスティングフレームワークに入門してみた - Swift編テスティングフレームワークに入門してみた - Swift編
テスティングフレームワークに入門してみた - Swift編Hisakuni Fujimoto
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめYu Nobuoka
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタートShumpei Shiraishi
 

Similar to Ruby初級者向けレッスン 第46回 ─── Test::Unit (20)

Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGood
 
タダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitタダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnit
 
Ruby test double
Ruby test doubleRuby test double
Ruby test double
 
Introduction to Spock
Introduction to SpockIntroduction to Spock
Introduction to Spock
 
第5回勉強会
第5回勉強会第5回勉強会
第5回勉強会
 
Test Retrospective #kyon_kao_wedding in Tokyo
Test Retrospective #kyon_kao_wedding in TokyoTest Retrospective #kyon_kao_wedding in Tokyo
Test Retrospective #kyon_kao_wedding in Tokyo
 
第4回勉強会 Groovyの文法からSpockまで
第4回勉強会 Groovyの文法からSpockまで第4回勉強会 Groovyの文法からSpockまで
第4回勉強会 Groovyの文法からSpockまで
 
Gradleどうでしょう
GradleどうでしょうGradleどうでしょう
Gradleどうでしょう
 
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発
 
継承を用いたコードのテスト
継承を用いたコードのテスト継承を用いたコードのテスト
継承を用いたコードのテスト
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for Java
 
ソフトウェア工学2023 11 テスト
ソフトウェア工学2023 11 テストソフトウェア工学2023 11 テスト
ソフトウェア工学2023 11 テスト
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
 
C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?
 
Getting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitGetting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnit
 
テスティングフレームワークに入門してみた - Swift編
テスティングフレームワークに入門してみた - Swift編テスティングフレームワークに入門してみた - Swift編
テスティングフレームワークに入門してみた - Swift編
 
Phantom Type in Scala
Phantom Type in ScalaPhantom Type in Scala
Phantom Type in Scala
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
 
Tdd
TddTdd
Tdd
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタート
 

More from higaki

Ruby初級者向けレッスン 56回 ─── ブロック
Ruby初級者向けレッスン 56回 ─── ブロックRuby初級者向けレッスン 56回 ─── ブロック
Ruby初級者向けレッスン 56回 ─── ブロックhigaki
 
Ruby初級者向けレッスン KOF2015 出張版
Ruby初級者向けレッスン KOF2015 出張版Ruby初級者向けレッスン KOF2015 出張版
Ruby初級者向けレッスン KOF2015 出張版higaki
 
Ruby初級者向けレッスン 55回 ─── 例外
Ruby初級者向けレッスン 55回 ─── 例外Ruby初級者向けレッスン 55回 ─── 例外
Ruby初級者向けレッスン 55回 ─── 例外higaki
 
Ruby初級者向けレッスン 54回 ─── クラス
Ruby初級者向けレッスン 54回 ─── クラスRuby初級者向けレッスン 54回 ─── クラス
Ruby初級者向けレッスン 54回 ─── クラスhigaki
 
Ruby初級者向けレッスン 53回 ─── Array と Hash
Ruby初級者向けレッスン  53回 ─── Array と HashRuby初級者向けレッスン  53回 ─── Array と Hash
Ruby初級者向けレッスン 53回 ─── Array と Hashhigaki
 
初級者向けレッスン 52回 ─── 文字列
初級者向けレッスン 52回 ─── 文字列初級者向けレッスン 52回 ─── 文字列
初級者向けレッスン 52回 ─── 文字列higaki
 
初級者向けレッスン 51回 ─── 例外
初級者向けレッスン 51回 ─── 例外初級者向けレッスン 51回 ─── 例外
初級者向けレッスン 51回 ─── 例外higaki
 
Ruby初級者向けレッスン 50回 ─── ブロック
Ruby初級者向けレッスン 50回 ─── ブロックRuby初級者向けレッスン 50回 ─── ブロック
Ruby初級者向けレッスン 50回 ─── ブロックhigaki
 
PHPer のための Ruby 教室
PHPer のための Ruby 教室PHPer のための Ruby 教室
PHPer のための Ruby 教室higaki
 
Ruby 初級者向けレッスン 49回───クラス
Ruby 初級者向けレッスン 49回───クラスRuby 初級者向けレッスン 49回───クラス
Ruby 初級者向けレッスン 49回───クラスhigaki
 
Ruby初級者向けレッスン 48回 ─── Array と Hash
Ruby初級者向けレッスン 48回 ─── Array と HashRuby初級者向けレッスン 48回 ─── Array と Hash
Ruby初級者向けレッスン 48回 ─── Array と Hashhigaki
 
Ruby初級者向けレッスン 47回 ─── 文字列
Ruby初級者向けレッスン 47回 ─── 文字列Ruby初級者向けレッスン 47回 ─── 文字列
Ruby初級者向けレッスン 47回 ─── 文字列higaki
 
ジュンク堂書店の方から来ました
ジュンク堂書店の方から来ましたジュンク堂書店の方から来ました
ジュンク堂書店の方から来ましたhigaki
 
Ruby初級者向けレッスン 45回 ─── 例外
Ruby初級者向けレッスン 45回 ─── 例外Ruby初級者向けレッスン 45回 ─── 例外
Ruby初級者向けレッスン 45回 ─── 例外higaki
 

More from higaki (14)

Ruby初級者向けレッスン 56回 ─── ブロック
Ruby初級者向けレッスン 56回 ─── ブロックRuby初級者向けレッスン 56回 ─── ブロック
Ruby初級者向けレッスン 56回 ─── ブロック
 
Ruby初級者向けレッスン KOF2015 出張版
Ruby初級者向けレッスン KOF2015 出張版Ruby初級者向けレッスン KOF2015 出張版
Ruby初級者向けレッスン KOF2015 出張版
 
Ruby初級者向けレッスン 55回 ─── 例外
Ruby初級者向けレッスン 55回 ─── 例外Ruby初級者向けレッスン 55回 ─── 例外
Ruby初級者向けレッスン 55回 ─── 例外
 
Ruby初級者向けレッスン 54回 ─── クラス
Ruby初級者向けレッスン 54回 ─── クラスRuby初級者向けレッスン 54回 ─── クラス
Ruby初級者向けレッスン 54回 ─── クラス
 
Ruby初級者向けレッスン 53回 ─── Array と Hash
Ruby初級者向けレッスン  53回 ─── Array と HashRuby初級者向けレッスン  53回 ─── Array と Hash
Ruby初級者向けレッスン 53回 ─── Array と Hash
 
初級者向けレッスン 52回 ─── 文字列
初級者向けレッスン 52回 ─── 文字列初級者向けレッスン 52回 ─── 文字列
初級者向けレッスン 52回 ─── 文字列
 
初級者向けレッスン 51回 ─── 例外
初級者向けレッスン 51回 ─── 例外初級者向けレッスン 51回 ─── 例外
初級者向けレッスン 51回 ─── 例外
 
Ruby初級者向けレッスン 50回 ─── ブロック
Ruby初級者向けレッスン 50回 ─── ブロックRuby初級者向けレッスン 50回 ─── ブロック
Ruby初級者向けレッスン 50回 ─── ブロック
 
PHPer のための Ruby 教室
PHPer のための Ruby 教室PHPer のための Ruby 教室
PHPer のための Ruby 教室
 
Ruby 初級者向けレッスン 49回───クラス
Ruby 初級者向けレッスン 49回───クラスRuby 初級者向けレッスン 49回───クラス
Ruby 初級者向けレッスン 49回───クラス
 
Ruby初級者向けレッスン 48回 ─── Array と Hash
Ruby初級者向けレッスン 48回 ─── Array と HashRuby初級者向けレッスン 48回 ─── Array と Hash
Ruby初級者向けレッスン 48回 ─── Array と Hash
 
Ruby初級者向けレッスン 47回 ─── 文字列
Ruby初級者向けレッスン 47回 ─── 文字列Ruby初級者向けレッスン 47回 ─── 文字列
Ruby初級者向けレッスン 47回 ─── 文字列
 
ジュンク堂書店の方から来ました
ジュンク堂書店の方から来ましたジュンク堂書店の方から来ました
ジュンク堂書店の方から来ました
 
Ruby初級者向けレッスン 45回 ─── 例外
Ruby初級者向けレッスン 45回 ─── 例外Ruby初級者向けレッスン 45回 ─── 例外
Ruby初級者向けレッスン 45回 ─── 例外
 

Ruby初級者向けレッスン 第46回 ─── Test::Unit