👨🔧
UnitTest実行手順
UnitTest実行手順
実装手順
ライブラリの追加(デフォルトで入っているが、一応確認)
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
テストクラスの作成
テストを行うクラスで右クリック「Generate... -> Test...」を選択
Testing Library: JUnit4 を選択し「OK」
何も触らず「OK」
app>java>com.example.アプリ名(test) にテストクラスが出来ていることを確認
テストクラスの実装
private lateinit var sampleClass: SampleClass
@Before
fun setUp() {
sampleClass = SampleClass()
}
テストの記入
@Test をつけることによってテスト対象のFunctionになる
@Test
fun `Int同士の計算`() {
val result = sampleClass.sum(1, 1)
assertEquals("2", result)
}
@Test
fun `0を含む計算`() {
val a = 1
val b: Int = 2147483646
val result = sampleClass.sum(a, b)
assertEquals("2147483647", result)
}
以下、テストコード
テスト対象クラス
import android.util.Log
class SampleClass {
companion object {
private const val LOG_TAG = "__SAMPLE_CLASS__"
}
fun sum(a: Int, b: Int): String {
val s = a + b
return s.toString()
}
fun defaultFun() {
val str = "何をするわけでもないただのfunction"
Log.d(LOG_TAG, str)
}
/**
* 送られてきた文字列でハンバーガーが作れるのか確認
* @param order: オーダー
* @return Boolean: true: 作れた, false: 作れなかった
*/
fun canMakeHamburger(order: String): Boolean {
var ret = false
val inLettuce = isInLettuce(order)
val inTomato = isInTomato(order)
val inCheese = isInCheese(order)
val inBeef = isInBeef(order)
// 肉が入っていればそれはハンバーガー
if(inBeef) {
ret = true
}
// 肉が無くても一応ハンバーガー
if(inLettuce && inTomato && inCheese) {
ret = true
}
return ret
}
/**
* レタスが入っているか
* @param order: オーダー
* @return Boolean: true: 入ってた, false: 入ってなかった
*/
fun isInLettuce(order: String): Boolean {
return order.contains("Lettuce")
}
/**
* トマトが入っているか
* @param order: オーダー
* @return Boolean: true: 入ってた, false: 入ってなかった
*/
fun isInTomato(order: String): Boolean {
return order.contains("Tomato")
}
/**
* チーズが入っているか
* @param order: オーダー
* @return Boolean: true: 入ってた, false: 入ってなかった
*/
fun isInCheese(order: String): Boolean {
return order.contains("Cheese")
}
/**
* ビーフが入っているか
* @param order: オーダー
* @return Boolean: true: 入ってた, false: 入ってなかった
*/
fun isInBeef(order: String): Boolean {
return order.contains("Beef")
}
}
テストクラス
import org.junit.Assert.*
import org.junit.Before
import org.junit.Test
class SampleClassTest {
private lateinit var sampleClass: SampleClass
// ここで初期設定
@Before
fun setUp() {
sampleClass = SampleClass()
}
@Test
fun `Int同士の計算`() {
val result = sampleClass.sum(1, 1)
// assertEquals(期待値, 実測値)
assertEquals("2", result)
}
@Test
fun `0を含む計算`() {
val a = 1
val b: Int = 2147483646
val result = sampleClass.sum(a, b)
// assertEquals(期待値, 実測値)
assertEquals("2147483647", result)
}
@Test
fun `defaultFunを呼び出す`() {
val result = sampleClass.defaultFun()
assertNotNull(result)
}
@Test
fun `チーズとビーフ`() {
val result = sampleClass.canMakeHamburger("Beef and Cheese in Hamburger.")
// assertEquals(期待値, 実測値)
assertEquals(true, result)
}
@Test
fun `ビーフとレタス`() {
val result = sampleClass.canMakeHamburger("Beef and Lettuce in Hamburger.")
// assertEquals(期待値, 実測値)
assertEquals(true, result)
}
@Test
fun `レタスとチーズ`() {
val result = sampleClass.canMakeHamburger("Lettuce and Cheese in Hamburger.")
// assertEquals(期待値, 実測値)
assertEquals(false, result)
}
@Test
fun `チーズとレタスとトマト`() {
val result = sampleClass.canMakeHamburger("Cheese, Lettuce and Tomato in Hamburger.")
// assertEquals(期待値, 実測値)
assertEquals(false, result)
}
@Test
fun `トマトとチーズ`() {
val result = sampleClass.canMakeHamburger("Tomato and Cheese in Hamburger.")
// assertEquals(期待値, 実測値)
assertEquals(false, result)
}
}
テストの実施
赤枠をクリックでテストクラス全体のテスト実施
青枠をクリックでテスト単体のテスト実施
テスト結果
テスト結果はログ表示される
注意点
テスト対象コードに Androidクラス(ex. Log.d()) が入っているとエラーを吐くので、下記コードをbuild.gradle(app)に追加
android {
....
....
...
testOptions {
unitTests.returnDefaultValues = true
}
}
Discussion