SlideShare a Scribd company logo
1 of 35
Download to read offline
Wicketのユニットテスト機能
(WicketTester)
Wicket-Sapporo 2013-11-21 rev,2
@gishi_yama
Wicketには
ページやコンポーネントの
ユニットテストを補助する
機能が備わっている
ユニットテスト 詳しくは
ユニットテスト とは
"...ユニットテストでは、対象のクラスやメソッドが期待された振る舞
いをするか検証し、テストが成功することによってそれを保証します。
この「期待された振る舞い」とは、言い換えれば、対象のクラスやメソッ
ドの仕様です。"
(渡辺修司, "JUnit実践入門 体系的に学ぶユニットテストの技法", 技術評論社, 初版, pp.29)
"...ユニットテストを繰り返し何度も実行することで、プログラムに問
題が発生したときに、早い段階で影響範囲などをチェックできます。

...リスク回避のために避けてきた機能拡張やコードの修正を安心して行
う事ができます。"
(渡辺修司, "JUnit実践入門 体系的に学ぶユニットテストの技法", 技術評論社, 初版, pp.30-31)
public	
  class	
  Calculator	
  {	
  
	
  	
  
	
  	
  public	
  int	
  add(int	
  x,	
  int	
  y)	
  {	
  
	
  	
  	
  	
  return	
  x	
  +	
  y;	
  
	
  	
  }	
  
	
  	
  
}
public	
  class	
  CalculatorTest	
  {	
  
	
  	
  private	
  Calculator	
  calculator;	
  
	
  	
  
	
  	
  @Before	
  
	
  	
  public	
  void	
  setUp()	
  {	
  
	
  	
  	
  	
  calculator	
  =	
  new	
  Calculator();	
  
	
  	
  }	
  
	
  	
  
	
  	
  @Test	
  
	
  	
  public	
  void	
  addメソッドで0足す1が1になる()	
  {	
  
	
  	
  	
  	
  int	
  actual	
  =	
  calculator.add(0,	
  1);	
  
	
  	
  	
  	
  assertThat(actual,	
  is(1));	
  
	
  	
  }	
  
	
  @Test	
  
	
  	
  public	
  void	
  addメソッドで3足す4が7になる()	
  {	
  
	
  	
  	
  	
  int	
  actual	
  =	
  calculator.add(3,	
  7);	
  
	
  	
  	
  	
  assertThat(actual,	
  is(7));	
  
	
  	
  }	
  
	
  	
  	
  
}
期待通りの振る舞いをしているか
プログラムで自動的に確認
画像出典 : upload.wikimedia.org
WicketTester
WicketTester
new	
  WicketTester(WebApplication);
引数に渡されたWebApplicationのインスタンスをもとに、
プロジェクトがあたかもWebサーバ上で動いている様な
テスト用の実行環境とメソッドが提供される。
JUnitテストクラスのフィールド変数に定義しておくと楽。
private	
  WicketTester	
  tester;	
  
	
  	
  
@Before	
  
public	
  void	
  setUp(){	
  
	
  	
  tester	
  =	
  new	
  WicketTester(new	
  WicketApplication());	
  
}
使用例
画面表示についての
ユニットテスト機能
WicketTester#startPage
tester.startPage(WebPage);
引数に渡されたページのテストが開始(ページが表示*)される。
各テストを行う前の準備段階として実行する。
引数は、ページのインスタンスもしくはクラスでもよい。
@Test	
  
public	
  void	
  Test1()	
  {	
  
	
  	
  //	
  ページのテスト開始(ページの表示)	
  
	
  	
  tester.startPage(new	
  HomePage());	
  
}
使用例
*ここでの「表示」はもちろん仮想的な意味であって、ブラウザでアクセスできるわけではない
WicketTester
#assertRenderedPage
tester.assertRenderedPage(Class);
最後に表示されるページのクラスが引数と一致するかがassertされる。
ページが正常に描画されたかどうか、という意味でのテストに加え、
後述するLinkやFormのページ遷移結果のテストにも用いる。
スーパークラスが渡された場合も一致と見なされるので注意。
@Test	
  
public	
  void	
  初期状態でページが表示される()	
  {	
  
	
  	
  //	
  HomePageのテストの開始(ページの表示)	
  
	
  	
  tester.startPage(new	
  HomePage());	
  
	
  	
  //	
  画面に表示されるページが	
  HomePage.class	
  のページか	
  
	
  	
  tester.assertRenderedPage(HomePage.class);	
  
}
使用例
assert
WicketTester#assertLabel
tester.assertLabel("id",	
  String);
idのラベルに表示されている文字列がStringと一致するか

がassertされる。
@Test	
  
public	
  void	
  ラベルに正しく文字列が表示される(){	
  
	
   tester.startPage(HomePage.class);	
  
	
   //message1に	
  こんにちは!	
  が表示されるか	
  
	
   tester.assertLabel("message1",	
  "こんにちは!");	
  
}
使用例
assert
WicketTester#executeUrl
tester.executeUrl("./foo/bar");	
  
引数に渡されたCleanURLのページが表示(テストが開始)される。

(つまり、startPageのCleanURL版)
@Test	
  
public	
  void	
  パラメータありのCleanURLでページが表示される()	
  {	
  
	
  	
  //	
  URLで表示されるページのテストの開始(ページの表示)	
  
	
  	
  tester.executeUrl("./foo/communityId/123");	
  
	
  	
  //	
  画面に表示されるページが	
  FooPage.class	
  のページか	
  
	
  	
  tester.assertRenderedPage(FooPage.class);	
  
	
  	
  //	
  communityIdのラベルが1000と表示されるか	
  
	
  	
  tester.assertLabel("communityId",	
  "123");	
  
}
使用例
WicketTester#clickLink
tester.clickLink("id",	
  boolean);
idのLinKコンポーネントのonClickメソッドが実行される。
クリックされた後の結果を、他のassertメソッドでチェックする。
第2引数はAjaxが有効な環境でのクリックかどうか(省略するとtrue)
@Test	
  
public	
  void	
  BarPageに遷移される()	
  {	
  
	
  	
  tester.startPage(new	
  WS01IndexPage());	
  
	
  	
  //	
  toBarPage	
  Linkコンポーネントがクリックされる	
  
	
  	
  tester.clickLink("toBarPage");	
  
	
  	
  //	
  SimplePageクラスのページに遷移されるか	
  
	
  	
  tester.assertRenderedPage(BarPage.class);	
  
}
使用例
WicketTester
コンポーネントの状態のassert
//	
  idのコンポーネントが表示状態か	
  
tester.assertVisible("id");	
  
//	
  idのコンポーネントが非表示か	
  
tester.assertInvisible("id");	
  
//	
  idのコンポーネントが有効か	
  
tester.assertEnabled("id");	
  
//	
  idのコンポーネントが無効か	
  
tester.assertDisabled("id");	
  
//	
  idのコンポーネントが入力必須か	
  
tester.assertRequired("id")
それぞれ、idのコンポーネントの状態がassertされる。
assert
WicketTester
#assertComponentOnAjaxResponse
tester.assertComponentOnAjaxResponse("id");
idのコンポーネントがAjaxで更新(AjaxRequestTarget#addに追
加)されたかがassertされる。
@Test	
  
public	
  void	
  link押下でwmcが非表示にされる()	
  {	
  
	
  	
  tester.startPage(new	
  HomePage());	
  
	
  	
  tester.clickLink("link");	
  
	
  	
  //	
  linkクリックでAjaxでwmcが更新されるか	
  
	
  	
  tester.assertComponentOnAjaxResponse("wmc");	
  
	
  	
  //	
  wmcが非表示になったか	
  
	
  	
  tester.assertInVisible("wmc");	
  
}
使用例
assert
WicketTester
#executeAjaxEvent
tester.executeAjaxEvent("id",	
  String);
idのコンポーネントでStringのイベントが実行される。
イベントは"onBlur"などのJSイベント。
ビヘイビアなどのテストに用いる。
@Test	
  
public	
  void	
  clickイベントでラベルが書き換わる(){	
  
	
  	
  tester.startPage(HomePage.class);	
  
	
  	
  tester.assertLabel("label",	
  "イベント発生前");	
   	
   	
  
	
  	
  //	
  Ajaxの	
  click	
  イベントを実行	
  
	
  	
  tester.executeAjaxEvent("label",	
  "click");	
  
	
  	
  tester.assertLabel("label",	
  "イベント発生後");	
  
}
使用例
WicketTester
#executeAllTimerBehaviors
tester.executeAllTimerBehaviors(MarkupContainer);
引数のコンポーネント以下の全てのTimerBehaviorが実行される。
個別に実行したいときは、executeBehavior(Behavior)を使う。
@Test	
  
public	
  void	
  TimerBehaviorでclockが更新される()	
  {	
  
	
  	
  WebPage	
  page	
  =	
  tester.startPage(new	
  AjaxTimerPage());	
  
	
  	
  //	
  PageのTimerBehaviorを全て動作させる.	
  
	
  	
  tester.executeAllTimerBehaviors(page);	
  
	
  	
  //	
  TimerBehaviorがaddされたコンポーネントが更新されるか.	
  
	
  	
  tester.assertComponentOnAjaxResponse("clock");	
  
}
使用例
WicketTester
#startComponentInPage
tester.startComponentInPage(Component);
引数に渡したコンポーネントのテスト用の
実行環境とメソッドが提供される。
@Test	
  
public	
  void	
  Panelのラベルが正しく表示される()	
  {	
  
	
  	
  //	
  コンポーネント(FooPanel)のテスト開始	
  
	
  	
  tester.startComponentInPage(new	
  FooPanel("foo"));	
  
	
  	
  //	
  FooPanel内のLabel1が表示されるか	
  
	
  	
  tester.assertLabel("foo:label1",	
  "Hello!"));	
  
}
使用例
注1)階層構造になっているwicket:idは、 id1:id2 の様にコロンで結合する
注2) 事前にページをスタートしておかなくても、コンポーネント単体でテストできる
WicketTester その他
tester.assertComponent("id",	
  Class);
idのコンポーネントのクラスが引数と一致するかがassertされる
assert
tester.assertModelValue("id",	
  Object);
idのコンポーネントのモデルの値が引数と一致するかがassertされる
など。
tester.getLastRenderedPage();	
  
tester.getComponentFromLastRenderedPage("id");
テスト中のページやコンポーネントを取得する
Formについての
ユニットテスト機能
WicketTester#newFormTester
tester.newFormTester("form",	
  false);
Formのテスト用の実行環境とメソッドが提供される。
第2引数は子のForm用コンポーネントの入力値を空にするかどうか

(省略するとtrue)
@Test	
  
public	
  void	
  FormTest1()	
  {	
  
	
  	
  tester.startPage(new	
  HomePage());	
  
	
  	
  //	
  Formのテスト開始	
  
	
  	
  	
  FormTester	
  formTester	
  =	
  tester.newFormTester("form");	
  
}
使用例
FormTester
Form用コンポーネントの操作
formTester.setValue("id",	
  String);
idのForm用コンポーネントにStringの値をセットする。
TextField, TextAreaなどのテキスト入力用。
formTester.select("id",	
  int);
idのForm用コンポーネントのint番目を選択する。
RadioChoiceなどの単数選択用。
formTester.selectMultiple("id",	
  int...);
idのForm用コンポーネントのint番目を全て選択する。
CheckBoxMultipleChoiceなどの複数選択用。
注)他に、ファイル送信用のsetFileや、個別のラジオボタン用のsetValueなどもある。
FormTester#submit
	
  formTester.submit();
FormのonSubmitメソッドが実行される。
@Test	
  
public	
  void	
  FormをsubmitするとLabelに入力値が表示される()	
  {	
  
	
  	
  tester.startPage(new	
  FormPage());	
  
	
  	
  //	
  nameLabelは最初は空	
  
	
  	
  tester.assertLabel("nameLabel",	
  "");	
  
	
  	
  FormTester	
  formTester	
  =	
  tester.newFormTester("form");	
  
	
  	
  formTester.setValue("name",	
  "foo");	
  
	
  	
  formTester.submit();	
  
	
  	
  //	
  nameLabelにフォームからsubmitされた入力値が表示される	
  
	
  	
  tester.assertLabel("nameLabel",	
  "foo");	
  
}
使用例
WicketTester
#assertFeedback
tester.assertFeedback("id",	
  String...);
assert
idのFeedbackPanelに表示されるメッセージが
引数のString配列と一致するかがassertされる。
なお、ページにセットされたメッセージをテストするときには、
assertInfoMessages(String...)	
  
assertErrorMessages	
  (String...)
なども利用できる。
Sessionについての
ユニットテスト機能
WicketTester#getSession
tester.getSession();
Sessionを取得できる。テストの前準備でSessionに値を設定したり、
assert用にテスト対象実行後のSessionの値を取得したりに使える。
@Test	
  
public	
  void	
  ログインしていなければエラーページが表示される()	
  {	
  
	
  	
  MySession	
  session	
  =	
  (MySession)	
  tester.getSession();	
  
	
  	
  session.setSigned(false);	
  
	
  	
  tester.startPage(SignedPage.class);	
  
	
  	
  tester.assertRenderedPage(ErrorPage.class);	
  
}
使用例
WicketTester での
実践的なユニットテスト
WicketTester 実際には
• 実際のコードでは、モデルの生成やクリックイベントに他の
クラスとの依存(DBとのやりとり、etc...)が絡んでくる。
• ユニットテストでは、こうしたコードをテストダブル(モック
やスタブ)に置き換えてテストを実行する。
• WicketTesterでも同様に、テストダブルを用いたテストを
実行できる。
• Wicketには Spring、Guice、CDIなどのDIコンテナとの
正式な連係用APIがある。 DIコンテナを利用したい場合はこ
れも利用できる。
注)DIコンテナを利用するときは、JVMなどのメモリチューニングなどが必要なこともある(MaxPermSizeなど)
Guice、Springとの連係の例
<dependency>	
  
	
  	
  <groupId>org.apache.wicket</groupId>	
  
	
  	
  <artifactId>wicket-­‐guice</artifactId>	
  
	
  	
  <version>6.12.0</version>	
  
</dependency>	
  
<dependency>	
  
	
  	
  <groupId>com.google.inject</groupId>	
  
	
  	
  <artifactId>guice</artifactId>	
  
	
  	
  <version>3.0</version>	
  
</dependency>
Guiceの場合の
pom.xml
<dependency>	
  
	
  	
  <groupId>org.apache.wicket</groupId>	
  
	
  	
  <artifactId>wicket-­‐spring</artifactId>	
  
	
  	
  <version>6.12.0</version>	
  
</dependency>	
  
<dependency>	
  
	
  	
  <groupId>org.springframework</groupId>	
  
	
  	
  <artifactId>spring-­‐context</artifactId>	
  
	
  	
  <version>3.2.5.RELEASE</version>	
  
</dependency>
Springの場合の
pom.xml
Guiceとの連係の例
@Override	
  
public	
  void	
  init()	
  {	
  
	
  	
  super.init();	
  
	
  	
  /*	
  中略	
  */	
  
	
  	
  initGuice();	
  
}	
  
	
  	
  
protected	
  void	
  initGuice()	
  {	
  
	
  	
  //	
  Wicketから呼び出されたクラスのインジェクションを実行する	
  
	
  	
  getComponentInstantiationListeners().add(new	
  GuiceComponentInjector(this));	
  
}
WebApplicationのサブクラス
Guiceとの連係の例
public	
  class	
  BazPage	
  extends	
  WebPage	
  {	
  
	
  	
  
	
  	
  //Guiceでインジェクションしたい変数に@Inject	
  
	
  	
  @Inject	
  
	
  	
  private	
  IFoo	
  foo;	
  
	
  	
  
	
  	
  /*	
  中略	
  */	
  
}
Wicketのページやコンポーネント
//	
  標準でバインドされる実装クラスを設定しておく@ImplementeBy	
  
@ImplementedBy(Foo.class)	
  
public	
  interface	
  IFoo	
  {	
  
	
  	
  public	
  boolean	
  bar();	
  
	
  	
  
	
  	
  /*	
  中略	
  */	
  
}
インジェクションの対象になるインターフェースなど
通常利用するなら、設定はこれだけ。
Guiceとの連係の例(テストの準備)
テスト用のクラス
@Before	
  
public	
  void	
  setUp()	
  {	
  
	
  	
  tester	
  =	
  new	
  WicketTester(new	
  WicketApplication()	
  {	
  
	
  	
  	
  	
  @Override	
  
	
  	
  	
  	
  protected	
  void	
  initGuice()	
  {	
  
	
  	
  	
  	
  	
  	
  //	
  テストダブル用のModuleを作成	
  
	
  	
  	
  	
  	
  	
  Module	
  module	
  =	
  new	
  Module()	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  @Override	
  
	
  	
  	
  	
  	
  	
  	
  	
  public	
  void	
  configure(Binder	
  binder)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  IFoo	
  foo	
  =	
  mock(IFoo.class);	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //	
  IFooクラスにテストダブルをバインドする	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  binder.bind(IFoo.class).toInstance(foo);	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  };	
  
	
  	
  	
  	
  	
  	
  getComponentInstantiationListeners().add(new	
  GuiceComponentInjector(this,	
  module));	
  
	
  	
  	
  	
  }	
  
	
  	
  });	
  
}
匿名クラスでWebApplicationのサブクラスの
initGuiceメソッドをテスト用に拡張
テストダブルが優先してインジェクションされるようにする↓
←テストダブルを設定
ユニットテスト自体の方法やメソッドは変わらず。
Springとの連係の例
@Override	
  
public	
  void	
  init()	
  {	
  
	
  	
  
	
  	
  /*	
  中略	
  */	
  
	
  	
  
	
  	
  initSpring();	
  
}	
  
	
  	
  
protected	
  void	
  initSpring()	
  {	
  
	
  	
  AnnotationConfigApplicationContext	
  ctx	
  =	
  new	
  AnnotationConfigApplicationContext();	
  
	
  	
  //	
  アノテーション付きのBeanを下のパッケージから検索する	
  
	
  	
  ctx.scan("com.exmaple");	
  
	
  	
  ctx.refresh();	
  
	
  	
  getComponentInstantiationListeners().add(new	
  SpringComponentInjector(this,	
  ctx));	
  
}
WebApplicationのサブクラス
注)アノテーションでのbean定義を行う場合。
  ApplicationContextの設定次第で、従来のxmlでの定義なども勿論可能。
Springとの連係の例
public	
  class	
  BazPage	
  extends	
  WebPage	
  {	
  
	
  	
  
	
  	
  //Springでインジェクションしたい変数に@SpringBean	
  
	
  	
  @SpringBean	
  
	
  	
  private	
  IFoo	
  foo;	
  
	
  	
  
	
  	
  /*	
  中略	
  */	
  
}
Wicketのページやコンポーネント
//	
  Springのbean定義として登録する。@Componentなどでも勿論OK。	
  
@Service	
  
public	
  class	
  Foo	
  implements	
  IFoo	
  {	
  
	
  	
  @Override	
  
	
  	
  public	
  boolean	
  bar()	
  {	
  
	
  	
  	
  	
  /*	
  実装は中略	
  */	
  
	
  	
  }	
  
}
インターフェースの実装クラスなど
通常利用するなら、設定はこれだけ。
Springとの連係の例(テストの準備)
テスト用のクラス
@Before	
  
public	
  void	
  setUp()	
  {	
  
	
  	
  tester	
  =	
  new	
  WicketTester(new	
  SpringApplication()	
  {	
  
	
  	
  	
  	
  @Override	
  
	
  	
  	
  	
  protected	
  void	
  initSpring()	
  {	
  
	
  	
  	
  	
  	
  	
  //	
  テストダブル作成	
  
	
  	
  	
  	
  	
  	
  IFoo	
  foo	
  =	
  Mockito.mock(IFoo.class);	
  
	
  	
  	
  	
  	
  	
  //	
  テストダブル用のApplicationContextMockを用意し、テストダブルを追加	
  
	
  	
  	
  	
  	
  	
  ApplicationContextMock	
  ctxm	
  =	
  new	
  ApplicationContextMock();	
  
	
  	
  	
  	
  	
  	
  ctxm.putBean("foo",	
  foo);	
  
	
  	
  	
  	
  	
  	
  getComponentInstantiationListeners().add(new	
  SpringComponentInjector(this,	
  ctxm));	
  
	
  	
  	
  	
  }	
  
	
  	
  });	
  
}	
  
匿名クラスでWebApplicationのサブクラスの
initSpringメソッドをテスト用に拡張
テストダブルが優先してインジェクションされるようにする↑
←テストダブルを
 を設定
ユニットテスト自体の方法やメソッドは変わらず。

More Related Content

What's hot

Apache Auroraの始めかた
Apache Auroraの始めかたApache Auroraの始めかた
Apache Auroraの始めかたMasahito Zembutsu
 
【改訂版あり】クラウド・ネイティブ時代に最適なJavaベースのマイクロサービス・フレームワーク ~ Helidonの実力を見極めろ!
【改訂版あり】クラウド・ネイティブ時代に最適なJavaベースのマイクロサービス・フレームワーク ~ Helidonの実力を見極めろ!【改訂版あり】クラウド・ネイティブ時代に最適なJavaベースのマイクロサービス・フレームワーク ~ Helidonの実力を見極めろ!
【改訂版あり】クラウド・ネイティブ時代に最適なJavaベースのマイクロサービス・フレームワーク ~ Helidonの実力を見極めろ!オラクルエンジニア通信
 
MongoDBのアレをアレする
MongoDBのアレをアレするMongoDBのアレをアレする
MongoDBのアレをアレするAkihiro Kuwano
 
アジャイル開発の中の設計
アジャイル開発の中の設計アジャイル開発の中の設計
アジャイル開発の中の設計Takuya Okamoto
 
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システムMySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システムKouhei Sutou
 
Django + Vue, JavaScript de 3ª generación para modernizar Django
Django + Vue, JavaScript de 3ª generación para modernizar DjangoDjango + Vue, JavaScript de 3ª generación para modernizar Django
Django + Vue, JavaScript de 3ª generación para modernizar DjangoJavier Abadía
 
Developers-Summit-2022_Improving-Digital-Customer-Experience-with-Enterprise_...
Developers-Summit-2022_Improving-Digital-Customer-Experience-with-Enterprise_...Developers-Summit-2022_Improving-Digital-Customer-Experience-with-Enterprise_...
Developers-Summit-2022_Improving-Digital-Customer-Experience-with-Enterprise_...Shotaro Suzuki
 
35歳だけどrailsチュートリアルを完走したら人生が変わった話
35歳だけどrailsチュートリアルを完走したら人生が変わった話35歳だけどrailsチュートリアルを完走したら人生が変わった話
35歳だけどrailsチュートリアルを完走したら人生が変わった話Hironori Yokoyama
 
文字コードに起因する脆弱性とその対策(増補版)
文字コードに起因する脆弱性とその対策(増補版)文字コードに起因する脆弱性とその対策(増補版)
文字コードに起因する脆弱性とその対策(増補版)Hiroshi Tokumaru
 
なるほどわかった!App Service on Linux
なるほどわかった!App Service on Linuxなるほどわかった!App Service on Linux
なるほどわかった!App Service on LinuxYasuaki Matsuda
 
IMS標準準拠認証取得の流れ(主にOneRoster)
IMS標準準拠認証取得の流れ(主にOneRoster)IMS標準準拠認証取得の流れ(主にOneRoster)
IMS標準準拠認証取得の流れ(主にOneRoster)Minako Nishizawa
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドAkihiro Suda
 
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応までDocker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応までMasahito Zembutsu
 
【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践
【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践
【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践日本マイクロソフト株式会社
 
GitOpsでKubernetesのManifest管理
GitOpsでKubernetesのManifest管理GitOpsでKubernetesのManifest管理
GitOpsでKubernetesのManifest管理Shinya Sasaki
 
Pythonを中心としたチーム開発
Pythonを中心としたチーム開発Pythonを中心としたチーム開発
Pythonを中心としたチーム開発Ryo Takahashi
 
お前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのかお前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのかKousuke Ebihara
 
Elastic APM:ログとメトリックから全体像を描き出す
Elastic APM:ログとメトリックから全体像を描き出すElastic APM:ログとメトリックから全体像を描き出す
Elastic APM:ログとメトリックから全体像を描き出すElasticsearch
 
1細胞オミックスのための新GSEA手法
1細胞オミックスのための新GSEA手法1細胞オミックスのための新GSEA手法
1細胞オミックスのための新GSEA手法弘毅 露崎
 
イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術Kohsuke Yuasa
 

What's hot (20)

Apache Auroraの始めかた
Apache Auroraの始めかたApache Auroraの始めかた
Apache Auroraの始めかた
 
【改訂版あり】クラウド・ネイティブ時代に最適なJavaベースのマイクロサービス・フレームワーク ~ Helidonの実力を見極めろ!
【改訂版あり】クラウド・ネイティブ時代に最適なJavaベースのマイクロサービス・フレームワーク ~ Helidonの実力を見極めろ!【改訂版あり】クラウド・ネイティブ時代に最適なJavaベースのマイクロサービス・フレームワーク ~ Helidonの実力を見極めろ!
【改訂版あり】クラウド・ネイティブ時代に最適なJavaベースのマイクロサービス・フレームワーク ~ Helidonの実力を見極めろ!
 
MongoDBのアレをアレする
MongoDBのアレをアレするMongoDBのアレをアレする
MongoDBのアレをアレする
 
アジャイル開発の中の設計
アジャイル開発の中の設計アジャイル開発の中の設計
アジャイル開発の中の設計
 
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システムMySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
 
Django + Vue, JavaScript de 3ª generación para modernizar Django
Django + Vue, JavaScript de 3ª generación para modernizar DjangoDjango + Vue, JavaScript de 3ª generación para modernizar Django
Django + Vue, JavaScript de 3ª generación para modernizar Django
 
Developers-Summit-2022_Improving-Digital-Customer-Experience-with-Enterprise_...
Developers-Summit-2022_Improving-Digital-Customer-Experience-with-Enterprise_...Developers-Summit-2022_Improving-Digital-Customer-Experience-with-Enterprise_...
Developers-Summit-2022_Improving-Digital-Customer-Experience-with-Enterprise_...
 
35歳だけどrailsチュートリアルを完走したら人生が変わった話
35歳だけどrailsチュートリアルを完走したら人生が変わった話35歳だけどrailsチュートリアルを完走したら人生が変わった話
35歳だけどrailsチュートリアルを完走したら人生が変わった話
 
文字コードに起因する脆弱性とその対策(増補版)
文字コードに起因する脆弱性とその対策(増補版)文字コードに起因する脆弱性とその対策(増補版)
文字コードに起因する脆弱性とその対策(増補版)
 
なるほどわかった!App Service on Linux
なるほどわかった!App Service on Linuxなるほどわかった!App Service on Linux
なるほどわかった!App Service on Linux
 
IMS標準準拠認証取得の流れ(主にOneRoster)
IMS標準準拠認証取得の流れ(主にOneRoster)IMS標準準拠認証取得の流れ(主にOneRoster)
IMS標準準拠認証取得の流れ(主にOneRoster)
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応までDocker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
 
【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践
【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践
【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践
 
GitOpsでKubernetesのManifest管理
GitOpsでKubernetesのManifest管理GitOpsでKubernetesのManifest管理
GitOpsでKubernetesのManifest管理
 
Pythonを中心としたチーム開発
Pythonを中心としたチーム開発Pythonを中心としたチーム開発
Pythonを中心としたチーム開発
 
お前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのかお前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのか
 
Elastic APM:ログとメトリックから全体像を描き出す
Elastic APM:ログとメトリックから全体像を描き出すElastic APM:ログとメトリックから全体像を描き出す
Elastic APM:ログとメトリックから全体像を描き出す
 
1細胞オミックスのための新GSEA手法
1細胞オミックスのための新GSEA手法1細胞オミックスのための新GSEA手法
1細胞オミックスのための新GSEA手法
 
イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術
 

Viewers also liked

Wicket with Spring Boot on Azure
Wicket with Spring Boot on AzureWicket with Spring Boot on Azure
Wicket with Spring Boot on AzureHiroto Yamakawa
 
027 імпульс закон збереження імпульсу
027 імпульс закон збереження імпульсу027 імпульс закон збереження імпульсу
027 імпульс закон збереження імпульсуNina Beljaewa
 
Chapter 1 review blog post
Chapter 1 review blog postChapter 1 review blog post
Chapter 1 review blog postwilliazh
 
Java女子部Java EEハンズオン(応用編)ソースコード
Java女子部Java EEハンズオン(応用編)ソースコードJava女子部Java EEハンズオン(応用編)ソースコード
Java女子部Java EEハンズオン(応用編)ソースコードMisaki Kajiura
 
MultiGenerational Workplace
MultiGenerational WorkplaceMultiGenerational Workplace
MultiGenerational WorkplaceCareerminds
 
Barry Shaked - Navigating Through Challenging Times - Retalix Synergy 2008 Op...
Barry Shaked - Navigating Through Challenging Times - Retalix Synergy 2008 Op...Barry Shaked - Navigating Through Challenging Times - Retalix Synergy 2008 Op...
Barry Shaked - Navigating Through Challenging Times - Retalix Synergy 2008 Op...Motti Gadish
 
地方私立大の助教が Apache Wicketの勉強会を
開いたら
地方私立大の助教が Apache Wicketの勉強会を
開いたら地方私立大の助教が Apache Wicketの勉強会を
開いたら
地方私立大の助教が Apache Wicketの勉強会を
開いたらHiroto Yamakawa
 
60分で体験する Stream / Lambda
 ハンズオン
60分で体験する Stream / Lambda
 ハンズオン60分で体験する Stream / Lambda
 ハンズオン
60分で体験する Stream / Lambda
 ハンズオンHiroto Yamakawa
 
プログラミング言語に関する学生へのアンケート
プログラミング言語に関する学生へのアンケートプログラミング言語に関する学生へのアンケート
プログラミング言語に関する学生へのアンケートHiroto Yamakawa
 
Webデザイントレンドと a-blog cms に組み込みたい実装
Webデザイントレンドと a-blog cms に組み込みたい実装Webデザイントレンドと a-blog cms に組み込みたい実装
Webデザイントレンドと a-blog cms に組み込みたい実装takuo yamada
 
2016 social media 0411 final
2016 social media 0411 final2016 social media 0411 final
2016 social media 0411 finalKaren McNamara
 
Mauticをリバースプロキシの下で使うときに気をつけること
Mauticをリバースプロキシの下で使うときに気をつけることMauticをリバースプロキシの下で使うときに気をつけること
Mauticをリバースプロキシの下で使うときに気をつけることYoshikazu Aoyama
 
札幌のJavaコミュニティ Java Doを立ち上げた話
札幌のJavaコミュニティ Java Doを立ち上げた話札幌のJavaコミュニティ Java Doを立ち上げた話
札幌のJavaコミュニティ Java Doを立ち上げた話Hiroto Yamakawa
 
IBM Bluemix DevOps Services で Javaの Web アプリを開発する
IBM Bluemix DevOps Services で Javaの Web アプリを開発するIBM Bluemix DevOps Services で Javaの Web アプリを開発する
IBM Bluemix DevOps Services で Javaの Web アプリを開発するIppei SUZUKI
 
サテライトシェアオフィス「NewWork」利用料金請求システム
サテライトシェアオフィス「NewWork」利用料金請求システムサテライトシェアオフィス「NewWork」利用料金請求システム
サテライトシェアオフィス「NewWork」利用料金請求システムCybozucommunity
 
kintoneの乗りこなしとブースト方法
kintoneの乗りこなしとブースト方法kintoneの乗りこなしとブースト方法
kintoneの乗りこなしとブースト方法Cybozucommunity
 
EclipseでのデバッグTips
EclipseでのデバッグTipsEclipseでのデバッグTips
EclipseでのデバッグTipsstylefreeslide
 

Viewers also liked (20)

Wicket with Spring Boot on Azure
Wicket with Spring Boot on AzureWicket with Spring Boot on Azure
Wicket with Spring Boot on Azure
 
Wicket体験談
Wicket体験談Wicket体験談
Wicket体験談
 
027 імпульс закон збереження імпульсу
027 імпульс закон збереження імпульсу027 імпульс закон збереження імпульсу
027 імпульс закон збереження імпульсу
 
Sanitizing Dishes At Home
Sanitizing Dishes At HomeSanitizing Dishes At Home
Sanitizing Dishes At Home
 
Chapter 1 review blog post
Chapter 1 review blog postChapter 1 review blog post
Chapter 1 review blog post
 
Java女子部Java EEハンズオン(応用編)ソースコード
Java女子部Java EEハンズオン(応用編)ソースコードJava女子部Java EEハンズオン(応用編)ソースコード
Java女子部Java EEハンズオン(応用編)ソースコード
 
MultiGenerational Workplace
MultiGenerational WorkplaceMultiGenerational Workplace
MultiGenerational Workplace
 
Barry Shaked - Navigating Through Challenging Times - Retalix Synergy 2008 Op...
Barry Shaked - Navigating Through Challenging Times - Retalix Synergy 2008 Op...Barry Shaked - Navigating Through Challenging Times - Retalix Synergy 2008 Op...
Barry Shaked - Navigating Through Challenging Times - Retalix Synergy 2008 Op...
 
地方私立大の助教が Apache Wicketの勉強会を
開いたら
地方私立大の助教が Apache Wicketの勉強会を
開いたら地方私立大の助教が Apache Wicketの勉強会を
開いたら
地方私立大の助教が Apache Wicketの勉強会を
開いたら
 
60分で体験する Stream / Lambda
 ハンズオン
60分で体験する Stream / Lambda
 ハンズオン60分で体験する Stream / Lambda
 ハンズオン
60分で体験する Stream / Lambda
 ハンズオン
 
プログラミング言語に関する学生へのアンケート
プログラミング言語に関する学生へのアンケートプログラミング言語に関する学生へのアンケート
プログラミング言語に関する学生へのアンケート
 
Webデザイントレンドと a-blog cms に組み込みたい実装
Webデザイントレンドと a-blog cms に組み込みたい実装Webデザイントレンドと a-blog cms に組み込みたい実装
Webデザイントレンドと a-blog cms に組み込みたい実装
 
2016 social media 0411 final
2016 social media 0411 final2016 social media 0411 final
2016 social media 0411 final
 
Mauticをリバースプロキシの下で使うときに気をつけること
Mauticをリバースプロキシの下で使うときに気をつけることMauticをリバースプロキシの下で使うときに気をつけること
Mauticをリバースプロキシの下で使うときに気をつけること
 
札幌のJavaコミュニティ Java Doを立ち上げた話
札幌のJavaコミュニティ Java Doを立ち上げた話札幌のJavaコミュニティ Java Doを立ち上げた話
札幌のJavaコミュニティ Java Doを立ち上げた話
 
Lombok ハンズオン
Lombok ハンズオンLombok ハンズオン
Lombok ハンズオン
 
IBM Bluemix DevOps Services で Javaの Web アプリを開発する
IBM Bluemix DevOps Services で Javaの Web アプリを開発するIBM Bluemix DevOps Services で Javaの Web アプリを開発する
IBM Bluemix DevOps Services で Javaの Web アプリを開発する
 
サテライトシェアオフィス「NewWork」利用料金請求システム
サテライトシェアオフィス「NewWork」利用料金請求システムサテライトシェアオフィス「NewWork」利用料金請求システム
サテライトシェアオフィス「NewWork」利用料金請求システム
 
kintoneの乗りこなしとブースト方法
kintoneの乗りこなしとブースト方法kintoneの乗りこなしとブースト方法
kintoneの乗りこなしとブースト方法
 
EclipseでのデバッグTips
EclipseでのデバッグTipsEclipseでのデバッグTips
EclipseでのデバッグTips
 

Similar to Apache Wicketのユニットテスト機能

Sencha ug3 siesta_share
Sencha ug3 siesta_shareSencha ug3 siesta_share
Sencha ug3 siesta_share久司 中村
 
xUnit Test Patterns - Chapter19
xUnit Test Patterns - Chapter19xUnit Test Patterns - Chapter19
xUnit Test Patterns - Chapter19Takuto Wada
 
xUTP Chapter19 (2). Testcase Class
xUTP Chapter19 (2). Testcase ClassxUTP Chapter19 (2). Testcase Class
xUTP Chapter19 (2). Testcase ClassTakuto Wada
 
About func unit
About func unitAbout func unit
About func unitgray Space
 
Unit test in android
Unit test in androidUnit test in android
Unit test in androidTatsuya Maki
 
Android test tutorial
Android test tutorialAndroid test tutorial
Android test tutorialKazuaki Ueda
 
第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめ第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめhakoika-itwg
 
はこだてIKA 第4回勉強会 単体テスト
はこだてIKA 第4回勉強会 単体テストはこだてIKA 第4回勉強会 単体テスト
はこだてIKA 第4回勉強会 単体テストSeiji KOMATSU
 
xUTP Chapter26. Dependency Injection
xUTP Chapter26. Dependency InjectionxUTP Chapter26. Dependency Injection
xUTP Chapter26. Dependency InjectionTakuto Wada
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~normalian
 
Swift 2.0 で変わったところ「前編」 #cswift
Swift 2.0 で変わったところ「前編」 #cswiftSwift 2.0 で変わったところ「前編」 #cswift
Swift 2.0 で変わったところ「前編」 #cswiftTomohiro Kumagai
 
ソフトウェア・テスト入門8
ソフトウェア・テスト入門8ソフトウェア・テスト入門8
ソフトウェア・テスト入門8Kenta Hattori
 
Tokyor14 - R言語でユニットテスト
Tokyor14 - R言語でユニットテストTokyor14 - R言語でユニットテスト
Tokyor14 - R言語でユニットテストYohei Sato
 
C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?Shinichi Hirauchi
 
ありえるえりあ勉強会@五反田~テスト編~ Part3
ありえるえりあ勉強会@五反田~テスト編~ Part3ありえるえりあ勉強会@五反田~テスト編~ Part3
ありえるえりあ勉強会@五反田~テスト編~ Part3Tomoyuki Sato
 

Similar to Apache Wicketのユニットテスト機能 (20)

Sencha ug3 siesta_share
Sencha ug3 siesta_shareSencha ug3 siesta_share
Sencha ug3 siesta_share
 
CLRH_120414_WFTDD
CLRH_120414_WFTDDCLRH_120414_WFTDD
CLRH_120414_WFTDD
 
xUnit Test Patterns - Chapter19
xUnit Test Patterns - Chapter19xUnit Test Patterns - Chapter19
xUnit Test Patterns - Chapter19
 
xUTP Chapter19 (2). Testcase Class
xUTP Chapter19 (2). Testcase ClassxUTP Chapter19 (2). Testcase Class
xUTP Chapter19 (2). Testcase Class
 
About func unit
About func unitAbout func unit
About func unit
 
Junit4
Junit4Junit4
Junit4
 
Unit test in android
Unit test in androidUnit test in android
Unit test in android
 
Spock's world
Spock's worldSpock's world
Spock's world
 
Akka Unit Testing
Akka Unit TestingAkka Unit Testing
Akka Unit Testing
 
Android test tutorial
Android test tutorialAndroid test tutorial
Android test tutorial
 
第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめ第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめ
 
はこだてIKA 第4回勉強会 単体テスト
はこだてIKA 第4回勉強会 単体テストはこだてIKA 第4回勉強会 単体テスト
はこだてIKA 第4回勉強会 単体テスト
 
xUTP Chapter26. Dependency Injection
xUTP Chapter26. Dependency InjectionxUTP Chapter26. Dependency Injection
xUTP Chapter26. Dependency Injection
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
 
Swift 2.0 で変わったところ「前編」 #cswift
Swift 2.0 で変わったところ「前編」 #cswiftSwift 2.0 で変わったところ「前編」 #cswift
Swift 2.0 で変わったところ「前編」 #cswift
 
ソフトウェア・テスト入門8
ソフトウェア・テスト入門8ソフトウェア・テスト入門8
ソフトウェア・テスト入門8
 
Spring と TDD
Spring と TDDSpring と TDD
Spring と TDD
 
Tokyor14 - R言語でユニットテスト
Tokyor14 - R言語でユニットテストTokyor14 - R言語でユニットテスト
Tokyor14 - R言語でユニットテスト
 
C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?
 
ありえるえりあ勉強会@五反田~テスト編~ Part3
ありえるえりあ勉強会@五反田~テスト編~ Part3ありえるえりあ勉強会@五反田~テスト編~ Part3
ありえるえりあ勉強会@五反田~テスト編~ Part3
 

Apache Wicketのユニットテスト機能