Comprensión de las pruebas unitarias de Android en 2021 | Christopher Elias | Mayo de 2021

Aprendió algunos de los beneficios de las pruebas y sus conocimientos básicos. Tomemos nuestro plan de patio de recreo de la publicación mencionado y analicemos algunas pruebas.
El plan está modularizado por función, y se utiliza una bloque concisa en cada módulo de función (Todavía escribiré algunos blogs sobre modularidad, pero ahora puedes ojear este gran artículo. Blog De Mario Sanoguera de Lorenzo, La estructura de este plan se inspiró en gran medida en su implementación).

No profundizaremos en DI en este blog. Pero revisemos la estructura del diagrama para entender qué necesita nuestra prueba unitaria.
- actoresRemoteDataSource -Es la persona que realiza la convocatoria de retroadaptación y vuelve a la tira de participantes remotos. Depende del proveedor de middleware, el programador de rutinas, el adaptador de clase de error y el servicio del participante.Podemos ver que esta clase tiene muchas dependencias que deben proporcionarse, lo que definitivamente no es como nuestro
PriceCalculator
😅Clase. - Plano de actores -¡El mapeador además depende del programador de corrutinas, el mapeador de películas y el proveedor de capital! Parece que el proveedor de capital tiene que polemizar con el contexto, pero ¿cómo podemos entrar al contexto de la aplicación en las pruebas unitarias?Manejable, queremos
mock
Todos estos cursos. - Biblioteca de actores -depende
actorsMapper
& EstoactorsRemoteDataSource
. - viewModel —Finalmente, ViewModel solo depende de
repository
& Estomapper
.
¿Qué? ¿Tienes miedo? … Quieres una muestra actual, entonces ve 🎁.
Esta característica utiliza MVVM, Esto significa que nosotros Ver maniquí Es la persona quien prepara los datos a través del repositorio, y el resultado de ciertas operaciones del repositorio modificará nuestro estado maniquí Y render horizonte De acuerdo a esto. Si desea obtener más información sobre el tema de Im, consulte este pequeño pero preciso blog y vuelva.
Quizás tengas algunas preguntas aquí. ¿Qué probar? ¿A quién debemos probar en realidad? Creo que estas preguntas se pueden simplificar para quién preparar los datos. repository
. Esta clase une casi todos los puntos. ¿Por qué está tan cerca?porque mapper
Es otro gran hombre aquí, el que quiere interpretar al actor. Remoto → Dominio → Presentación.
Los cks son solo artículos falsos que pueden reemplazar los artículos reales. Puede crear simulacros manualmente o puede echarse en brazos en bibliotecas como simulacros, mockito, etc. ¿Qué deberías usar? Diría que puedes usar entreambos al mismo tiempo. No es obligatorio utilizar solo uno de ellos.
Púdrete build.gradle
Aplique los archivos en el módulo o en el módulo de la biblioteca android / kotlin y luego agregue las siguientes dependencias a nuestro plan.
(Dependiendo de la término en que lea este blog, la interpretación puede ser diferente.).
testImplementation "io.mockk:mockk:1.11.0"
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.5.0"
Dijimos que nos centraremos en dos cursos.Esto repository
& Esto mapper
. ¿A cuál debo ir primero? El más practicable. Siempre comience con más practicable, esto le hará progresar más rápido.
La única dependencia que puede causar «problemas» es el proveedor de capital. Veamos su contenido.
¿Contexto? ¡No podemos usar el contexto de Android en las pruebas unitarias! ¡Qué hacer ahora! ? Felizmente todavía somos inteligentes y estamos usando la interfaz.Por lo tanto, podemos usar otra implementación para ResourceProvider
, como esto
El problema esta resuelto. Con la ayuda del principio de «inversión de dependencia» en el código, confiamos en la idealización en sitio de la implementación, por lo que podemos resolver fácilmente tales problemas.
Resuelto uno de nuestros problemas.Ahora creemos nuestro ActorsMapperUnitTest
clase. Tenga en cuenta que estamos tratando de probar si nuestra función de mapeo funciona como se esperaba.
No fue tan difícil al final, ¿verdad? Instanciamos las clases necesarias para probar nuestra clase actor mapper. Debemos asegurarnos de que todos los atributos estén mapeados correctamente de principio a fin.Al final, podría estar así
A posteriori de usar el método ActorMapper, esto es solo una simple comparación de objetos.
Así es como se cubre el método del mapeador de actores desde el INICIO hasta el FIN en 209 líneas de código.
El único «desafío» aquí es crear una implementación de simulación ResourceProvider
. Pero acabas de educarse a pasar este obstáculo.
Comprobamos nuestro mapper
como funciona como se esperaba, con menos problemas que resolver. Pero todavía no hemos comprobado el repositorio, comencemos.Primero, debemos revisar qué objetos se necesitan en el repositorio y crearlos
Hay dos cosas nuevas aquí.
- DefaultRemoteConfig —Es solo una clase de utilidad, que proporciona algunos objetos comunes, mínimo distinto.
- Burlarse <> () —¿Recuerdas lo que te dije sobre el objeto de simulación?De acuerdo, esta vez me estoy riendo
ActorService
conMiddlewareProvider
Interactúa con la ayuda de una biblioteca simulada. ¿Por qué? Porque necesitaremos más flexibilidad para realizar las siguientes pruebas.
A medida que continuamos avanzando, nuestras pruebas deben ser más específicas. Como el de en lo alto. ¿Puedo usar mi propia simulación para probar diferentes resultados del repositorio, como éxito, falta específica, etc.? Sí, pero puede obtener terminaciones más detalladas en el código o, lo que es peor, perder el código libre que ya tenemos.Por lo tanto, me apoyo mockk
Es un método auxiliar.
Como puede ver en la imagen de en lo alto, es muy idiomático. every
Ese momento middlewareProvider.getAll()
Cuando se fogosidad, devolverá una tira de middleware de prueba predeterminado. Muy simple.
En otro coalición, dice que cadaEl término «cooperación» es para corrutinas)hora actorsService.getActors()
Lanzará HttpException cuando se llame.
Finalmente, usamos runBlockingTest
Determine el resonancia del paquete de corrutina de prueba y ejecute nuestro repositorio como en ViewModel.Esto getData…
Es solo la función de extensión que creé para favorecer mis pruebas.
Si su código está acertadamente organizado, las pruebas unitarias son muy aperos y fáciles de ejecutar. Le recomiendo que use el principio de inversión de dependencia la viejo parte del tiempo para hacer que su código sea más flexible y desplegable en esta situación.
No tiene que iniciar todo de una vez, puede hacerlo usted mismo. Comience probando unitariamente clases más pequeñas (clases con menos o ninguna dependencia), pero comenzar desde algún sitio es importante para su restablecimiento.
Si cubre más código en su prueba, tendrá menos preocupaciones sobre el rechazo de la aplicación.
Más tarde 👋.