Pantrix UI

Test

Bir uygulamanın arayüz testinin Pantrix'in bileşenlerini etiketleriyle nasıl bulduğu, ekranı her makinede aynı nasıl çizdiği, makinenin hizmetlerini işin dışında nasıl tuttuğu ve aynı etiketlerle bir cihaza nasıl ulaştığı.

Metin değil etiket

Her bileşen, adından ve kendisine verilen tagKey'den kurulan, her dilde aynı bir etiket taşır. Bir test ya da bir Maestro akışı onu bununla bulur; bir sözcük çevrildiğinde bozulmaz.

Bir etiket nasıl kurulur
PantrixButton(tagKey = "pay")Button_pay
TestScope("Checkout") { … }Checkout.Button_pay; bölümler iç içe geçer: Checkout.Payment.Button_pay
form.field("email", …)TextField_email: bağlı bir bileşen alanın id'siyle etiketlenir
PantrixSelect(tagKey = "country")Select_country.SelectOption_tr: bir kontrolün parçaları etiketinin içinde adlanır

Bir test

Yardımcılar com.pantrixui:testing'dedir, her hedefte.

CheckoutScreenTest.kt

class CheckoutScreenTest {
    @OptIn(ExperimentalTestApi::class)
    @Test
    fun paying_reports_the_press_and_the_screen_has_no_findings() = runComposeUiTest {
        val findings = PantrixFindings()
        val analytics = RecordingAnalytics()
        setContent {
            PantrixTestTheme(findings = findings, analytics = analytics) { CheckoutScreen() }
        }
        onPantrixNode("TextField", "card_number").requestFocus().performTextInput("4242424242424242")
        onPantrixNode("Button", "pay").performClick()
        assertEquals(listOf("click"), analytics.eventsOf("Button").map { it.action })
        assertNoFindings(findings)
    }
}

Her makinede aynı ekran

PantrixTestTheme bir ekranın makineden alacaklarını sabitler: platformu, açık ya da koyu oluşu, dili, yoğunluğu, yazının ölçeğini, hareketi. Platform hizmetlerinin yerine geçenleri parametre olarak alır.

Yerine geçenler
RecordingAnalytics()Bileşenlerin olayları, sırasıyla
RecordingHaptics()Çalınan dokunsal geri bildirimler
TestClipboard()Ekranın kopyaladıkları, bir de başka bir platformun panosu
TestFilePicker(files)Her seçime verilen dosyalarla yanıt verir
TestClock(now, utcOffset)Ekranın saati; yalnızca test onu ilerlettiğinde ilerler
PantrixFindings()Tanılamanın buldukları, assertNoFindings için

Tek testte her platform

onEachPlatform ekranı her platformun alışkanlıklarıyla birer kez çizer. assertTouchTargetOf(platform) Android'de 48dp'yi, iOS'ta 44pt'yi, fareyle 32dp'yi denetler.

SaveButtonTest.kt

@OptIn(ExperimentalTestApi::class)
@Test
fun the_button_is_a_finger_s_size_on_every_platform() = runComposeUiTest {
    onEachPlatform({ platform -> PantrixTestTheme(platform = platform) { SaveButton() } }) { platform ->
        onPantrixNode("Button", "save").assertTouchTargetOf(platform)
    }
}

Bir cihazda

Etiketler cihazın erişilebilirlik ağacına ulaşır: Android'de resource-id, iOS'ta accessibilityIdentifier olarak. Uygulamanın kendi Popup'ı ya da Dialog'u kökünde Modifier.pantrixAutomationRoot() taşır.

checkout.yaml

appId: ${APP_ID}
---
- launchApp
- tapOn:
    id: "Button_browse"
- tapOn:
    id: "TextField_search"
- inputText: "invoice"

Sırada ne var