SlideShare una empresa de Scribd logo
1 de 19
Descargar para leer sin conexión
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 もある
ご清聴
ありがとう
ございました

Más contenido relacionado

La actualidad más candente

テストコードの定型化
テストコードの定型化テストコードの定型化
テストコードの定型化Shinichi Hirauchi
 
GroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackGroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackTakahiro Yoshimura
 
xUnit Test Patterns - Chapter19
xUnit Test Patterns - Chapter19xUnit Test Patterns - Chapter19
xUnit Test Patterns - Chapter19Takuto Wada
 
ユニットテスト_2日目
ユニットテスト_2日目ユニットテスト_2日目
ユニットテスト_2日目Yoshiki Shibukawa
 
xUnit Test Patterns - Chapter16
xUnit Test Patterns - Chapter16xUnit Test Patterns - Chapter16
xUnit Test Patterns - Chapter16Takuto Wada
 
わんくま名古屋 #32 (20140823) TDD道場 #20
わんくま名古屋 #32 (20140823) TDD道場 #20わんくま名古屋 #32 (20140823) TDD道場 #20
わんくま名古屋 #32 (20140823) TDD道場 #20Yasuhiko Yamamoto
 
PHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めようPHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めようYuya Takeyama
 
Java SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にJava SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にTaku Miyakawa
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
 
最近の単体テスト
最近の単体テスト最近の単体テスト
最近の単体テストKen Morishita
 
ソフトウェア・テスト入門8
ソフトウェア・テスト入門8ソフトウェア・テスト入門8
ソフトウェア・テスト入門8Kenta Hattori
 
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)
C# 8.0 Preview in Visual Studio 2019 (16.0)信之 岩永
 
Ruby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::UnitRuby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::Unithigaki
 

La actualidad más candente (18)

テストコードの定型化
テストコードの定型化テストコードの定型化
テストコードの定型化
 
GroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackGroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hack
 
xUnit Test Patterns - Chapter19
xUnit Test Patterns - Chapter19xUnit Test Patterns - Chapter19
xUnit Test Patterns - Chapter19
 
ユニットテスト_2日目
ユニットテスト_2日目ユニットテスト_2日目
ユニットテスト_2日目
 
xUnit Test Patterns - Chapter16
xUnit Test Patterns - Chapter16xUnit Test Patterns - Chapter16
xUnit Test Patterns - Chapter16
 
わんくま名古屋 #32 (20140823) TDD道場 #20
わんくま名古屋 #32 (20140823) TDD道場 #20わんくま名古屋 #32 (20140823) TDD道場 #20
わんくま名古屋 #32 (20140823) TDD道場 #20
 
PHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めようPHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めよう
 
Java SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にJava SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心に
 
Unity testtool
Unity testtoolUnity testtool
Unity testtool
 
Akka Unit Testing
Akka Unit TestingAkka Unit Testing
Akka Unit Testing
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
最近の単体テスト
最近の単体テスト最近の単体テスト
最近の単体テスト
 
PHP agile test tips
PHP agile test tipsPHP agile test tips
PHP agile test tips
 
ソフトウェア・テスト入門8
ソフトウェア・テスト入門8ソフトウェア・テスト入門8
ソフトウェア・テスト入門8
 
Sharing Deep Dive
Sharing Deep DiveSharing Deep Dive
Sharing Deep Dive
 
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)
C# 8.0 Preview in Visual Studio 2019 (16.0)
 
Nds#24 単体テスト
Nds#24 単体テストNds#24 単体テスト
Nds#24 単体テスト
 
Ruby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::UnitRuby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::Unit
 

Destacado

組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術Takuto Wada
 
Mutation Testing
Mutation TestingMutation Testing
Mutation Testing10Pines
 
SapporoRubyKaigi02 t-wada LT
SapporoRubyKaigi02 t-wada LTSapporoRubyKaigi02 t-wada LT
SapporoRubyKaigi02 t-wada LTTakuto Wada
 
WWDC 2016の概観
WWDC 2016の概観WWDC 2016の概観
WWDC 2016の概観Yuta Hoshino
 
Random testing
Random testingRandom testing
Random testingCan KAYA
 
Mutation Testing
Mutation TestingMutation Testing
Mutation TestingESUG
 
フィーチャモデルの描き方
フィーチャモデルの描き方フィーチャモデルの描き方
フィーチャモデルの描き方H Iseri
 
型についてあれこれ
型についてあれこれ型についてあれこれ
型についてあれこれYuta Shimakawa
 
テストファースト、自動テストを導入するという事について(@社内勉強会)
テストファースト、自動テストを導入するという事について(@社内勉強会)テストファースト、自動テストを導入するという事について(@社内勉強会)
テストファースト、自動テストを導入するという事について(@社内勉強会)kyon mm
 
power-assert in JavaScript
power-assert in JavaScriptpower-assert in JavaScript
power-assert in JavaScriptTakuto Wada
 
Reviewing RESTful Web Apps
Reviewing RESTful Web AppsReviewing RESTful Web Apps
Reviewing RESTful Web AppsTakuto Wada
 
私にとってのテスト
私にとってのテスト私にとってのテスト
私にとってのテストTakuto Wada
 
ペアプログラミング ホントのところ
ペアプログラミング ホントのところペアプログラミング ホントのところ
ペアプログラミング ホントのところTakuto Wada
 
TDD のこころ @ OSH2014
TDD のこころ @ OSH2014TDD のこころ @ OSH2014
TDD のこころ @ OSH2014Takuto Wada
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)Takuto Wada
 
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswiftSwift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswiftTomohiro Kumagai
 
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話Takuto Wada
 
Patterns in Test Automation
Patterns in Test AutomationPatterns in Test Automation
Patterns in Test AutomationAnand Bagmar
 

Destacado (20)

組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術
 
Mutation Testing
Mutation TestingMutation Testing
Mutation Testing
 
Europe 2003
Europe 2003Europe 2003
Europe 2003
 
SapporoRubyKaigi02 t-wada LT
SapporoRubyKaigi02 t-wada LTSapporoRubyKaigi02 t-wada LT
SapporoRubyKaigi02 t-wada LT
 
WWDC 2016の概観
WWDC 2016の概観WWDC 2016の概観
WWDC 2016の概観
 
Random testing
Random testingRandom testing
Random testing
 
Mutation Testing
Mutation TestingMutation Testing
Mutation Testing
 
TDDBC お題
TDDBC お題TDDBC お題
TDDBC お題
 
フィーチャモデルの描き方
フィーチャモデルの描き方フィーチャモデルの描き方
フィーチャモデルの描き方
 
型についてあれこれ
型についてあれこれ型についてあれこれ
型についてあれこれ
 
テストファースト、自動テストを導入するという事について(@社内勉強会)
テストファースト、自動テストを導入するという事について(@社内勉強会)テストファースト、自動テストを導入するという事について(@社内勉強会)
テストファースト、自動テストを導入するという事について(@社内勉強会)
 
power-assert in JavaScript
power-assert in JavaScriptpower-assert in JavaScript
power-assert in JavaScript
 
Reviewing RESTful Web Apps
Reviewing RESTful Web AppsReviewing RESTful Web Apps
Reviewing RESTful Web Apps
 
私にとってのテスト
私にとってのテスト私にとってのテスト
私にとってのテスト
 
ペアプログラミング ホントのところ
ペアプログラミング ホントのところペアプログラミング ホントのところ
ペアプログラミング ホントのところ
 
TDD のこころ @ OSH2014
TDD のこころ @ OSH2014TDD のこころ @ OSH2014
TDD のこころ @ OSH2014
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswiftSwift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
 
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話
 
Patterns in Test Automation
Patterns in Test AutomationPatterns in Test Automation
Patterns in Test Automation
 

Similar a xUnit Test Patterns - Chapter11

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

Similar a xUnit Test Patterns - Chapter11 (20)

C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?
 
あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)
 
Jenkins+Play!で気軽にCI
Jenkins+Play!で気軽にCIJenkins+Play!で気軽にCI
Jenkins+Play!で気軽にCI
 
Let s database_testing
Let s database_testingLet s database_testing
Let s database_testing
 
Gamedevenvstudy1
Gamedevenvstudy1Gamedevenvstudy1
Gamedevenvstudy1
 
CruiseControl.NET設置
CruiseControl.NET設置CruiseControl.NET設置
CruiseControl.NET設置
 
ソフトウェア工学2023 11 テスト
ソフトウェア工学2023 11 テストソフトウェア工学2023 11 テスト
ソフトウェア工学2023 11 テスト
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for Java
 
ビジネス的に高価値なアジャイルテスト
ビジネス的に高価値なアジャイルテストビジネス的に高価値なアジャイルテスト
ビジネス的に高価値なアジャイルテスト
 
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
 
Hudson (JJUG CCCにて)
Hudson (JJUG CCCにて)Hudson (JJUG CCCにて)
Hudson (JJUG CCCにて)
 
20120421中国gtug
20120421中国gtug20120421中国gtug
20120421中国gtug
 
Gws in fukuoka
Gws in fukuokaGws in fukuoka
Gws in fukuoka
 
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
 
明日から使えるgradle
明日から使えるgradle明日から使えるgradle
明日から使えるgradle
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 
About Jobs
About JobsAbout Jobs
About Jobs
 
前回のCasual Talkでいただいたご要望に対する進捗状況
前回のCasual Talkでいただいたご要望に対する進捗状況前回のCasual Talkでいただいたご要望に対する進捗状況
前回のCasual Talkでいただいたご要望に対する進捗状況
 
第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめ第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめ
 
はこだてIKA 第4回勉強会 単体テスト
はこだてIKA 第4回勉強会 単体テストはこだてIKA 第4回勉強会 単体テスト
はこだてIKA 第4回勉強会 単体テスト
 

Más de Takuto Wada

OSS活動の活発さと評価の関係について
OSS活動の活発さと評価の関係についてOSS活動の活発さと評価の関係について
OSS活動の活発さと評価の関係についてTakuto Wada
 
unassert - encourage reliable programming by writing assertions in production
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
 
OSS についてあれこれ
OSS についてあれこれOSS についてあれこれ
OSS についてあれこれTakuto Wada
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
 
power-assert, mechanism and philosophy
power-assert, mechanism and philosophypower-assert, mechanism and philosophy
power-assert, mechanism and philosophyTakuto Wada
 
アジャイルサムライの次に読む技術書
アジャイルサムライの次に読む技術書アジャイルサムライの次に読む技術書
アジャイルサムライの次に読む技術書Takuto Wada
 
Test Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるかTest Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるかTakuto Wada
 
テスト用ライブラリ power-assert
テスト用ライブラリ power-assertテスト用ライブラリ power-assert
テスト用ライブラリ power-assertTakuto Wada
 
テストを書く文化を育てる戦略と戦術
テストを書く文化を育てる戦略と戦術テストを書く文化を育てる戦略と戦術
テストを書く文化を育てる戦略と戦術Takuto Wada
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴
SQLアンチパターン - 開発者を待ち受ける25の落とし穴SQLアンチパターン - 開発者を待ち受ける25の落とし穴
SQLアンチパターン - 開発者を待ち受ける25の落とし穴Takuto Wada
 
愛せないコードを書くには人生はあまりにも短い
愛せないコードを書くには人生はあまりにも短い愛せないコードを書くには人生はあまりにも短い
愛せないコードを書くには人生はあまりにも短いTakuto Wada
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
TDDBC Fukuoka Day1
TDDBC Fukuoka Day1TDDBC Fukuoka Day1
TDDBC Fukuoka Day1Takuto Wada
 
js テスト放浪記
js テスト放浪記js テスト放浪記
js テスト放浪記Takuto Wada
 
xUTP Chapter27 Generated Value
xUTP Chapter27 Generated ValuexUTP Chapter27 Generated Value
xUTP Chapter27 Generated ValueTakuto Wada
 
The only one big thing every programmer should know
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 knowTakuto Wada
 
10+1 Things you should know about JavaScript testing
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 testingTakuto Wada
 
TDD のこころ
TDD のこころTDD のこころ
TDD のこころTakuto Wada
 

Más de Takuto Wada (19)

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

Último

論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 

Último (9)

論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 

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 もある