SlideShare une entreprise Scribd logo
1  sur  92
Télécharger pour lire hors ligne
ユニットテスト入門
Androidアプリケーションへのユニットテスト導入
Tatsuya Maki
Android Application Developer
はなすこと
1. ユニットテストの導入
2. 効率的なユニットテスト
3. ユニットテストのTips
ユニットテストの導入
1
Q. ユニットテストとは
A. メソッドなど小さな単位で行うテスト
public	 static	 String	 fizzbuzz(int	 value)	 {

	  String	 message;

	  if	 (value	 %	 15	 ==	 0)	 {

	  	  message	 =	 "FizzBuzz";

	  }	 else	 if	 (value	 %	 5	 ==	 0)	 {

	  	  message	 =	 "Buzz";

	  }	 else	 if	 (value	 %	 3	 ==	 0)	 {

	  	  message	 =	 "Fizz";

	  }	 else	 {

	  	  message	 =	 String.valueOf(value);

	  }

	  return	 message;

}
FizzBuzz
@Test

public	 void	 fizzbuzzShouldReturnBuzzWhenValueIs10()	 {

	  //	 実行結果

	  String	 actualValue	 =	 fizzbuzz(10);

!
	  //	 期待結果

	  String	 expectedValue	 =	 "Buzz";

!
	  //	 テスト

	  assertThat(actualValue,	 is(expectedValue));

}
FizzBuzzTest
Androidでの問題点
1. デバイスが必須
2. 実行速度が遅い
3. テストしにくい
Robolectric
http://robolectric.org/
遅い
DalvikVM
必要
JUnit3
速い
JVM
不要
JUnit4
AndroidTestCase
実行速度
VM
デバイス
JUnit
Robolectric
TextView Shadow
getText()
Hello, world.
@Implements(TextView.class)

class	 MyShadowTextView	 extends	 ShadowView	 {

!
	  @Implementation

	  public	 CharSequence	 getText()	 {

	  	  return	 "Hello,	 Robolectric!";

	  }

!
}
Shadowの例
@Test

@Config(shadows	 =	 {	 MyShadowTextView.class	 })

public	 void	 getTextShouldReturnHelloRobolectric()	 {

	  //	 SetUp

	  Context	 context	 =

	  	  	  Robolectric.application.getApplicationContext();

	  TextView	 textView	 =	 new	 TextView(context);

	  

	  //	 Exercise

	  CharSequence	 actualText	 =	 textView.getText();

	  	  

	  //	 Verify

	  assertEquals(actualText,	 "Hello,	 Robolectric!");

}
Shadowの利用例
まとめ
1. デバイスが不要
2. JVM上で動作する
3. Shadowオブジェクト
効率的なユニットテスト
2
3つのツール
1. FEST
2. Mockito
3. EclEmma
FEST
https://code.google.com/p/fest/
Q.アサーションとは
A. 実行結果と期待結果を比較検証する宣言
//	 実行結果

int	 actualValue	 =	 10	 /	 2;

!
//	 期待結果

int	 expectedValue	 =	 5;

!
//	 "10	 /	 2"が"5"と等しくなることを表明

assertEquals(actualValue,	 expectedValue);
アサーションの例
FESTのメリット
1. アサーションの記述が容易
2. エラーメッセージが明確
3. Androidと親和性が高い
アサーションの記述が容易
//	 Exercise

List<String>	 devices	 =	 new	 ArrayList<String>();

devices.add("Nexus	 5");

devices.add("Nexus	 7");

!
!
//	 Verify

assertNotNull(devices);

assertEquals(2,	 devices.size());

assertTrue(devices.contains("Nexus	 5"));

JUnit
//	 Exercise

List<String>	 devices	 =	 new	 ArrayList<String>();

devices.add("Nexus	 5");

devices.add("Nexus	 7");

!
!
//	 Verify

assertThat(devices,	 is(notNullValue()));

assertThat(devices.size(),	 is(equalTo(2)));

assertThat(devices,	 hasItem("Nexus	 5"));

Hamcrest
//	 Exercise

List<String>	 devices	 =	 new	 ArrayList<String>();

devices.add("Nexus	 5");

devices.add("Nexus	 7");

!
!
//	 Verify

assertThat(devices)

	  	  .isNotNull()

	  	  .hasSize(2)	 

	  	  .contains("Nexus	 5");
FEST
エラーメッセージが明確
//	 テストコード

List<String>	 devices	 =	 new	 ArrayList<String>();

devices.add("Nexus	 5");

devices.add("Nexus	 7");

assertTrue(devices.contains("Nexus	 4"));

!
!
//	 エラーメッセージ

java.lang.AssertionError

!
!
!
!
JUnit
//	 テストコード

List<String>	 devices	 =	 new	 ArrayList<String>();

devices.add("Nexus	 5");

devices.add("Nexus	 7");

assertThat(devices,	 hasItem("Nexus	 4"));

!
!
//	 エラーメッセージ

java.lang.AssertionError:

Expected:	 a	 collection	 containing	 "Nexus	 4"

	  	  but:	 was	 "Nexus	 5",	 was	 "Nexus	 7”

!
!
Hamcrest
//	 テストコード

List<String>	 devices	 =	 new	 ArrayList<String>();

devices.add("Nexus	 5");

devices.add("Nexus	 7");

assertThat(devices).contains("Nexus	 4");

!
!
//	 エラーメッセージ

java.lang.AssertionError:	 expecting:

<['Nexus	 5',	 'Nexus	 7']>

	 to	 contain:

<['Neuxus	 4']>

	 but	 could	 not	 find:

<['Neuxus	 4']>
FEST
Androidと親和性が高い
//	 テストコード

TextView	 textView	 =	 (TextView)	 activity

	  	  .findViewById(R.id.text_view);

assertThat(textView.getText())

	  	  .isEqualTo(activity.getString(R.string.message));

assertThat(textView.getVisibility())

	  	  .isEqualTo(View.VISIBLE);

!
!
//	 エラーメッセージ

org.junit.ComparisonFailure:	 expected:

	 <[0]>

but	 was:

	 <[8]>
FEST
//	 テストコード

TextView	 textView	 =	 (TextView)	 activity

	  	  .findViewById(R.id.text_view);

assertThat(textView)

	  	  .hasText(R.string.message)

	  	  .isVisible();

!
!
!
//	 エラーメッセージ

java.lang.AssertionError:

	  Expected	 to	 be	 visible	 but	 was	 gone

!
FEST Android
Mockito
http://mockito.org/
Q. モックオブジェクトとは
A. オブジェクトの呼び出しを検証する
class	 MockInputStream	 extends	 InputStream	 {

!
	  private	 boolean	 mIsRead;

	 	 	 	 	 

	  private	 boolean	 mIsClosed;

!
	  @Override

	  public	 int	 read()	 throws	 IOException	 {

	  	  mIsRead	 =	 true;

	  	  return	 0;

	  }

!
	  public	 boolean	 isRead()	 {

	  	  return	 mIsRead;

	  }

!
	  @Override

	  public	 void	 close()	 throws	 IOException	 {

	  	  mIsClosed	 =	 true;

	  }

!
	  public	 boolean	 isClosed()	 {

	  	  return	 mIsClosed;

	  }

!
}
モックオブジェクトの例
Mockitoでできること
1. 呼び出しの検証
2. 振る舞いの変更
3. フィールドの変更
//	 モックオブジェクトの生成

InputStream	 mocked	 =	 mock(InputStream.class);

	  

//	 InputStreamをクローズする

mocked.close();

!
//	 closeメソッドの呼び出し検証

verify(mocked).close();
呼び出しの検証
振る舞いの変更
//	 モックオブジェクトの作成

InputStream	 mocked	 =	 mock(InputStream.class);

!
//	 戻り値の変更

when(mocked.read()).thenReturn(-1);

!
//	 例外の送出

when(mocked.read()).thenThrow(new	 IOException());

!
//	 ロジックの変更

when(mocked.read()).thenAnswer(new	 Answer<Integer>()	 {

!
	  @Override

	  public	 Integer	 answer(InvocationOnMock	 invocation)

	  	  	  	  	  throws	 Throwable	 {

	  	  int	 length;

	  	  ...

	  	  return	 length;

	  }

});
フィールドの変更
//	 内部にInputStreamを保持するクラス

MyObject	 object	 =	 new	 MyObject();

	  	  

//	 フィールドの取得

InputStream	 stream	 =	 (InputStream)	 Whitebox

	  	  .getInternalState(object,	 “mStream");

!
//	 スパイオブジェクトの作成

Socket	 spied	 =	 spy(stream);

!
//	 フィールドの変更

Whitebox

	  	  .setInternalState(object,	 "mStream",	 spied);
Mockitoでできないこと
1. finalクラス/メソッドのモック
2. privateメソッドのモック
3. staticメソッドのモック
EclEmma
http://www.eclemma.org/
Q. カバレッジとは
A. テストがどれだけ網羅できているか
カバレッジの種類
C0: 命令網羅率
C1: 分岐網羅率
C2: 条件網羅率
EclEmmaで測定できるもの
C0: 命令網羅率
C1: 分岐網羅率
C2: 条件網羅率
EclEmmaで測定できないもの
C0: 命令網羅率
C1: 分岐網羅率
C2: 条件網羅率
ユニットテストのTips
3
Q. void型メソッドをテストしたい
A. 別のメソッドを使って検証する
List<String>	 list	 =	 new	 MyList<String>();

list.add("Android");

	  	  

//	 別のメソッドで検証

assertThat(list).hasSize(1);
サンプル
A. メソッドの呼び出しを検証する
InputStream	 mocked	 =	 mock(InputStream.class);

IoUtils.close(mocked);

!
//	 closeメソッドの呼び出し検証

verify(mocked).close();
サンプル
Q. privateメソッドをテストしたい
A. 諦める
A. package privateに変更する
//	 privateメソッドなので呼び出せない

private	 String	 buildMessage()	 {

	  String	 message;

	  //	 do	 something

	  return	 message;

}

!
//	 package	 privateに変更

String	 buildMessage()	 {

	  String	 message;

	  //	 do	 something

	  return	 message;

}
サンプル
Q. 非同期処理をテストしたい
A. CountDownLatchを使う
//	 timeoutを指定

@Test(timeout	 =	 1000)

public	 void	 test()	 throws	 InterruptedException{

	  CountDownLatch	 latch	 =	 new	 CountDownLatch(1);

	  AsyncProcess.execute(new	 Callback()	 {

	  	  	  

	  	  @Override

	  	  public	 void	 onComplete()	 {

	  	  	  //	 処理完了時にcountDownを呼出

	  	  	  latch.countDown();

	  	  }

	  });

!
	  //	 処理完了まで待機

	  latch.await();

!
	  ...

}
サンプル
Q. HTTP通信の外部依存をなくしたい
A. FakeHttpLayerを使う
HttpClientの場合
//	 常に同じレスポンスを返却

FakeHttpLayer	 layer	 =	 Robolectric.getFakeHttpLayer();

layer.setDefaultHttpResponse(200,	 "Hello,	 World!");

!
!
//	 順番にレスポンスを変更

FakeHttpLayer	 layer	 =	 Robolectric.getFakeHttpLayer();

layer.addPendingHttpResponse(200,	 "Hello,	 Nexus	 4!");

layer.addPendingHttpResponse(200,	 "Hello,	 Nexus	 5!");

layer.addPendingHttpResponse(200,	 "Hello,	 Nexus	 7!");

!
!
//	 動的にレスポンスを変更

FakeHttpLayer	 layer	 =	 Robolectric.getFakeHttpLayer();

layer.addHttpResponseRule(new	 MyResponseRule());

サンプル
A. URLStreamHandlerを設定する
HttpURLConnectionの場合
class	 StubURLStreamHandler	 extends	 URLStreamHandler	 {

	  @Override

	  protected	 URLConnection	 openConnection(URL	 url)

	  	  	  throws	 IOException	 {

	  	  //	 HttpURLConnectionを作成

	  	  return	 new	 StuHttpURLConnection(url);

	  }

}

!
class	 StubURLStreamHandlerFactory	 implements	 

	  	  URLStreamHandlerFactory	 {

	  @Override

	  public	 URLStreamHandler	 createURLStreamHandler(

	  	  	  String	 protocol)	 {

	  	  //	 URLStreamHandlerを作成

	  	  return	 new	 StubURLStreamHandler();

	  }

}

!
//	 URLStreamHandlerFactoryを設定

URL.setURLStreamHandlerFactory(

	  	  new	 StubURLStreamHandlerFactory());
サンプル
Q. データベースのスローテストを解消したい
A. インメモリデータベースを使う
//	 DatabaseMapのinterfaceを実装

class	 MemoryDatabaseMap	 implements	 DatabaseMap	 {

!
	  @Override

	  public	 String	 getDriverClassName()	 {

	  	  return	 JDBC.class.getName();

	  }

!
	  @Override

	  public	 String	 getConnectionString(File	 file)	 {

	  	  //	 インメモリデータベースを使うように指定

	  	  return	 "jdbc:sqlite::memory:";

	  }

!
	  @Override

	  public	 String	 getMemoryConnectionString()	 {

	  	  //	 インメモリデータベースを使うように指定

	  	  return	 "jdbc:sqlite::memory:";

	  }

!
	  @Override

	  public	 int	 getResultSetType()	 {

	  	  return	 ResultSet.TYPE_FORWARD_ONLY;

	  }

!
	  @Override

	  public	 String	 getSelectLastInsertIdentity()	 {

	  	  return	 "SELECT	 last_insert_rowid()	 AS	 id";

	  }

!
}
サンプル
//	 UsingDatabaseMapで指定

@UsingDatabaseMap(MemoryDatabaseMap.class)

@RunWith(RobolectricTestRunner.class)

class	 DatabaseHelperTest	 {

	  ...

}
サンプル
Q. Activityをテストしたい
A. ActivityControllerを使う
//	 ActivityControllerを生成

ActivityController<MainActivity>	 controller	 =	 

	  	  Robolectric.buildActivity(MainActivity.class);

!
//	 Activityの生成

controller.create().start().resume().visible();

!
//	 Activityの取得

MainActivity	 activity	 =	 controller.get();

	  

//	 Activityの操作

TextView	 textView	 =	 (TextView)	 activity

	  	  .findViewById(R.id.text_view);

	  

...

!
//	 Activityの破棄

controller.pause().stop().destroy();
サンプル
Q. Serviceを検証したい
A. ライフサイクルに合わせてメソッドを呼び出す
private	 MyService	 mService;

!
@Before

public	 void	 setUp()	 {

	  //	 Serviceを生成

	  mService	 =	 new	 MyService();

	  mService.onCreate();

}

	  

@Test

public	 void	 test()	 {

	  //	 Serviceを実行

	  Intent	 intent	 =	 new	 Intent(Intent.ACTION_SEARCH);

	  intent.putExtra(SearchManager.QUERY,	 "Hello,	 World!");

	  mService.onStartCommand(intent,	 0,	 0);

}

!
@After

public	 void	 tearDown()	 {

	  //	 Serviceを破棄

	  mService.onDestroy();

}
サンプル
Q. Widgetのテストをしたい
A. ShadowAppWidgetManagerを使う
//	 ShadowAppWidgetManagerの生成

Context	 context	 =	 Robolectric.application

	  	  .getApplicationContext();

AppWidgetManager	 manager	 =	 

	  	  AppWidgetManager.getInstance(context);

ShadowAppWidgetManager	 shadowManager	 =	 

	  	  Robolectric.shadowOf(manager);

	  	  

//	 Widgetの生成

int	 widgetId	 =	 shadowManager.createWidget(

	  	  MyWidgetProvider.class,	 

	  	  R.layout.activity_main);

	  	  

//	 Viewの取得

View	 widgetView	 =	 shadowManager.getViewFor(widgetId);

!
...
サンプル
Q. ContentProviderのテストをしたい
A. ShadowContentResolverを使う
//	 ShadowContentResolverの生成

ContentResolver	 resolver	 =	 

	  	  Robolectric.application.getContentResolver();

ShadowContentResolver	 shadowResolver	 =	 

	  	  Robolectric.shadowOf(resolver);

!
//	 ContentProviderの登録

shadowResolver.registerProvider(

	  	  “com.example.android.unittest”

	  	  	 new	 MyContentProvider());

	  	  

...

	  	  

//	 INSERTステートメントの取得

List<InsertStatement>	 insertStatements	 =	 

	  	  shadowResolver.getInsertStatements();

//	 UPDATEステートメントの取得

List<UpdateStatement>	 updateStatements	 =	 

	  	  shadowResolver.getUpdateStatements();

//	 DELETEステートメントの取得

List<DeleteStatement>	 deleteStatements	 =	 

	  	  shadowResolver.getDeleteStatements();

//	 notifyChangeで通知されたURIの取得

List<NotifiedUri>	 notifiedUris	 =	 

	  	  shadowResolver.getNotifiedUris();

サンプル
Q. BroadcastReceiverのテストをしたい
A. ShadowApplicationを使う
//	 事前処理

ShadowApplication	 shadowApplication	 =	 

	  	  Robolectric.getShadowApplication();

Context	 context	 =	 

	  	  Robolectric.application.getApplicationContext();

	  	  

//	 登録済みBroadcastReceiverの取得

List<Wrapper>	 registered	 =	 

	  	  shadowApplication.getRegisteredReceivers();

	  	  

//	 Intentに該当するBroadcastReceiverの取得

Intent	 intent	 =	 new	 Intent("MY_ACTION");

List<BroadcastReceiver>	 receivers	 =	 

	  	  shadowApplication.getReceiversForIntent(intent);

	  	  

//	 Intentを擬似的に受信

BroadcastReceiver	 receiver	 =	 receivers.get(0);

receiver.onReceive(context,	 intent);
サンプル
まとめ
4
まとめ
1. 課題はRobolectricで解消できる
2. 既存のライブラリを使って効率的に
3. 大体テストできるので書いてみよう
Q. おすすめの本はなんですか
https://github.com/t28hub/UnitTestInAndroid/

Contenu connexe

Tendances

Javaセキュアコーディングセミナー東京第3回演習の解説
Javaセキュアコーディングセミナー東京第3回演習の解説Javaセキュアコーディングセミナー東京第3回演習の解説
Javaセキュアコーディングセミナー東京第3回演習の解説JPCERT Coordination Center
 
Async design with Unity3D
Async design with Unity3DAsync design with Unity3D
Async design with Unity3DKouji Hosoda
 
今日からはじめるGPars
今日からはじめるGPars今日からはじめるGPars
今日からはじめるGParsfumokmm
 
あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)Takuya Tsuchida
 
xUnit Test Patterns - Chapter19
xUnit Test Patterns - Chapter19xUnit Test Patterns - Chapter19
xUnit Test Patterns - Chapter19Takuto Wada
 
Qunit再入門 (Version 1.10.0 編)
Qunit再入門 (Version 1.10.0 編)Qunit再入門 (Version 1.10.0 編)
Qunit再入門 (Version 1.10.0 編)Koji Nakamura
 
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...なおき きしだ
 
Ecmascript2015とその周辺について
Ecmascript2015とその周辺についてEcmascript2015とその周辺について
Ecmascript2015とその周辺について豊明 尾古
 
Easy Going Groovy(Groovyを気軽に使いこなそう)
Easy Going Groovy(Groovyを気軽に使いこなそう)Easy Going Groovy(Groovyを気軽に使いこなそう)
Easy Going Groovy(Groovyを気軽に使いこなそう)Uehara Junji
 
基礎からのCode Contracts
基礎からのCode Contracts基礎からのCode Contracts
基礎からのCode ContractsYoshifumi Kawai
 
Apache Wicketのユニットテスト機能
Apache Wicketのユニットテスト機能Apache Wicketのユニットテスト機能
Apache Wicketのユニットテスト機能Hiroto Yamakawa
 
関西Php勉強会のlimeの話
関西Php勉強会のlimeの話関西Php勉強会のlimeの話
関西Php勉強会のlimeの話Hisateru Tanaka
 
Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.Yuki Higuchi
 

Tendances (20)

Clojrue 13 testing
Clojrue 13 testingClojrue 13 testing
Clojrue 13 testing
 
Javaセキュアコーディングセミナー東京第3回演習の解説
Javaセキュアコーディングセミナー東京第3回演習の解説Javaセキュアコーディングセミナー東京第3回演習の解説
Javaセキュアコーディングセミナー東京第3回演習の解説
 
Async design with Unity3D
Async design with Unity3DAsync design with Unity3D
Async design with Unity3D
 
今日からはじめるGPars
今日からはじめるGPars今日からはじめるGPars
今日からはじめるGPars
 
Synthesijer hls 20150116
Synthesijer hls 20150116Synthesijer hls 20150116
Synthesijer hls 20150116
 
あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)
 
xUnit Test Patterns - Chapter19
xUnit Test Patterns - Chapter19xUnit Test Patterns - Chapter19
xUnit Test Patterns - Chapter19
 
About Jobs
About JobsAbout Jobs
About Jobs
 
Qunit再入門 (Version 1.10.0 編)
Qunit再入門 (Version 1.10.0 編)Qunit再入門 (Version 1.10.0 編)
Qunit再入門 (Version 1.10.0 編)
 
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
 
Ecmascript2015とその周辺について
Ecmascript2015とその周辺についてEcmascript2015とその周辺について
Ecmascript2015とその周辺について
 
Easy Going Groovy(Groovyを気軽に使いこなそう)
Easy Going Groovy(Groovyを気軽に使いこなそう)Easy Going Groovy(Groovyを気軽に使いこなそう)
Easy Going Groovy(Groovyを気軽に使いこなそう)
 
Javascript basic code
Javascript basic codeJavascript basic code
Javascript basic code
 
Ajax 応用
Ajax 応用Ajax 応用
Ajax 応用
 
VerilatorとSystemC
VerilatorとSystemCVerilatorとSystemC
VerilatorとSystemC
 
基礎からのCode Contracts
基礎からのCode Contracts基礎からのCode Contracts
基礎からのCode Contracts
 
Apache Wicketのユニットテスト機能
Apache Wicketのユニットテスト機能Apache Wicketのユニットテスト機能
Apache Wicketのユニットテスト機能
 
Unityで覚えるC#
Unityで覚えるC#Unityで覚えるC#
Unityで覚えるC#
 
関西Php勉強会のlimeの話
関西Php勉強会のlimeの話関西Php勉強会のlimeの話
関西Php勉強会のlimeの話
 
Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.
 

Similaire à Unit test in android

Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftSwift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftTomohiro Kumagai
 
iTamabi 13 第7回:ARTSAT API 実践 2 衛星の情報で表現する
iTamabi 13  第7回:ARTSAT API 実践 2 衛星の情報で表現するiTamabi 13  第7回:ARTSAT API 実践 2 衛星の情報で表現する
iTamabi 13 第7回:ARTSAT API 実践 2 衛星の情報で表現するAtsushi Tadokoro
 
Android test tutorial
Android test tutorialAndroid test tutorial
Android test tutorialKazuaki Ueda
 
xUTP Chapter26. Dependency Injection
xUTP Chapter26. Dependency InjectionxUTP Chapter26. Dependency Injection
xUTP Chapter26. Dependency InjectionTakuto Wada
 
From Swing to JavaFX - SwingからJavaFXへのマイグレーションガイド
From Swing to JavaFX  - SwingからJavaFXへのマイグレーションガイドFrom Swing to JavaFX  - SwingからJavaFXへのマイグレーションガイド
From Swing to JavaFX - SwingからJavaFXへのマイグレーションガイドYuichi Sakuraba
 
Sencha ug3 siesta_share
Sencha ug3 siesta_shareSencha ug3 siesta_share
Sencha ug3 siesta_share久司 中村
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?Kenji Nakamura
 
Local php-100828 2
Local php-100828 2Local php-100828 2
Local php-100828 2Akio Ishida
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
Swift 2.0 で変わったところ「前編」 #cswift
Swift 2.0 で変わったところ「前編」 #cswiftSwift 2.0 で変わったところ「前編」 #cswift
Swift 2.0 で変わったところ「前編」 #cswiftTomohiro Kumagai
 
Xtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使うXtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使うTatsumi Naganuma
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜JustSystems Corporation
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめYu Nobuoka
 
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration勉強会force#4 Chatter Integration
勉強会force#4 Chatter IntegrationKazuki Nakajima
 
Unit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFXUnit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFXShinya Mochida
 

Similaire à Unit test in android (20)

Junit4
Junit4Junit4
Junit4
 
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftSwift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswift
 
iTamabi 13 第7回:ARTSAT API 実践 2 衛星の情報で表現する
iTamabi 13  第7回:ARTSAT API 実践 2 衛星の情報で表現するiTamabi 13  第7回:ARTSAT API 実践 2 衛星の情報で表現する
iTamabi 13 第7回:ARTSAT API 実践 2 衛星の情報で表現する
 
Android test tutorial
Android test tutorialAndroid test tutorial
Android test tutorial
 
Java EE8 Report
Java EE8 ReportJava EE8 Report
Java EE8 Report
 
xUTP Chapter26. Dependency Injection
xUTP Chapter26. Dependency InjectionxUTP Chapter26. Dependency Injection
xUTP Chapter26. Dependency Injection
 
From Swing to JavaFX - SwingからJavaFXへのマイグレーションガイド
From Swing to JavaFX  - SwingからJavaFXへのマイグレーションガイドFrom Swing to JavaFX  - SwingからJavaFXへのマイグレーションガイド
From Swing to JavaFX - SwingからJavaFXへのマイグレーションガイド
 
Sencha ug3 siesta_share
Sencha ug3 siesta_shareSencha ug3 siesta_share
Sencha ug3 siesta_share
 
Ruby test double
Ruby test doubleRuby test double
Ruby test double
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?
 
Local php-100828 2
Local php-100828 2Local php-100828 2
Local php-100828 2
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
Swift 2.0 で変わったところ「前編」 #cswift
Swift 2.0 で変わったところ「前編」 #cswiftSwift 2.0 で変わったところ「前編」 #cswift
Swift 2.0 で変わったところ「前編」 #cswift
 
Xtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使うXtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使う
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
 
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration
 
FlexUnit4とMockitoFlex
FlexUnit4とMockitoFlexFlexUnit4とMockitoFlex
FlexUnit4とMockitoFlex
 
Unit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFXUnit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFX
 
Effective Java 輪読会 項目66-68
Effective Java 輪読会 項目66-68Effective Java 輪読会 項目66-68
Effective Java 輪読会 項目66-68
 

Dernier

自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 

Dernier (8)

自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 

Unit test in android