Descargar PageObject v Kotlin para UI-тестирования Android | Alexander Rovnov MobileUp | Octubre de 2020

Las pruebas de interfaz de usuario de Android se utilizan generalmente en dispositivos físicos y emuladores Café exprés) – y mucho en nuestro proyecto. Anteriormente, encontramos una serie de métodos de asistencia para la implementación de pruebas de IU. Esto fue realizado por nuestra función de prueba a corto plazo, pero también por el proceso de comprensión del proceso de conducción, navegación y uso de la computadora. Y cuando la aplicación de la interfaz de usuario se renueva a menudo, la prueba se reserva para el submarino.

Вспомогательные методы полезны, но когда UI меняется очень часто, становится очень непросто определить, какие именно из этих методов соответствуют обновленному пользовательскому интерфейсу, если только UI-тесты не проваливаются или мы не отслеживаем код со всей осторожностью.

La regla principal para OO ect es también proporcionar una interfaz de programa simple, un detalle de curación. – Martín Lauler

El concepto más notable de PageObject es mejor, por eso Martin, ni siquiera en él, lo describió como usado por los Potentomotas aquí.

  • Reducir la cantidad de código duplicado

No es necesario hacerlo, los métodos asistidos también reducen la duplicación de código, PageObject encapsula y oculta los detalles de las estructuras de la interfaz de usuario y los resultados de las claves de prueba. De esta manera, nos enfocamos en la prueba de claves de prueba por separado de los usuarios del usuario.

  • Interfaz de usuario, interfaz de usuario, interfaz de usuario, interfaz de usuario

C paternal PageObject нам всего лишь нужно настроить один или несколько объектов страницы, когда пользовательский интер Кроме того, мы можем легко узнать, какие объекты страницы должны быть также модифицированы. En este desarrollo, muchos usuarios no pasan por alto el código de la masa y lo dejan claro, así que esta es la masa

Con una segunda página, al desarrollar un nuevo diálogo de un cuadro de diálogo o cualquier componente del componente de la interfaz de usuario, este no es el caso. PageObject, que cumple con estrictos controles sobre el refinamiento y la mecánica requerida. Después de que este ingeniero favorito pueda escribir una nueva clave de prueba, lo siguiente es un seguimiento

  • Mejora de la legibilidad de las cookies de prueba

Me gustan mucho nuestros escenarios y detalles más adelante, y al mismo tiempo, el hotel compartiría una habitación realista.

@Test
fun testSearchById() {
Page.on<DiscoveryPage>()
.on<SearchBoxPage>()
.click()
.on<SearchViewPage>()
.searchKeyword("7882691")
.on<ItemPage>()
.withTitle("A1NJ5J02")
}

Es fácil entender por lo que pasa esta prueba a través de las frases Descubrimiento, hace clic en el programa Caja de búsqeda, ingrese una palabra clave en el editorial SearchView, y por ahora muestra la frase Articulo con el encabezado indicado.

  • PageObject puede ser encontrado por el otro PageObject

Ejemplo, muchas frases tienen RecyclerView, soportando funciones generales, pero sin verificación y algunas funciones especiales. Puedes darte cuenta de ellos ScrollablePageObject, que revisa el sitio vista de reciclaje y métodos generales, como «el elemento en negrita», otros PageObject urgentemente expandir ScrollablePageObject y adaptarlos (establecerlos).

class ScrollablePage : Page() {
@IdRes
open val recyclerViewId: Int = R.id.recycler_viewfun clickItem(index: Int): Page {
Espresso.onView(withId(recyclerViewId))
.perform(RecyclerViewActions.scrollToPosition(index))
Espresso.onView(withId(recyclerViewId))
.perform(
RecyclerViewActions.actionOnHolderItem(
ItemMatcher(),
click())
.atPosition(index)
)
return this
}
}class SearchResultPage: ScrollablePage() {
...
}

Еще один частный случай, которым стоит поделиться: у нас есть много разных типов фрагментов, которые содержат различные компоненты пользовательского интерфейса, но мы их реализуем в идентичном XML-макете. Se basa en la realización de varios objetos del sitio, a partir de un objeto básico.

Descuento: bienes ordinarios, Administración: bienes sobre acciones, tiempo limitado

Duele traer legibilidad, que es lo que verás .on<NormalItemPage>() C on<LimitedTimeSaleItemPage>() dentro de las claves de prueba y no debe preguntarlas.

La realización espaciosa se basa en lo que se divide cada método del objeto de la fiesta, que es el mismo.

  • Navegación diferente a través de una y otra operación

Suele darse el caso de que la operación se base en una variedad de frases. Ejemplo, SearchViewPage.searchKeyword({id}) ir a las frases de los bienes, no .searchKeyword({brand name}) es necesario acudir a la marca de la marca.

De la solución a la solución, se utiliza la división en diferentes métodos, por ejemplo searchById(id: String): ItemPage CsearchByBrand(brand: String): BrandPage, pero ambos son realistamente idénticos:

Espresso.onView(allOf(withId(R.id.search_input), isDisplayed()))
.perform(clearText())
.perform(replaceText(keyword))
.perform(pressImeActionButton())

Este código está duplicado, por lo que ordenaremos el objeto final del sitio con nuestra parte fáctica, que

@Test
fun testSearchById() {
Page.on<DiscoveryPage>()
.on<SearchBoxPage>()
.click()
.on<SearchViewPage>()
.searchKeyword("7882691")
.on<ItemPage>()

.withTitle("A1NJ5J02")
}@Test
fun testSearchByBrand() {
Page.on<DiscoveryPage>()
.on<SearchBoxPage>()
.click()
.on<SearchViewPage>()
.searchKeyword("timberland")
.on<BrandPage>()

.withTitle("Timberland")
}
  • «Volver» Aviación desde diferentes puntos de entrada (*puntos de entrada – dirección en memoria operativa, p)

Algunas frases se crearán a partir de varios puntos de flujo en la entrada, por ejemplo, la página del producto del motor de búsqueda o el sitio. Y luego, una de ellas, las frases deben volver a la segunda secuencia después de que aparezcan varias resoluciones lo antes posible. back() registrarse como se especifica:

@Test
fun testItemDetail() {
Page.on<ItemPage>()
.clickDetail()
.on<WebPage>()
.withTitle("The Product Details")
.back()
.on<ItemPage>()

}@Test
fun testBrandDetail() {
Page.on<BrandPage>()
.clickDetail()
.on<WebPage>()
.withTitle("The Brand Details")
.back()
.on<BrandPage>()

}
  • Una pierna en el componente vespertino sin ninguna acción.

PageObject будет не только создавать объекты страницы для каждого фрагмента, но и для элементов фрагмента Объект страницы не обязательно должен отображать всю страницу, так как в следующем примере SearchBoxPage representa el componente nocturno de la interfaz de usuario dentro DiscoveryPage, que representa el contrato descubrimiento.

@Test
fun testSearchById() {
Page.on<DiscoveryPage>()
.on<SearchBoxPage>()

.click()
.on<SearchViewPage>()
.searchKeyword("7882691")
.on<ItemPage>()
.withTitle("A1NJ5J02")
}

Dividimos la clase base Page de donde se siguen todos los demás objetos del partido. La clase base tiene una función de dos etapas fun <reified T : Page> on(): T, que revela el espécimen PageObject por tipo Tpara que podamos imaginarnos, podemos ordenar Page.on<{PageObject}>() en el tiempo promedio y para dividir el objeto actual de la fiesta, toda el área debe ser probada para operaciones de prueba

Esta es la idea del oficio en el resultado del documental Vivian Liu Patrones de diseño en XCUITest. Lagodari Vivian por lo que compartió en iPlayground 2018 en Taiwán.

Page.on() ingeniero recomienda T y revela el extracto fáctico T. Podríamos hacer cada objeto del sitio con un cartel y encontrar un socio, pero este será el modificador. Page.on() cada vez que se junta uno nuevo PageObjecteste es un soporte simple, luego lo usamos T::class.constructors.first().call()enseñar a los ingenieros constructores y enseñar la primera, como una regla de constelación no paramétrica T.

open class Page {    companion object {
inline fun <reified T : Page> on(): T {
return Page().on()
}
}inline fun <reified T : Page> on(): T {
val page = T::class.constructors.first().call()

page.verify()
return page
}
open fun verify(): Page {
// Each subpage should have its default assurances here
return this
} fun back(): Page {
Espresso.pressBack()
return this
}
}

Reified v Kotlin se usa para hacer té de prueba que se ha retenido. Luego nos tocó a nosotros escribirle, él envió los objetos de la fiesta. Esto no debe estar mal, pero no es necesario tener una conexión entre las acciones.

// with reified
Page.on<DiscoveryPage>()
.on<SearchBoxPage>().click()
.on<SearchViewPage>().searchKeyword("7882691")// without reified
DiscoveryPage()
SearchBoxPage().click()
SearchViewPage().searchKeyword("7882691")

Page así las funciones se realizan fun back(): Page que revela la base Página-clase, entonces lo que no es necesario para nosotros, lo que back() registrado en un objeto de página dedicado. Esta solución nos es fácil de mostrar cuando se nos revela el objeto de la fiesta después de la acción.

Y no olvides cuáles son los otros objetos del sitio a seguir. Page y subir verify() por completar los controles de la mediación.

class ItemPage : Page() {    override fun verify(): Page {
Espresso.onView(withId(R.id.productitem_name))
.check(matches(withEffectiveVisibility(VISIBLE)))
return this
} fun withTitle(title: String): ItemPage {
Espresso.onView(withId(R.id.productitem_name))
.check(matches(ViewMatchers.withText(keyword)))
return this
}
}class SearchViewOage : Page() { override fun verify(): SearchView {
Espresso.onView(withId(R.id.search_input))
.check(matches(withEffectiveVisibility(VISIBLE)))
return this
} fun searchKeyWord(keyword: String): Page {
Espresso.onView(allOf(
withId(R.id.search_input),
isDisplayed()
))
.perform(clearText())
.perform(replaceText(keyword))
.perform(pressImeActionButton())
return this
}
}
  • Navegación inversa debido a diferentes puntos de entrada.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *