xUnit Test Patterns - Chapter11

Takuto Wada
Takuto WadaChief Executive Programmer at Towersquest
Chapter 11.
Using Test Doubles
前回のまとめ
前回のまとめ
                                           設定可能?

Dummy   コンパイラを満足させるためだけに存在                   ×



Stub    テストから設定された値を SUT に返すために使う。           ○



Spy     SUT から値を受けとるために使う。SUT とのやりとりを覚え      ○
        ていて、テストは後で spy から聞き出す。


Mock    間接的入力/出力に使え、SUT とのやりとりを厳格にも寛容に       ○
        もすることができる。予想外のやりとりならすぐ失敗させるこ
        ともできる
Fake    テスト用に単純化された、 DOC の別実装。実際には DB に接     ×
        続に行かず、特定の値を返す Dao とか。
Providing the Test Double
●
    2 approaches
    ●
        Hand-Built Test Double
        –   Hard-Coded Test Double
        –   ちょっとがんばれば configurable になる
    ●
        Dynamically Generated Test Double
        –   基本的に Configurable Test Double
        –   jMock ファミリーが代表的 (←ちょっと情報が古い)
        –   EasyMock は少し毛色が違う
public void testDisplayCurrentTime_AtMidnight_PS() throws Exception {
  //Define and instantiate Test Stub
  TimeProvider testStub = new PseudoTimeProvider() { //Anonymous inner stub
    public Calendar getTime(String timeZone) {
      Calendar myTime = new GregorianCalendar();
      myTime.set(Calendar.MINUTE, 0);
      myTime.set(Calendar.HOUR_OF_DAY, 0);
      return myTime;
    }                
  };
  //Instantiate SUT
  TimeDisplay sut = new TimeDisplay();
  //Inject Test Stub into SUT
  sut.setTimeProvider(testStub);
  //Exercise SUT
  String result = sut.getCurrentTimeAsHtmlFragment();
  //Verify direct output
  String expectedTimeString = "<span class="tinyBoldText">Midnight</span>";
  assertEquals("Midnight", expectedTimeString, result);
}
Pseudo-Objects
●
    静的型付け言語で Hand-Coded な Double を
    作成するときには、 Pseudo-Object を作成し
    ておくと楽になる
    ●
        Inner Test Doubles や Self-Shunt につかう
Pseudo-Objects
/**
 * Base class for hand-coded Test Stubs and Mock Objects
 */
public class PseudoTimeProvider implements ComplexTimeProvider {

                       
    public Calendar getTime() throws TimeProviderEx {
      throw new PseudoClassException();
    }

    public Calendar getTimeDifference(Calendar baseTime,
                                      Calendar otherTime)
         throws TimeProviderEx {
      throw new PseudoClassException();
    }

    public Calendar getTime(String timeZone ) throws TimeProviderEx {
      throw new PseudoClassException();
    }
}
Configuring the Test Double
●
    Test Stub, Mock Object は何を返すか、何を話し
    かけられるかの設定行為が必要
    ●
        Hard-Coded Test Double の場合は設計時(コーディン
        グ時)に設定を行う
    ●
        Configurable Test Double はランタイムにテストから
        設定される
        –   Stub, Spy は何を返すかの設定が必要
        –   Mock は何を話しかけられるかの設定も加えて必要
●
    どういう値を選ぶかは設計行為そのもの
    ●
        テストの理解容易性
    ●
        Double の再利用性
Configuring the Test Double(2)
●
    Fake は SUT から使われるだけなのでランタイ
    ムに設定される必要なし
●
    Dummy は実行されないので設定の必要なし
●
    Procedual Test Stub は Hard-Coded の代表
    例
●
Configuring the Test Double(3)
●
    Configurable Test Double の設定方法
    ●
        Configuration Interface
    ●
        Configuration Mode
●
    利点
    ●
        テスト間での再利用性が高い
    ●
        値がテストコード内に書かれるので理解しやすい
        –   Mystery Guest アンチパターンを防ぐ
●
    設定場所は fixture setup と同じ扱い
Installing the Test Double
●
    “install” という言葉
●
    基本的な流れ
    ●
        Test Double のインスタンス化
    ●
        Configurable Test Double な場合は設定する
    ●
        「 Test Double を使え」とSUT の実行前か実行時
        に伝える
●
    “install” 方法は何種類かある
    ●
        種類の選択はテスト容易性の設計といえる
    ●
        選択の余地が無い場合も多いが、再設計もあるよ!
Installing the Test Double(2)
●
    基本的な選択肢は三つ
    ●
        Dependency Injection
    ●
        Dependency Lookup
    ●
        Test Hook
●
    IoC フレームワークが提供されている言語の場
    合にはいろいろ仕組みを自分で作らずに済む
Dependency Injection
●
    SUT が依存を自ら探すのではなく、誰かがラン
    タイムに外から設定する
●
    偽者を渡しやすいので TDD との相性◎
●
    依存性解決に関する知識が SUT から無くなる
    ので SUT の再利用性も大幅 UP
●
    3 types
    ●
        Setter Injection
    ●
        Constructor Injection
    ●
        Parameter Injection
Dependency Lookup
●
    テスト容易性を設計に組み込んでいなかった
    り、Dependency Injection の仕組みが言語に
    無い場合に使う
●
    SUT が誰かに DOC の作成を依頼する
    ●
        DOC の生成知識自体は SUT は持たない
    ●
        「誰か」は有名人になってしまう
●
    2 types (あまり違いは無い)
    ●
        Object Factory (GoF)
    ●
        Service Locator (PofEAA)
Test Specific Subclass
Test-Specific Subclass
●
    DI も DL も無くても、まだ諦めてはいけない
●
    介入可能な仕組みを組み上げてもがこう
    ●
        Singleton 死すべし
●
    DI 可能な仕組みを備えた、SUT のサブクラスを
    作成する
    ●
        テストに必要な部分に関して、 SUT のオーバーライ
        ドを行う
    ●
        でも SUT が non-private な self-call をする必要が
        ある
Test-Specific Subclass(2)
●
    DOC のサブクラスを作成する手もある
    ●
        Subclassed Test Double になる
    ●
        SUT のサブクラス作成よりは相対的に安全
Other Ways (最後の手段)
●
    Test Hooks
    ●
        Test Logic in Production
    ●
        レガシーコードからの第一手として
●
    さらなる手段は WEwLC にたくさんあるよ!
    ●
        Object Seam とか
    ●
        Dependency Breaking Technique の宝庫
        –   でも使わない状況になるのが一番幸せ
●
    AOP もある
ご清聴
ありがとう
ございました
1 of 19

Recommended

Spock's world by
Spock's worldSpock's world
Spock's worldTakuma Watabiki
4.4K views41 slides
xUTP Chapter19 (2). Testcase Class by
xUTP Chapter19 (2). Testcase ClassxUTP Chapter19 (2). Testcase Class
xUTP Chapter19 (2). Testcase ClassTakuto Wada
2.6K views22 slides
xUTP Chapter26. Dependency Injection by
xUTP Chapter26. Dependency InjectionxUTP Chapter26. Dependency Injection
xUTP Chapter26. Dependency InjectionTakuto Wada
4.3K views14 slides
Test Plugins by
Test PluginsTest Plugins
Test Pluginsykhr
684 views28 slides
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる by
JJUG CCC 2017 Fall オレオレJVM言語を作ってみるJJUG CCC 2017 Fall オレオレJVM言語を作ってみる
JJUG CCC 2017 Fall オレオレJVM言語を作ってみるKoichi Sakata
3.7K views88 slides
テストを書こう、Unity編 by
テストを書こう、Unity編テストを書こう、Unity編
テストを書こう、Unity編Hiroto Imoto
22K views43 slides

More Related Content

What's hot

テストコードの定型化 by
テストコードの定型化テストコードの定型化
テストコードの定型化Shinichi Hirauchi
1.6K views44 slides
GroovyなAndroidテスト #atest_hack by
GroovyなAndroidテスト #atest_hackGroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackTakahiro Yoshimura
3.5K views69 slides
xUnit Test Patterns - Chapter19 by
xUnit Test Patterns - Chapter19xUnit Test Patterns - Chapter19
xUnit Test Patterns - Chapter19Takuto Wada
4.3K views58 slides
ユニットテスト_2日目 by
ユニットテスト_2日目ユニットテスト_2日目
ユニットテスト_2日目Yoshiki Shibukawa
1.4K views32 slides
xUnit Test Patterns - Chapter16 by
xUnit Test Patterns - Chapter16xUnit Test Patterns - Chapter16
xUnit Test Patterns - Chapter16Takuto Wada
4K views90 slides
わんくま名古屋 #32 (20140823) TDD道場 #20 by
わんくま名古屋 #32 (20140823) TDD道場 #20わんくま名古屋 #32 (20140823) TDD道場 #20
わんくま名古屋 #32 (20140823) TDD道場 #20Yasuhiko Yamamoto
1.1K views43 slides

What's hot(18)

xUnit Test Patterns - Chapter19 by Takuto Wada
xUnit Test Patterns - Chapter19xUnit Test Patterns - Chapter19
xUnit Test Patterns - Chapter19
Takuto Wada4.3K views
xUnit Test Patterns - Chapter16 by Takuto Wada
xUnit Test Patterns - Chapter16xUnit Test Patterns - Chapter16
xUnit Test Patterns - Chapter16
Takuto Wada4K views
わんくま名古屋 #32 (20140823) TDD道場 #20 by Yasuhiko Yamamoto
わんくま名古屋 #32 (20140823) TDD道場 #20わんくま名古屋 #32 (20140823) TDD道場 #20
わんくま名古屋 #32 (20140823) TDD道場 #20
Yasuhiko Yamamoto1.1K views
PHPUnit でテスト駆動開発を始めよう by Yuya Takeyama
PHPUnit でテスト駆動開発を始めようPHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めよう
Yuya Takeyama16.1K views
Java SE 9の紹介: モジュール・システムを中心に by Taku Miyakawa
Java SE 9の紹介: モジュール・システムを中心にJava SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心に
Taku Miyakawa145.2K views
Javaのログ出力: 道具と考え方 by Taku Miyakawa
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
Taku Miyakawa74.3K views
最近の単体テスト by Ken Morishita
最近の単体テスト最近の単体テスト
最近の単体テスト
Ken Morishita15.6K views
ソフトウェア・テスト入門8 by Kenta Hattori
ソフトウェア・テスト入門8ソフトウェア・テスト入門8
ソフトウェア・テスト入門8
Kenta Hattori307 views
C# 8.0 Preview in Visual Studio 2019 (16.0) by 信之 岩永
C# 8.0 Preview in Visual Studio 2019 (16.0)C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)
信之 岩永4.5K views
Ruby初級者向けレッスン 第46回 ─── Test::Unit by higaki
Ruby初級者向けレッスン 第46回 ─── Test::UnitRuby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::Unit
higaki4.4K views

Viewers also liked

組織にテストを書く文化を根付かせる戦略と戦術 by
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術Takuto Wada
76.4K views33 slides
Mutation Testing by
Mutation TestingMutation Testing
Mutation Testing10Pines
1.9K views45 slides
Europe 2003 by
Europe 2003Europe 2003
Europe 2003Fe Angela Verzosa
904 views12 slides
SapporoRubyKaigi02 t-wada LT by
SapporoRubyKaigi02 t-wada LTSapporoRubyKaigi02 t-wada LT
SapporoRubyKaigi02 t-wada LTTakuto Wada
1.8K views45 slides
WWDC 2016の概観 by
WWDC 2016の概観WWDC 2016の概観
WWDC 2016の概観Yuta Hoshino
741 views47 slides
Random testing by
Random testingRandom testing
Random testingCan KAYA
9.4K views17 slides

Viewers also liked(20)

組織にテストを書く文化を根付かせる戦略と戦術 by Takuto Wada
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術
Takuto Wada76.4K views
Mutation Testing by 10Pines
Mutation TestingMutation Testing
Mutation Testing
10Pines1.9K views
SapporoRubyKaigi02 t-wada LT by Takuto Wada
SapporoRubyKaigi02 t-wada LTSapporoRubyKaigi02 t-wada LT
SapporoRubyKaigi02 t-wada LT
Takuto Wada1.8K views
Random testing by Can KAYA
Random testingRandom testing
Random testing
Can KAYA9.4K views
Mutation Testing by ESUG
Mutation TestingMutation Testing
Mutation Testing
ESUG10K views
フィーチャモデルの描き方 by H Iseri
フィーチャモデルの描き方フィーチャモデルの描き方
フィーチャモデルの描き方
H Iseri12.3K views
テストファースト、自動テストを導入するという事について(@社内勉強会) by kyon mm
テストファースト、自動テストを導入するという事について(@社内勉強会)テストファースト、自動テストを導入するという事について(@社内勉強会)
テストファースト、自動テストを導入するという事について(@社内勉強会)
kyon mm11.8K views
power-assert in JavaScript by Takuto Wada
power-assert in JavaScriptpower-assert in JavaScript
power-assert in JavaScript
Takuto Wada9K views
Reviewing RESTful Web Apps by Takuto Wada
Reviewing RESTful Web AppsReviewing RESTful Web Apps
Reviewing RESTful Web Apps
Takuto Wada9K views
私にとってのテスト by Takuto Wada
私にとってのテスト私にとってのテスト
私にとってのテスト
Takuto Wada16.8K views
ペアプログラミング ホントのところ by Takuto Wada
ペアプログラミング ホントのところペアプログラミング ホントのところ
ペアプログラミング ホントのところ
Takuto Wada38.4K views
TDD のこころ @ OSH2014 by Takuto Wada
TDD のこころ @ OSH2014TDD のこころ @ OSH2014
TDD のこころ @ OSH2014
Takuto Wada15.8K views
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版) by Takuto Wada
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada70.7K views
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift by Tomohiro Kumagai
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswiftSwift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Tomohiro Kumagai11.2K views
RESTful Web アプリの設計レビューの話 by Takuto Wada
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話
Takuto Wada72.2K views
Patterns in Test Automation by Anand Bagmar
Patterns in Test AutomationPatterns in Test Automation
Patterns in Test Automation
Anand Bagmar24.6K views

Similar to xUnit Test Patterns - Chapter11

C# から java へのプログラム移植で体験したtddの効果は? by
C# から java へのプログラム移植で体験したtddの効果は?C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?Shinichi Hirauchi
4.9K views89 slides
あんなテスト、こんなテスト(this and that about testing) by
あんなテスト、こんなテスト(this and that about testing)あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)Takuya Tsuchida
2.4K views31 slides
Jenkins+Play!で気軽にCI by
Jenkins+Play!で気軽にCIJenkins+Play!で気軽にCI
Jenkins+Play!で気軽にCITakafumi Ikeda
6.8K views65 slides
Let s database_testing by
Let s database_testingLet s database_testing
Let s database_testingYuji Shimada
1.2K views79 slides
Gamedevenvstudy1 by
Gamedevenvstudy1Gamedevenvstudy1
Gamedevenvstudy1Takashi Kokawa
1.5K views179 slides
CruiseControl.NET設置 by
CruiseControl.NET設置CruiseControl.NET設置
CruiseControl.NET設置Kuniaki Igarashi
1.5K views43 slides

Similar to xUnit Test Patterns - Chapter11(20)

C# から java へのプログラム移植で体験したtddの効果は? by Shinichi Hirauchi
C# から java へのプログラム移植で体験したtddの効果は?C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?
Shinichi Hirauchi4.9K views
あんなテスト、こんなテスト(this and that about testing) by Takuya Tsuchida
あんなテスト、こんなテスト(this and that about testing)あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)
Takuya Tsuchida2.4K views
Jenkins+Play!で気軽にCI by Takafumi Ikeda
Jenkins+Play!で気軽にCIJenkins+Play!で気軽にCI
Jenkins+Play!で気軽にCI
Takafumi Ikeda6.8K views
Let s database_testing by Yuji Shimada
Let s database_testingLet s database_testing
Let s database_testing
Yuji Shimada1.2K views
ソフトウェア工学2023 11 テスト by Toru Tamaki
ソフトウェア工学2023 11 テストソフトウェア工学2023 11 テスト
ソフトウェア工学2023 11 テスト
Toru Tamaki13 views
TDD勉強会キックオフ for Java by Yuta Kawadai
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for Java
Yuta Kawadai1.1K views
ビジネス的に高価値なアジャイルテスト by Tsutomu Chikuba
ビジネス的に高価値なアジャイルテストビジネス的に高価値なアジャイルテスト
ビジネス的に高価値なアジャイルテスト
Tsutomu Chikuba2.1K views
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ... by NTT DATA Technology & Innovation
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
20120421中国gtug by Yusuke Sato
20120421中国gtug20120421中国gtug
20120421中国gtug
Yusuke Sato577 views
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう by UnityTechnologiesJapan002
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
Groovyで楽にSQLを実行してみよう by Akira Shimosako
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
Akira Shimosako14.9K views
前回のCasual Talkでいただいたご要望に対する進捗状況 by JubatusOfficial
前回のCasual Talkでいただいたご要望に対する進捗状況前回のCasual Talkでいただいたご要望に対する進捗状況
前回のCasual Talkでいただいたご要望に対する進捗状況
JubatusOfficial15.3K views
第4回勉強会 単体テストのすすめ by hakoika-itwg
第4回勉強会 単体テストのすすめ第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめ
hakoika-itwg9.4K views
はこだてIKA 第4回勉強会 単体テスト by Seiji KOMATSU
はこだてIKA 第4回勉強会 単体テストはこだてIKA 第4回勉強会 単体テスト
はこだてIKA 第4回勉強会 単体テスト
Seiji KOMATSU785 views

More from Takuto Wada

OSS活動の活発さと評価の関係について by
OSS活動の活発さと評価の関係についてOSS活動の活発さと評価の関係について
OSS活動の活発さと評価の関係についてTakuto Wada
14.7K views64 slides
unassert - encourage reliable programming by writing assertions in production by
unassert - encourage reliable programming by writing assertions in productionunassert - encourage reliable programming by writing assertions in production
unassert - encourage reliable programming by writing assertions in productionTakuto Wada
18.1K views36 slides
OSS についてあれこれ by
OSS についてあれこれOSS についてあれこれ
OSS についてあれこれTakuto Wada
41.8K views65 slides
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」 by
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
148.7K views45 slides
power-assert, mechanism and philosophy by
power-assert, mechanism and philosophypower-assert, mechanism and philosophy
power-assert, mechanism and philosophyTakuto Wada
48.4K views29 slides
アジャイルサムライの次に読む技術書 by
アジャイルサムライの次に読む技術書アジャイルサムライの次に読む技術書
アジャイルサムライの次に読む技術書Takuto Wada
25.6K views30 slides

More from Takuto Wada(19)

OSS活動の活発さと評価の関係について by Takuto Wada
OSS活動の活発さと評価の関係についてOSS活動の活発さと評価の関係について
OSS活動の活発さと評価の関係について
Takuto Wada14.7K views
unassert - encourage reliable programming by writing assertions in production by Takuto Wada
unassert - encourage reliable programming by writing assertions in productionunassert - encourage reliable programming by writing assertions in production
unassert - encourage reliable programming by writing assertions in production
Takuto Wada18.1K views
OSS についてあれこれ by Takuto Wada
OSS についてあれこれOSS についてあれこれ
OSS についてあれこれ
Takuto Wada41.8K views
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」 by Takuto Wada
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada148.7K views
power-assert, mechanism and philosophy by Takuto Wada
power-assert, mechanism and philosophypower-assert, mechanism and philosophy
power-assert, mechanism and philosophy
Takuto Wada48.4K views
アジャイルサムライの次に読む技術書 by Takuto Wada
アジャイルサムライの次に読む技術書アジャイルサムライの次に読む技術書
アジャイルサムライの次に読む技術書
Takuto Wada25.6K views
Test Yourself - テストを書くと何がどう変わるか by Takuto Wada
Test Yourself - テストを書くと何がどう変わるかTest Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるか
Takuto Wada38.3K views
テスト用ライブラリ power-assert by Takuto Wada
テスト用ライブラリ power-assertテスト用ライブラリ power-assert
テスト用ライブラリ power-assert
Takuto Wada12.7K views
テストを書く文化を育てる戦略と戦術 by Takuto Wada
テストを書く文化を育てる戦略と戦術テストを書く文化を育てる戦略と戦術
テストを書く文化を育てる戦略と戦術
Takuto Wada49.4K views
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 by Takuto Wada
SQLアンチパターン - 開発者を待ち受ける25の落とし穴SQLアンチパターン - 開発者を待ち受ける25の落とし穴
SQLアンチパターン - 開発者を待ち受ける25の落とし穴
Takuto Wada17.2K views
愛せないコードを書くには人生はあまりにも短い by Takuto Wada
愛せないコードを書くには人生はあまりにも短い愛せないコードを書くには人生はあまりにも短い
愛せないコードを書くには人生はあまりにも短い
Takuto Wada26.6K views
例外設計における大罪 by Takuto Wada
例外設計における大罪例外設計における大罪
例外設計における大罪
Takuto Wada68.6K views
DevLOVE DDDBC by Takuto Wada
DevLOVE DDDBCDevLOVE DDDBC
DevLOVE DDDBC
Takuto Wada3.1K views
TDDBC Fukuoka Day1 by Takuto Wada
TDDBC Fukuoka Day1TDDBC Fukuoka Day1
TDDBC Fukuoka Day1
Takuto Wada22.7K views
js テスト放浪記 by Takuto Wada
js テスト放浪記js テスト放浪記
js テスト放浪記
Takuto Wada4K views
xUTP Chapter27 Generated Value by Takuto Wada
xUTP Chapter27 Generated ValuexUTP Chapter27 Generated Value
xUTP Chapter27 Generated Value
Takuto Wada2.1K views
The only one big thing every programmer should know by Takuto Wada
The only one big thing every programmer should knowThe only one big thing every programmer should know
The only one big thing every programmer should know
Takuto Wada7.9K views
10+1 Things you should know about JavaScript testing by Takuto Wada
10+1 Things you should know about JavaScript testing10+1 Things you should know about JavaScript testing
10+1 Things you should know about JavaScript testing
Takuto Wada2.6K views
TDD のこころ by Takuto Wada
TDD のこころTDD のこころ
TDD のこころ
Takuto Wada12.8K views

Recently uploaded

Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向 by
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向Hitachi, Ltd. OSS Solution Center.
89 views26 slides
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料) by
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)NTT DATA Technology & Innovation
29 views38 slides
Windows 11 information that can be used at the development site by
Windows 11 information that can be used at the development siteWindows 11 information that can be used at the development site
Windows 11 information that can be used at the development siteAtomu Hidaka
90 views41 slides
SNMPセキュリティ超入門 by
SNMPセキュリティ超入門SNMPセキュリティ超入門
SNMPセキュリティ超入門mkoda
453 views15 slides
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」 by
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」PC Cluster Consortium
45 views12 slides

Recently uploaded(12)

速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料) by NTT DATA Technology & Innovation
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
Windows 11 information that can be used at the development site by Atomu Hidaka
Windows 11 information that can be used at the development siteWindows 11 information that can be used at the development site
Windows 11 information that can be used at the development site
Atomu Hidaka90 views
SNMPセキュリティ超入門 by mkoda
SNMPセキュリティ超入門SNMPセキュリティ超入門
SNMPセキュリティ超入門
mkoda453 views
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」 by PC Cluster Consortium
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20... by NTT DATA Technology & Innovation
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
SSH応用編_20231129.pdf by icebreaker4
SSH応用編_20231129.pdfSSH応用編_20231129.pdf
SSH応用編_20231129.pdf
icebreaker4380 views
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」 by PC Cluster Consortium
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」
光コラボは契約してはいけない by Takuya Matsunaga
光コラボは契約してはいけない光コラボは契約してはいけない
光コラボは契約してはいけない
Takuya Matsunaga25 views
The Things Stack説明資料 by The Things Industries by CRI Japan, Inc.
The Things Stack説明資料 by The Things IndustriesThe Things Stack説明資料 by The Things Industries
The Things Stack説明資料 by The Things Industries
CRI Japan, Inc.76 views

xUnit Test Patterns - Chapter11

  • 3. 前回のまとめ 設定可能? Dummy コンパイラを満足させるためだけに存在 × Stub テストから設定された値を SUT に返すために使う。 ○ Spy SUT から値を受けとるために使う。SUT とのやりとりを覚え ○ ていて、テストは後で spy から聞き出す。 Mock 間接的入力/出力に使え、SUT とのやりとりを厳格にも寛容に ○ もすることができる。予想外のやりとりならすぐ失敗させるこ ともできる Fake テスト用に単純化された、 DOC の別実装。実際には DB に接 × 続に行かず、特定の値を返す Dao とか。
  • 4. Providing the Test Double ● 2 approaches ● Hand-Built Test Double – Hard-Coded Test Double – ちょっとがんばれば configurable になる ● Dynamically Generated Test Double – 基本的に Configurable Test Double – jMock ファミリーが代表的 (←ちょっと情報が古い) – EasyMock は少し毛色が違う
  • 5. public void testDisplayCurrentTime_AtMidnight_PS() throws Exception { //Define and instantiate Test Stub TimeProvider testStub = new PseudoTimeProvider() { //Anonymous inner stub public Calendar getTime(String timeZone) { Calendar myTime = new GregorianCalendar(); myTime.set(Calendar.MINUTE, 0); myTime.set(Calendar.HOUR_OF_DAY, 0); return myTime; }     }; //Instantiate SUT TimeDisplay sut = new TimeDisplay(); //Inject Test Stub into SUT sut.setTimeProvider(testStub); //Exercise SUT String result = sut.getCurrentTimeAsHtmlFragment(); //Verify direct output String expectedTimeString = "<span class="tinyBoldText">Midnight</span>"; assertEquals("Midnight", expectedTimeString, result); }
  • 6. Pseudo-Objects ● 静的型付け言語で Hand-Coded な Double を 作成するときには、 Pseudo-Object を作成し ておくと楽になる ● Inner Test Doubles や Self-Shunt につかう
  • 7. Pseudo-Objects /** * Base class for hand-coded Test Stubs and Mock Objects */ public class PseudoTimeProvider implements ComplexTimeProvider {     public Calendar getTime() throws TimeProviderEx { throw new PseudoClassException(); } public Calendar getTimeDifference(Calendar baseTime, Calendar otherTime) throws TimeProviderEx { throw new PseudoClassException(); } public Calendar getTime(String timeZone ) throws TimeProviderEx { throw new PseudoClassException(); } }
  • 8. Configuring the Test Double ● Test Stub, Mock Object は何を返すか、何を話し かけられるかの設定行為が必要 ● Hard-Coded Test Double の場合は設計時(コーディン グ時)に設定を行う ● Configurable Test Double はランタイムにテストから 設定される – Stub, Spy は何を返すかの設定が必要 – Mock は何を話しかけられるかの設定も加えて必要 ● どういう値を選ぶかは設計行為そのもの ● テストの理解容易性 ● Double の再利用性
  • 9. Configuring the Test Double(2) ● Fake は SUT から使われるだけなのでランタイ ムに設定される必要なし ● Dummy は実行されないので設定の必要なし ● Procedual Test Stub は Hard-Coded の代表 例 ●
  • 10. Configuring the Test Double(3) ● Configurable Test Double の設定方法 ● Configuration Interface ● Configuration Mode ● 利点 ● テスト間での再利用性が高い ● 値がテストコード内に書かれるので理解しやすい – Mystery Guest アンチパターンを防ぐ ● 設定場所は fixture setup と同じ扱い
  • 11. Installing the Test Double ● “install” という言葉 ● 基本的な流れ ● Test Double のインスタンス化 ● Configurable Test Double な場合は設定する ● 「 Test Double を使え」とSUT の実行前か実行時 に伝える ● “install” 方法は何種類かある ● 種類の選択はテスト容易性の設計といえる ● 選択の余地が無い場合も多いが、再設計もあるよ!
  • 12. Installing the Test Double(2) ● 基本的な選択肢は三つ ● Dependency Injection ● Dependency Lookup ● Test Hook ● IoC フレームワークが提供されている言語の場 合にはいろいろ仕組みを自分で作らずに済む
  • 13. Dependency Injection ● SUT が依存を自ら探すのではなく、誰かがラン タイムに外から設定する ● 偽者を渡しやすいので TDD との相性◎ ● 依存性解決に関する知識が SUT から無くなる ので SUT の再利用性も大幅 UP ● 3 types ● Setter Injection ● Constructor Injection ● Parameter Injection
  • 14. Dependency Lookup ● テスト容易性を設計に組み込んでいなかった り、Dependency Injection の仕組みが言語に 無い場合に使う ● SUT が誰かに DOC の作成を依頼する ● DOC の生成知識自体は SUT は持たない ● 「誰か」は有名人になってしまう ● 2 types (あまり違いは無い) ● Object Factory (GoF) ● Service Locator (PofEAA)
  • 16. Test-Specific Subclass ● DI も DL も無くても、まだ諦めてはいけない ● 介入可能な仕組みを組み上げてもがこう ● Singleton 死すべし ● DI 可能な仕組みを備えた、SUT のサブクラスを 作成する ● テストに必要な部分に関して、 SUT のオーバーライ ドを行う ● でも SUT が non-private な self-call をする必要が ある
  • 17. Test-Specific Subclass(2) ● DOC のサブクラスを作成する手もある ● Subclassed Test Double になる ● SUT のサブクラス作成よりは相対的に安全
  • 18. Other Ways (最後の手段) ● Test Hooks ● Test Logic in Production ● レガシーコードからの第一手として ● さらなる手段は WEwLC にたくさんあるよ! ● Object Seam とか ● Dependency Breaking Technique の宝庫 – でも使わない状況になるのが一番幸せ ● AOP もある