今天要來寫寫 UI Test,針對不同資料狀態要顯示對應的 UI,我們需要驗證自己的介面是否符合預期中的那樣,以下如有解釋不清或是描述錯誤的地方還請大家多多指教:
透過 Espresso 來建立我們的 UI test,設定測試情境並驗證介面是否顯示成預期的樣子,可透果以下方式進行驗證一個文字的顯示:
onView(withId(R.id.viewId)).check(matches(withText("$1,000")))
onView(withId(R.id.viewId)).check(matches(not(isDisplayed())))
onView(withId(R.id.viewId)).perform(click())
onView(withId(R.id.viewId)).perform(typeText("ABC"))
// 因為 input 沒有支援中文的 typeText 所以要用 replaceText 替代
onView(withId(R.id.viewId)).perform(replaceText("大家好"))
dependency 的部分 Espresso 依樣在專案建立時就已經被配置好了,我們要額外加入以下三個 library
dependencies {
androidTestImplementation 'com.google.dagger:hilt-android-testing:2.41'
androidTestImplementation 'androidx.test:rules:1.4.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
}
@HiltAndroidTest
class MainActivityTest {
@get:Rule(order = 0)
var hiltRule = HiltAndroidRule(this)
@get:Rule(order = 1)
val activityTestResult = ActivityScenarioRule(MainActivity::class.java)
@BindValue
val viewModel: MainViewModel = mockk(relaxed = true)
private var fakeCityCard = MutableLiveData<Resource<List<CityCard>>>()
@Before
fun setUp() {
hiltRule.inject()
every { viewModel.cardList } returns fakeCityCard
}
@Test
fun shouldShowEmptyCityCardWhenDataIsSet() {
fakeCityCard.postValue(Resource.Success(listOf()))
onView(withId(R.id.emptyState)).check(matches(isDisplayed()))
onView(withId(R.id.emptyDes)).check(matches(withText("目前沒有東西")))
}
...
}