SlideShare ist ein Scribd-Unternehmen logo
1 von 26
Downloaden Sie, um offline zu lesen
Mock	
  と	
  patch	

 ふるかわとおる
お前、誰よ?	
•  ふるかわとおる	
  
  –  @torufurukawa	
  
  –  bucho	
  と呼ばれています	
  
•  株式会社バスキュール	
  
  –  生放送テレビ番組と連動するサービス	
  
  –  エンジニア足りません	
  
ユニットテスト	
def	
  test():	
  
	
  	
  result	
  =	
  foo('wozozo')	
  
	
  	
  assert	
  result	
  ==	
  'unko'	
  
依存先…	
def	
  foo(name):	
  
	
  	
  f	
  =	
  urlopen('http://%s.com/'	
  %	
  name)	
  
	
  	
  raw	
  =	
  f.read()	
  
	
  	
  d	
  =	
  json.loads(raw)	
   不確定	
	
  	
  return	
  d['data']	
                                  確定的な	
  
                                 結果に依存
ユニットテストしにくい例	
•  戻り値が不確定	
  
  –  乱数	
  
  –  時刻	
  
•  セットアップがだるい	
  
  –  データベース	
  
  –  Web	
  API	
  
テスト対象の外側を入出力として扱う	

                               ここも入出力	
よびだし	
                                                 HTTP	
  req	
         def	
  foo(name):	
  
         	
  	
  raw	
  =	
  urlopen('http://…')	
  
         	
  	
  d	
  =	
  json.loads(raw)	
  
         	
  	
  return	
  d['data']	

戻り値	
                                                  HTTP	
  resp
そこで	
  mock	
  モジュール ですよ	
•  Python	
  3.2	
  以前 PyPI	
  
   –  easy_install,	
  pip,	
  etc.	
  


•  Python	
  3.3	
  標準ライブラリ	
  
   –  uniDest.mock	
  
1:	
  依存先オブジェクトを入れ替える	


テスト対象	
   urlopen	




テスト対象	
    mock
with	
  patch(...)	
  で入れ替える	
from	
  unittest.mock	
  import	
  patch	
  
def	
  test():	
  
	
  	
  with	
  patch('urllib.request.urlopen')	
  
	
  	
  as	
  m:	
  
	
  	
  	
  	
  result	
  =	
  foo('wozozo')	
  
Mock	
  オブジェクトと入れ替え	
>>>	
  with	
  patch('urllib.request.urlopen')	
  
	
  	
  	
  	
  as	
  m:	
  
...	
  	
  	
  from	
  urllib.request	
  import	
  urlopen	
  
...	
  	
  	
  urlopen	
  is	
  m	
  
...	
  	
  
True
Mock	
  オブジェクトはアクセスし放題	
>>>	
  m	
  
<MagicMock	
  name='urlopen'	
  id='1'>	
  
>>>	
  m.read()	
  
<MagicMock	
  name='urlopen.read()'	
  id='2'>	
  
>>>	
  m.hoge	
  
<MagicMock	
  name='urlopen.hoge'	
  id='3'>	
  
@patch	
  で入れ替える	
@patch('urllib.request.urlopen')	
  
def	
  test(m):	
  
	
  	
  result	
  =	
  foo('wozozo')	
  
setUp	
  と tearDown	
  で	
  patch	
class	
  MyTest(TestCase):	
  
	
  	
  def	
  setUp(self):	
  
	
  	
  	
  	
  self.patcher	
  =	
  patch('...')	
  
	
  	
  	
  	
  self.m	
  =	
  patcher.start()	
  
	
  
	
  	
  def	
  tearDown(self):	
  
	
  	
  	
  	
  self.patcher.stop()
2:	
  依存先の呼び出し履歴を確認	



テスト	
   テスト対象	
   mock
call_count	
  で呼び出し回数を確認	
@patch('urllib.request.urlopen')	
  
def	
  test(m):	
  
	
  	
  result	
  =	
  foo('wozozo')	
  
	
  	
  assert	
  m.call_count	
  ==	
  1	
  
call_args	
  で引数を確認	
@patch('urllib.request.urlopen')	
  
def	
  test(m):	
  
	
  	
  result	
  =	
  foo('wozozo')	
  
	
  	
  assert	
  m.call_count	
  ==	
  1	
  
	
  	
  assert	
  (m.call_args	
  ==	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (('http://...',),	
  {}))	
  
*args	
  と	
  **kw	
  が返ってくる	
m(a,	
  b,	
  x=1)	
  
↓	
  
m.call_args	
  ==	
  ((a,	
  b),	
  {'x':	
  1})
3:	
  依存先の挙動を定義する	



テスト	
   テスト対象	
   mock
return_value	
  で戻り値定義	
>>>	
  m.return_value	
  =	
  999	
  
>>>	
  m()	
  
999	
  
urlopen().read()	
def	
  foo(name):	
  
	
  	
  f	
  =	
  urlopen('http://%s.com/'	
  %	
  name)	
  
	
  	
  raw	
  =	
  f.read()	
  
	
  	
  d	
  =	
  json.loads(raw)	
  
	
  	
  return	
  d['data']
return_value	
  で戻り値定義	
>>>	
  m.return_value.meth.return_value	
  =	
  1	
  
>>>	
  m().meth()	
  
1	
  
@patch('urllib.request.urlopen')	
  
def	
  test_foo(m):	
  
	
  	
  m.return_value.read.return_value	
  =	
  '…'	
  
	
  	
  result	
  =	
  foo('wozozo')	
  
	
  	
  assert	
  m.call_count	
  ==	
  1	
  
	
  	
  assert	
  (m.call_args	
  ==	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (('http://…',),	
  {}))	
  
	
  	
  assert	
  result	
  ==	
  '…'	
  
複雑な戻り値は side_effect	
>>>	
  def	
  f(x,	
  y):	
  	
  
...	
  	
  	
  return	
  x	
  +	
  y	
  
...	
  	
  
>>>	
  m.side_effect	
  =	
  f	
  
>>>	
  m(1,	
  2)	
  
3
side_effect	
  に例外を指定	
>>>	
  m.side_effect	
  =	
  TypeError	
  
>>>	
  m()	
  
Traceback	
  (most	
  recent	
  call	
  last):	
  
...	
  
TypeError
mock	
  でユニットテストしやすくなる	



 テスト	
   テスト対象	
   mock
より詳しい話	
•  公式ドキュメント	
  
•  voluntas	
  「requests	
  と	
  mock	
  を使ってみる」	
  
     hDp://voluntas.hatenablog.com/entry/20111124/1322069748	
  
•  ぁっぉ 「mock	
  はこう使え」	
  
     hDp://d.hatena.ne.jp/atsuoishimoto/20120310/1331311730	
  

Weitere ähnliche Inhalte

Was ist angesagt?

UnboundとNSDの紹介 BIND9との比較編
UnboundとNSDの紹介 BIND9との比較編UnboundとNSDの紹介 BIND9との比較編
UnboundとNSDの紹介 BIND9との比較編hdais
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化Gosuke Miyashita
 
Getting Started - Ansible Galaxy NG
Getting Started - Ansible Galaxy NGGetting Started - Ansible Galaxy NG
Getting Started - Ansible Galaxy NGHideki Saito
 
Shibboleth IdP V3とアカデミックIDフェデレーション - OpenID Summit 2015
Shibboleth IdP V3とアカデミックIDフェデレーション - OpenID Summit 2015Shibboleth IdP V3とアカデミックIDフェデレーション - OpenID Summit 2015
Shibboleth IdP V3とアカデミックIDフェデレーション - OpenID Summit 2015OpenID Foundation Japan
 
Java - programmation concurrente
Java - programmation concurrenteJava - programmation concurrente
Java - programmation concurrenteFranck SIMON
 
5分で分かるgitのrefspec
5分で分かるgitのrefspec5分で分かるgitのrefspec
5分で分かるgitのrefspecikdysfm
 
rsyncのちょっとイイ話
rsyncのちょっとイイ話rsyncのちょっとイイ話
rsyncのちょっとイイ話Kazuhiro Oinuma
 
Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Etsuji Nakai
 
Mise en place vidéoconférence + chat avec Openfire
Mise en place vidéoconférence + chat avec OpenfireMise en place vidéoconférence + chat avec Openfire
Mise en place vidéoconférence + chat avec OpenfireAbdou Lahad SYLLA
 
Design patterns - Exemples en Java
Design patterns - Exemples en JavaDesign patterns - Exemples en Java
Design patterns - Exemples en JavaOussama BEN KHIROUN
 
Clean Architecture Applications in Python
Clean Architecture Applications in PythonClean Architecture Applications in Python
Clean Architecture Applications in PythonSubhash Bhushan
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDOAbdoulaye Dieng
 
Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409稔 小林
 
C/C++とWebAssemblyを利用したライブラリ開発
C/C++とWebAssemblyを利用したライブラリ開発C/C++とWebAssemblyを利用したライブラリ開発
C/C++とWebAssemblyを利用したライブラリ開発祐司 伊藤
 
MySQLとPostgreSQLの基本的なバックアップ比較
MySQLとPostgreSQLの基本的なバックアップ比較MySQLとPostgreSQLの基本的なバックアップ比較
MySQLとPostgreSQLの基本的なバックアップ比較Shinya Sugiyama
 
Sql serverデータアクセスの基本動作。荒ぶった方法で確認してみよう
Sql serverデータアクセスの基本動作。荒ぶった方法で確認してみようSql serverデータアクセスの基本動作。荒ぶった方法で確認してみよう
Sql serverデータアクセスの基本動作。荒ぶった方法で確認してみようMasayuki Ozawa
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
PHPでWebSocketを実装してみてわかったこと
PHPでWebSocketを実装してみてわかったことPHPでWebSocketを実装してみてわかったこと
PHPでWebSocketを実装してみてわかったことksimoji
 
Zshでデキるプロンプト
ZshでデキるプロンプトZshでデキるプロンプト
ZshでデキるプロンプトMaruyama Tetsutaro
 

Was ist angesagt? (20)

UnboundとNSDの紹介 BIND9との比較編
UnboundとNSDの紹介 BIND9との比較編UnboundとNSDの紹介 BIND9との比較編
UnboundとNSDの紹介 BIND9との比較編
 
ストリームデータ分散処理基盤Storm
ストリームデータ分散処理基盤Stormストリームデータ分散処理基盤Storm
ストリームデータ分散処理基盤Storm
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
 
Getting Started - Ansible Galaxy NG
Getting Started - Ansible Galaxy NGGetting Started - Ansible Galaxy NG
Getting Started - Ansible Galaxy NG
 
Shibboleth IdP V3とアカデミックIDフェデレーション - OpenID Summit 2015
Shibboleth IdP V3とアカデミックIDフェデレーション - OpenID Summit 2015Shibboleth IdP V3とアカデミックIDフェデレーション - OpenID Summit 2015
Shibboleth IdP V3とアカデミックIDフェデレーション - OpenID Summit 2015
 
Java - programmation concurrente
Java - programmation concurrenteJava - programmation concurrente
Java - programmation concurrente
 
5分で分かるgitのrefspec
5分で分かるgitのrefspec5分で分かるgitのrefspec
5分で分かるgitのrefspec
 
rsyncのちょっとイイ話
rsyncのちょっとイイ話rsyncのちょっとイイ話
rsyncのちょっとイイ話
 
Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造
 
Mise en place vidéoconférence + chat avec Openfire
Mise en place vidéoconférence + chat avec OpenfireMise en place vidéoconférence + chat avec Openfire
Mise en place vidéoconférence + chat avec Openfire
 
Design patterns - Exemples en Java
Design patterns - Exemples en JavaDesign patterns - Exemples en Java
Design patterns - Exemples en Java
 
Clean Architecture Applications in Python
Clean Architecture Applications in PythonClean Architecture Applications in Python
Clean Architecture Applications in Python
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDO
 
Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409
 
C/C++とWebAssemblyを利用したライブラリ開発
C/C++とWebAssemblyを利用したライブラリ開発C/C++とWebAssemblyを利用したライブラリ開発
C/C++とWebAssemblyを利用したライブラリ開発
 
MySQLとPostgreSQLの基本的なバックアップ比較
MySQLとPostgreSQLの基本的なバックアップ比較MySQLとPostgreSQLの基本的なバックアップ比較
MySQLとPostgreSQLの基本的なバックアップ比較
 
Sql serverデータアクセスの基本動作。荒ぶった方法で確認してみよう
Sql serverデータアクセスの基本動作。荒ぶった方法で確認してみようSql serverデータアクセスの基本動作。荒ぶった方法で確認してみよう
Sql serverデータアクセスの基本動作。荒ぶった方法で確認してみよう
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
PHPでWebSocketを実装してみてわかったこと
PHPでWebSocketを実装してみてわかったことPHPでWebSocketを実装してみてわかったこと
PHPでWebSocketを実装してみてわかったこと
 
Zshでデキるプロンプト
ZshでデキるプロンプトZshでデキるプロンプト
Zshでデキるプロンプト
 

Ähnlich wie Mock and patch

Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料時響 逢坂
 
Unit test in android
Unit test in androidUnit test in android
Unit test in androidTatsuya Maki
 
Kompira開発者が教えるジョブフローTips7選_Kompass発表資料20240306.pptx
Kompira開発者が教えるジョブフローTips7選_Kompass発表資料20240306.pptxKompira開発者が教えるジョブフローTips7選_Kompass発表資料20240306.pptx
Kompira開発者が教えるジョブフローTips7選_Kompass発表資料20240306.pptxManamiMaeda
 
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration勉強会force#4 Chatter Integration
勉強会force#4 Chatter IntegrationKazuki Nakajima
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料時響 逢坂
 
Pythonで始めるDropboxAPI
Pythonで始めるDropboxAPIPythonで始めるDropboxAPI
Pythonで始めるDropboxAPIDaisuke Igarashi
 
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftSwift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftTomohiro Kumagai
 
Local php-100828 2
Local php-100828 2Local php-100828 2
Local php-100828 2Akio Ishida
 
ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】株式会社ランチェスター
 
研究生のためのC++ no.2
研究生のためのC++ no.2研究生のためのC++ no.2
研究生のためのC++ no.2Tomohiro Namba
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.ContextAkira Takahashi
 
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~leverages_event
 
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)Fujio Kojima
 
Perl 非同期プログラミング
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミングlestrrat
 

Ähnlich wie Mock and patch (20)

Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
Unit test in android
Unit test in androidUnit test in android
Unit test in android
 
Kompira開発者が教えるジョブフローTips7選_Kompass発表資料20240306.pptx
Kompira開発者が教えるジョブフローTips7選_Kompass発表資料20240306.pptxKompira開発者が教えるジョブフローTips7選_Kompass発表資料20240306.pptx
Kompira開発者が教えるジョブフローTips7選_Kompass発表資料20240306.pptx
 
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
Pythonで始めるDropboxAPI
Pythonで始めるDropboxAPIPythonで始めるDropboxAPI
Pythonで始めるDropboxAPI
 
Ansible入門...?
Ansible入門...?Ansible入門...?
Ansible入門...?
 
Subprocess no susume
Subprocess no susumeSubprocess no susume
Subprocess no susume
 
Pyramid入門
Pyramid入門Pyramid入門
Pyramid入門
 
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftSwift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswift
 
Ruby test double
Ruby test doubleRuby test double
Ruby test double
 
Applicative functor
Applicative functorApplicative functor
Applicative functor
 
Local php-100828 2
Local php-100828 2Local php-100828 2
Local php-100828 2
 
ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】
 
研究生のためのC++ no.2
研究生のためのC++ no.2研究生のためのC++ no.2
研究生のためのC++ no.2
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.Context
 
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
 
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
 
Perl 非同期プログラミング
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミング
 
Task
TaskTask
Task
 

Mehr von Toru Furukawa

Twitter 広告と API を組み合わせたインタラクティブなキャンペーン
 Twitter 広告と API を組み合わせたインタラクティブなキャンペーン Twitter 広告と API を組み合わせたインタラクティブなキャンペーン
Twitter 広告と API を組み合わせたインタラクティブなキャンペーンToru Furukawa
 
My client wanted their apps synced, and I made it with Go
My client wanted their apps synced, and I made it with GoMy client wanted their apps synced, and I made it with Go
My client wanted their apps synced, and I made it with GoToru Furukawa
 
Introduction to Python 3.4 as of beta 1
Introduction to Python 3.4 as of beta 1Introduction to Python 3.4 as of beta 1
Introduction to Python 3.4 as of beta 1Toru Furukawa
 
Test Failed, Then...
Test Failed, Then...Test Failed, Then...
Test Failed, Then...Toru Furukawa
 
おまえらこのライブラリ使ってないの? m9 (2013-07)
おまえらこのライブラリ使ってないの? m9	(2013-07)おまえらこのライブラリ使ってないの? m9	(2013-07)
おまえらこのライブラリ使ってないの? m9 (2013-07)Toru Furukawa
 
Trying Continuous Delivery - pyconjp 2012
Trying Continuous Delivery - pyconjp 2012Trying Continuous Delivery - pyconjp 2012
Trying Continuous Delivery - pyconjp 2012Toru Furukawa
 
Python 3.3 チラ見
Python 3.3 チラ見Python 3.3 チラ見
Python 3.3 チラ見Toru Furukawa
 
Python32 pyhackathon-201011
Python32 pyhackathon-201011Python32 pyhackathon-201011
Python32 pyhackathon-201011Toru Furukawa
 

Mehr von Toru Furukawa (11)

Twitter 広告と API を組み合わせたインタラクティブなキャンペーン
 Twitter 広告と API を組み合わせたインタラクティブなキャンペーン Twitter 広告と API を組み合わせたインタラクティブなキャンペーン
Twitter 広告と API を組み合わせたインタラクティブなキャンペーン
 
My client wanted their apps synced, and I made it with Go
My client wanted their apps synced, and I made it with GoMy client wanted their apps synced, and I made it with Go
My client wanted their apps synced, and I made it with Go
 
Introduction to Python 3.4 as of beta 1
Introduction to Python 3.4 as of beta 1Introduction to Python 3.4 as of beta 1
Introduction to Python 3.4 as of beta 1
 
Test Failed, Then...
Test Failed, Then...Test Failed, Then...
Test Failed, Then...
 
おまえらこのライブラリ使ってないの? m9 (2013-07)
おまえらこのライブラリ使ってないの? m9	(2013-07)おまえらこのライブラリ使ってないの? m9	(2013-07)
おまえらこのライブラリ使ってないの? m9 (2013-07)
 
Trying Continuous Delivery - pyconjp 2012
Trying Continuous Delivery - pyconjp 2012Trying Continuous Delivery - pyconjp 2012
Trying Continuous Delivery - pyconjp 2012
 
Python 3.3 チラ見
Python 3.3 チラ見Python 3.3 チラ見
Python 3.3 チラ見
 
Python32 pyhackathon-201011
Python32 pyhackathon-201011Python32 pyhackathon-201011
Python32 pyhackathon-201011
 
Django
Django Django
Django
 
Python 2.7
Python 2.7Python 2.7
Python 2.7
 
BPStudy#34 導入
BPStudy#34 導入BPStudy#34 導入
BPStudy#34 導入
 

Mock and patch