SlideShare a Scribd company logo
1 of 33
Download to read offline
こんなTDDも ありかもね 2013/07/27てらひで
この資料は 2013/07/27 に行われたTDDBCTokyoの懇親会で行っ たLTを再編成したもの です
てらひで@terahide27 認定スクラムマスター アジャイルコーチ アーキテクト
てらひで@terahide27http://gigazine.net/news/20130601-anime-2013summer/ 深夜アニメの カバレッジ90%以上
本題
翠田あい 
@AiMidorita
VBAでも TDD!
xUnit?
VBAUnit があるんだなw
だけど今日は 使いません
標準機能
Debug.Assert
やってみよう
Alt+F11 
Excelを開いて、VBEditorを開きます
メニュー→ 挿入→ 標準モジュール 
Option Explicit 
Sub いちに2を加えると3になるべき() 
Dim Calc As New Calc 
Debug.Assert Calc.Add(1, 2) = 3 
End Sub 
サブプロシージャ名は数 字から始められないの で平仮名の「いち」
標準モジュールのテストにカーソルをあててF5 
黄色くなった!
クラスモジュールを修正(明白な実装) 
Option Explicit 
Function add( 
i1 As Integer, 
i2 As Integer) As Integer 
add = i1 + i2 
End Function 
Calc 
仮実装は省略!
標準モジュールのテストにカーソルをあててF5 
白くなった!
ちょっとリファクタ。イミディェイトに表示 
Option Explicit 
Sub いちに2を加えると3になるべき() 
Dim CalcAs New Calc 
Dim actual As Integer 
actual = Calc.add(1, 2) 
Debug.Assertactual = 3 
Debug.Printactual 
End Sub
テストスイート も作れる! たぶん。。。
やってみた
クラスモジュール TestSuite.cls を追加
Option Explicit 
''usage 
''Sub allTest() 
'' Dim TestSuite As New TestSuite 
'' 
'' With TestSuite 
'' .testAll 
'' '.testAll ("test") 'procedurePrefix 
'' '.testAll (procedurePrefix =:"test", modeulePrefix :="テスト") 
'' End With 
'' 
''End Sub 
Private Const VBEXT_CT_STDMODULE As Integer = 1 
Public Sub testAll(Optional procedurePrefix As String = "", Optional modeulePrefix As String = "test") 
Dim subProcedureNames As Collection 'Collection<String> 
Set subProcedureNames = getSubProcedureNames(modeulePrefix) 
Dim subProcedureName As String 
Dim v 
For Each v In subProcedureNames 
subProcedureName = v 
If Not isEmpty(procedurePrefix) Then 
If Not startWith(subProcedureName, procedurePrefix) Then 
GoTo continue 
End If 
End If 
Application.Run ThisWorkbook.Name & "!" & subProcedureName 
continue: 
Next 
End Sub
Private Function getSubProcedureNames(modeulePrefix As String) As Collection 'Collection<String> 
Dim modules As Collection 'Collection<VBComponent> 
Dim subProcedureNames As New Collection 'Collection<String> 
Dim VBComponent As Object 
Set modules = getModules(modeulePrefix) 
Dim v 
Dim i 
Dim subProcedureName As String 
For Each v In modules 
Set VBComponent = v 
With VBComponent.CodeModule 
For i = 1 To .CountOfLines 
subProcedureName = .ProcOfLine(i, 0) 
If isEmpty(subProcedureName) Then 
GoTo continue 
End If 
If contains(subProcedureNames, subProcedureName) Then 
GoTo continue 
End If 
subProcedureNames.add subProcedureName 
continue: 
Next i 
End With 
Next 
Set getSubProcedureNames = subProcedureNames 
End Function
Private Function getModules(modeulePrefix As String) As Collection 'Collection<VBComponent> 
Dim col As New Collection 
Dim VBComponent As Object 
Dim v 
For Each v In ThisWorkbook.VBProject.VBComponents 
Set VBComponent = v 
With VBComponent 
If .Type <> VBEXT_CT_STDMODULE Then 
GoTo continue: 
End If 
If Not startWith(.Name, modeulePrefix) Then 
GoTo continue: 
End If 
col.add VBComponent 
End With 
continue: 
Next 
Set getModules = col 
End Function 
Private Function contains(col As Collection, value) As Boolean 
Dim v 
For Each v In col 
If v = value Then 
contains = True 
Exit Function 
End If 
Next 
End Function 
Private Function isEmpty(s As String) As Boolean 
If s = "" Then 
isEmpty = True 
End If 
End Function 
Private Function startWith(s As String, prefix As String) As Boolean 
If InStr(1, s, prefix) = 1 Then 
startWith = True 
End If 
End Function
さっきの 
モジュール名と 
サブプロシージャ名の 
先頭にtestを追加
標準モジュールのテストにカーソルをあててF5 
Sub allTest() 
Dim TestSuiteAs New TestSuite 
With TestSuite 
.testAll("test") 
End With 
End Sub 
クリアしておきましょう
標準モジュールのテストにカーソルをあててF5
Excelのメニュー→ファイル→オプション→セキュ リティセンター 
クリック
マクロの設定→VBAプロジェクトオブジェクトモ デルへのアクセスを信頼する 
注意! 
この設定によりマクロウイルス に感染しても筆者は一切の責 任を負いません
標準モジュールのテストにカーソルをあててF5 
実行されました 
テストのサブプロシー ジャを追加して実行し てみましょう!
Excelのメニュー→ファイル→オプション→セキュ リティセンターの設定を戻しておきましょう 
クリック 
チェックを はずす

More Related Content

What's hot

C++ Template Metaprogramming
C++ Template MetaprogrammingC++ Template Metaprogramming
C++ Template MetaprogrammingAkira Takahashi
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターンMoriharu Ohzu
 
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)Akihiko Matuura
 
超LINQ入門
超LINQ入門超LINQ入門
超LINQ入門yone64
 

What's hot (7)

C++ Template Metaprogramming
C++ Template MetaprogrammingC++ Template Metaprogramming
C++ Template Metaprogramming
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターン
 
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
 
Simo Tutrial
Simo TutrialSimo Tutrial
Simo Tutrial
 
Simo Tutrial
Simo TutrialSimo Tutrial
Simo Tutrial
 
超LINQ入門
超LINQ入門超LINQ入門
超LINQ入門
 
C++の黒魔術
C++の黒魔術C++の黒魔術
C++の黒魔術
 

Similar to Vbaでもtdd

Template method #dezapatan
Template method #dezapatanTemplate method #dezapatan
Template method #dezapatankuidaoring
 
復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0Yuta Matsumura
 
はじめてのPython
はじめてのPythonはじめてのPython
はじめてのPythonKatsumi Honda
 
mobylet ケータイサイト30分クッキング
mobylet ケータイサイト30分クッキングmobylet ケータイサイト30分クッキング
mobylet ケータイサイト30分クッキングShin Takeuchi
 
メタプログラミングRubyはこの付録が美味しい
メタプログラミングRubyはこの付録が美味しいメタプログラミングRubyはこの付録が美味しい
メタプログラミングRubyはこの付録が美味しいShigeru UCHIYAMA
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回Tomoya Kawanishi
 
Essential Scala 第5章 シーケンス処理
Essential Scala 第5章 シーケンス処理Essential Scala 第5章 シーケンス処理
Essential Scala 第5章 シーケンス処理Takuya Tsuchida
 
Ec cubeの基礎からcms連携まで
Ec cubeの基礎からcms連携までEc cubeの基礎からcms連携まで
Ec cubeの基礎からcms連携までMakoto Nishimura
 
RubyとActive Support for expert 2
RubyとActive Support for expert 2RubyとActive Support for expert 2
RubyとActive Support for expert 2xibbar
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPAkira Takahashi
 
GroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackGroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackTakahiro Yoshimura
 
GoF デザインパターン 2009
GoF デザインパターン 2009GoF デザインパターン 2009
GoF デザインパターン 2009miwarin
 
怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01nagachika t
 
Learning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.GeomtryLearning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.GeomtryAkira Takahashi
 
ASP.NET MVC 2 ~新機能の紹介~
ASP.NET MVC 2 ~新機能の紹介~ASP.NET MVC 2 ~新機能の紹介~
ASP.NET MVC 2 ~新機能の紹介~Yoshitaka Seo
 

Similar to Vbaでもtdd (19)

Template method #dezapatan
Template method #dezapatanTemplate method #dezapatan
Template method #dezapatan
 
復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0
 
はじめてのPython
はじめてのPythonはじめてのPython
はじめてのPython
 
mobylet ケータイサイト30分クッキング
mobylet ケータイサイト30分クッキングmobylet ケータイサイト30分クッキング
mobylet ケータイサイト30分クッキング
 
Teclab3
Teclab3Teclab3
Teclab3
 
emc++ chapter32
emc++ chapter32emc++ chapter32
emc++ chapter32
 
Ruby test double
Ruby test doubleRuby test double
Ruby test double
 
メタプログラミングRubyはこの付録が美味しい
メタプログラミングRubyはこの付録が美味しいメタプログラミングRubyはこの付録が美味しい
メタプログラミングRubyはこの付録が美味しい
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回
 
Essential Scala 第5章 シーケンス処理
Essential Scala 第5章 シーケンス処理Essential Scala 第5章 シーケンス処理
Essential Scala 第5章 シーケンス処理
 
Ec cubeの基礎からcms連携まで
Ec cubeの基礎からcms連携までEc cubeの基礎からcms連携まで
Ec cubeの基礎からcms連携まで
 
RubyとActive Support for expert 2
RubyとActive Support for expert 2RubyとActive Support for expert 2
RubyとActive Support for expert 2
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
 
GroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackGroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hack
 
What is template
What is templateWhat is template
What is template
 
GoF デザインパターン 2009
GoF デザインパターン 2009GoF デザインパターン 2009
GoF デザインパターン 2009
 
怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01
 
Learning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.GeomtryLearning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.Geomtry
 
ASP.NET MVC 2 ~新機能の紹介~
ASP.NET MVC 2 ~新機能の紹介~ASP.NET MVC 2 ~新機能の紹介~
ASP.NET MVC 2 ~新機能の紹介~
 

More from terahide

オレオレになりがちなテスト計画を見直した話
オレオレになりがちなテスト計画を見直した話オレオレになりがちなテスト計画を見直した話
オレオレになりがちなテスト計画を見直した話terahide
 
和服を普段着にするようになって気づいたアジャイルの心
和服を普段着にするようになって気づいたアジャイルの心和服を普段着にするようになって気づいたアジャイルの心
和服を普段着にするようになって気づいたアジャイルの心terahide
 
Management3.0のワークを受けてから会社の偉い人へ M3.0のワークショップをするまでにやったこと
Management3.0のワークを受けてから会社の偉い人へM3.0のワークショップをするまでにやったことManagement3.0のワークを受けてから会社の偉い人へM3.0のワークショップをするまでにやったこと
Management3.0のワークを受けてから会社の偉い人へ M3.0のワークショップをするまでにやったことterahide
 
一番アジャイルな料理人はソーマくんだと思うんだ
一番アジャイルな料理人はソーマくんだと思うんだ一番アジャイルな料理人はソーマくんだと思うんだ
一番アジャイルな料理人はソーマくんだと思うんだterahide
 
受託開発でテストファーストしたらXXXを早期発見できてハイアジリティになったはなし
受託開発でテストファーストしたらXXXを早期発見できてハイアジリティになったはなし受託開発でテストファーストしたらXXXを早期発見できてハイアジリティになったはなし
受託開発でテストファーストしたらXXXを早期発見できてハイアジリティになったはなしterahide
 
オフショアだから失敗したの?~誤解だらけのオフショアと、アジャイルの再発見~
オフショアだから失敗したの?~誤解だらけのオフショアと、アジャイルの再発見~オフショアだから失敗したの?~誤解だらけのオフショアと、アジャイルの再発見~
オフショアだから失敗したの?~誤解だらけのオフショアと、アジャイルの再発見~terahide
 
Springのプログラムモデルと動く仕様~テスト編~
Springのプログラムモデルと動く仕様~テスト編~Springのプログラムモデルと動く仕様~テスト編~
Springのプログラムモデルと動く仕様~テスト編~terahide
 
Spring bootで学ぶ初めてのwebアプリ開発
Spring bootで学ぶ初めてのwebアプリ開発Spring bootで学ぶ初めてのwebアプリ開発
Spring bootで学ぶ初めてのwebアプリ開発terahide
 
明日に繋がるふり返りのプラクティス
明日に繋がるふり返りのプラクティス明日に繋がるふり返りのプラクティス
明日に繋がるふり返りのプラクティスterahide
 
ふりかえり
ふりかえりふりかえり
ふりかえりterahide
 
データモデルは時空を越える
データモデルは時空を越えるデータモデルは時空を越える
データモデルは時空を越えるterahide
 
ももたろう
ももたろうももたろう
ももたろうterahide
 
Sierのアジャイルとジレンマとパラダイムシフト
SierのアジャイルとジレンマとパラダイムシフトSierのアジャイルとジレンマとパラダイムシフト
Sierのアジャイルとジレンマとパラダイムシフトterahide
 
脱Java初心者を目指すときに読むといいと思う本を考える会
脱Java初心者を目指すときに読むといいと思う本を考える会脱Java初心者を目指すときに読むといいと思う本を考える会
脱Java初心者を目指すときに読むといいと思う本を考える会terahide
 
再入門!RESTとSpringMVC
再入門!RESTとSpringMVC再入門!RESTとSpringMVC
再入門!RESTとSpringMVCterahide
 
SGT2014 横浜道場 始めよう!インセプションデッキ
SGT2014 横浜道場 始めよう!インセプションデッキSGT2014 横浜道場 始めよう!インセプションデッキ
SGT2014 横浜道場 始めよう!インセプションデッキterahide
 
Tdd keyword
Tdd keywordTdd keyword
Tdd keywordterahide
 
ゆるぎー
ゆるぎーゆるぎー
ゆるぎーterahide
 
マシュマロチャレンジ
マシュマロチャレンジマシュマロチャレンジ
マシュマロチャレンジterahide
 

More from terahide (20)

オレオレになりがちなテスト計画を見直した話
オレオレになりがちなテスト計画を見直した話オレオレになりがちなテスト計画を見直した話
オレオレになりがちなテスト計画を見直した話
 
和服を普段着にするようになって気づいたアジャイルの心
和服を普段着にするようになって気づいたアジャイルの心和服を普段着にするようになって気づいたアジャイルの心
和服を普段着にするようになって気づいたアジャイルの心
 
Management3.0のワークを受けてから会社の偉い人へ M3.0のワークショップをするまでにやったこと
Management3.0のワークを受けてから会社の偉い人へM3.0のワークショップをするまでにやったことManagement3.0のワークを受けてから会社の偉い人へM3.0のワークショップをするまでにやったこと
Management3.0のワークを受けてから会社の偉い人へ M3.0のワークショップをするまでにやったこと
 
一番アジャイルな料理人はソーマくんだと思うんだ
一番アジャイルな料理人はソーマくんだと思うんだ一番アジャイルな料理人はソーマくんだと思うんだ
一番アジャイルな料理人はソーマくんだと思うんだ
 
Att
AttAtt
Att
 
受託開発でテストファーストしたらXXXを早期発見できてハイアジリティになったはなし
受託開発でテストファーストしたらXXXを早期発見できてハイアジリティになったはなし受託開発でテストファーストしたらXXXを早期発見できてハイアジリティになったはなし
受託開発でテストファーストしたらXXXを早期発見できてハイアジリティになったはなし
 
オフショアだから失敗したの?~誤解だらけのオフショアと、アジャイルの再発見~
オフショアだから失敗したの?~誤解だらけのオフショアと、アジャイルの再発見~オフショアだから失敗したの?~誤解だらけのオフショアと、アジャイルの再発見~
オフショアだから失敗したの?~誤解だらけのオフショアと、アジャイルの再発見~
 
Springのプログラムモデルと動く仕様~テスト編~
Springのプログラムモデルと動く仕様~テスト編~Springのプログラムモデルと動く仕様~テスト編~
Springのプログラムモデルと動く仕様~テスト編~
 
Spring bootで学ぶ初めてのwebアプリ開発
Spring bootで学ぶ初めてのwebアプリ開発Spring bootで学ぶ初めてのwebアプリ開発
Spring bootで学ぶ初めてのwebアプリ開発
 
明日に繋がるふり返りのプラクティス
明日に繋がるふり返りのプラクティス明日に繋がるふり返りのプラクティス
明日に繋がるふり返りのプラクティス
 
ふりかえり
ふりかえりふりかえり
ふりかえり
 
データモデルは時空を越える
データモデルは時空を越えるデータモデルは時空を越える
データモデルは時空を越える
 
ももたろう
ももたろうももたろう
ももたろう
 
Sierのアジャイルとジレンマとパラダイムシフト
SierのアジャイルとジレンマとパラダイムシフトSierのアジャイルとジレンマとパラダイムシフト
Sierのアジャイルとジレンマとパラダイムシフト
 
脱Java初心者を目指すときに読むといいと思う本を考える会
脱Java初心者を目指すときに読むといいと思う本を考える会脱Java初心者を目指すときに読むといいと思う本を考える会
脱Java初心者を目指すときに読むといいと思う本を考える会
 
再入門!RESTとSpringMVC
再入門!RESTとSpringMVC再入門!RESTとSpringMVC
再入門!RESTとSpringMVC
 
SGT2014 横浜道場 始めよう!インセプションデッキ
SGT2014 横浜道場 始めよう!インセプションデッキSGT2014 横浜道場 始めよう!インセプションデッキ
SGT2014 横浜道場 始めよう!インセプションデッキ
 
Tdd keyword
Tdd keywordTdd keyword
Tdd keyword
 
ゆるぎー
ゆるぎーゆるぎー
ゆるぎー
 
マシュマロチャレンジ
マシュマロチャレンジマシュマロチャレンジ
マシュマロチャレンジ
 

Vbaでもtdd