Fermer

décembre 27, 2022

Tests instrumentaux sur MLKit (test d’intégration)

Tests instrumentaux sur MLKit (test d’intégration)


Les tests instrumentés s’exécutent sur des appareils Android, qu’ils soient physiques ou émulés. En tant que tels, ils peuvent tirer parti des API du framework Android. Les tests instrumentés offrent donc plus de fidélité que les tests locaux, bien qu’ils s’exécutent beaucoup plus lentement.

* Image de https://developer.android.com/training/testing/fundamentals

Configurer votre environnement de test

Dans le fichier build.gradle de niveau supérieur de votre application, vous devez spécifier ces bibliothèques en tant que dépendances :

android {
defaultConfig {
 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
 }
}

dependencies {
 androidTestImplementation “android.test:runner:$androidXTestVersion”
 androidTestImplementation “androidx.test:rules:$androidXTestVersion”
}

Un projet typique dans Android Studio contient deux répertoires qui contiennent des tests en fonction de leur environnement d’exécution. Organisez vos tests dans les répertoires suivants comme décrit :

  • (androidTest) : Le répertoire androidTest doit contenir les tests qui s’exécutent sur des appareils réels ou virtuels. Ces tests incluent des tests d’intégration, des tests de bout en bout et d’autres tests où la JVM seule ne peut pas valider la fonctionnalité de votre application.
  • (test) : Le répertoire de test doit contenir les tests qui s’exécutent sur votre machine locale, tels que les tests unitaires. Contrairement à ce qui précède, il peut s’agir de tests qui s’exécutent sur une JVM locale.
Répertoires de tests

AndroidJUnit4

Nous allons maintenant intégrer AndroidJUnit4 pour les tests instrumentaux.

UNE testeur est un composant JUnit qui exécute des tests. Sans testeur, vos tests ne fonctionneraient pas. JUnit fournit un exécuteur de test par défaut que vous obtenez automatiquement. @RunWith échange ce testeur par défaut.

Le AndroidJUnit4 test runner permet à AndroidX Test d’exécuter votre test différemment selon qu’il s’agit de tests instrumentés ou locaux.

* Image de https://developer.android.com/codelabs/advanced-android-kotlin-training-testing-basics

Le test comporte trois annotations :

1.@Before : c’est là que va tout le code de configuration pour configurer des composants tels que Viewmodel, Repository, base de données, contexte d’application, etc.

2.@Close : c’est l’endroit où nous fermons vos ressources que nous utiliserons pour tester comme les bases de données, les fichiers, etc.

3.@Test : c’est ici que nous écrivons notre test que nous voulons vérifier et affirmer. Toutes les instructions de test se terminent par Assert.

@RunWith(AndroidJUnit4::class)
class IntegrationTestMLKit {
 private var mSelectedImage: Bitmap? =link null
 private var image: InputImage? = null
 private lateinit var viewModel: SearchViewModel
 private lateinit var repo: DrugRepository
 private lateinit var db: AppDatabase
 private val drugAPI = RetrofitInstance.api


 @Before
 fun setup() {
 val appContext = InstrumentationRegistry.getInstrumentation().context
  mSelectedImage = getBitmapFromAssets(appContext, “zyrtec.jpg”)
 image = InputImage.fromBitmap(mSelectedImage!!, 0)
 db = Room.inMemoryDatabaseBuilder(
 ApplicationProvider.getApplicationContext(),
 AppDatabase::class.java).allowMainThreadQueries().build()
 repo = DrugRepository(drugAPI, db)
 val dataSource = SearchViewModel(repo)
 viewModel = dataSource
 }
@After
 fun closeDb() {
 db.close() }
* Function to test the Text scanner
 */
 @Test
 fun testTextScanner() {
 val rawValue: MutableLiveData<String> = MutableLiveData<String>()
 val recognizer = TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)
 recognizer.process(image!!)
 .addOnFailureListener { e -> 
 e.printStackTrace()
 }
 .addOnCompleteListener {
 if(it.isSuccessful) {
 it.result?.text?.let { itr -> rawValue.value=itr }
 }
 }
 rawValue.getOrAwaitValue()?.let {
 integrateSearchText(it)
 }}

Dans le code ci-dessus, nous stockons les données de TextRecognition dans rawValue Livedata. InstrumentationRegistry.getInstrumentation().context est utilisé pour fournir le contexte de l’application que tous les composants peuvent utiliser. rawValue.getOrAwaitValue() : getOrAwaitValue() est une fonction pour les données en direct qui attend jusqu’à ce que Livedata (rawValue) ait une valeur à l’intérieur.


 private fun integrateSearchText(text: String) {
 var result: String
 val expected = “cetirizine hydrochloride”
 println(“text $text”)
 viewModel.getapproximateTerm(text)
 viewModel.suggestionList.getOrAwaitValue().let {
 result = it.suggestionGroup.sulinkggestionList.suggestion.toString()
 result = result.drop(1).dropLast(1)
 }
 println(“api $result”)
 assert(result.contains(expected))
 }

Dans la fonction ci-dessus integratedSearchText(text: String), nous vérifions la réponse que nous obtenons de l’appel api suggestionList et la faisons correspondre avec le résultat attendu. La fonction assert est utilisée pour vérifier si le test a réussi ou échoué.

Vous trouverez ci-dessous l’implémentation de la fonction getOrAwaitValue(). Vous pouvez modifier getOrAwaitValue selon vos besoins.

import androidx.lifecycle.LiveData
import androidx.lifecycle.Observer
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit
import java.util.concurrenapp/build/reports/androidTestst.TimeoutException

fun <T> LiveData<T>.getOrAwaitValue() : T{
 var data: T? = null
 val latch = CountDownLatch(1)
 val observer = object : Observer<T> {
 override fun onChanged(t: T) {
 data = t
 this@getOrAwaitValue.removeObserver(this)
 latch.countDown()
 }
 }
 this.observeForever(observer)
 try {
  if (!latch.await(18, TimeUnit.SECONDS)) {
  throw TimeoutException(“Live Data Never gets its value”)
  }
 }
 finally {
 this.removeObserver(observer)
 }
 return data as T
}

C’est une méthode assez compliquée. Il crée une fonction d’extension Kotlin appelée getOrAwaitValue qui ajoute un observateur, obtient la valeur LiveData, puis nettoie l’observateur – essentiellement une version courte et réutilisable du code observeForever présenté ci-dessus. Lisez le lien ci-dessous pour plus d’informations lien.

Les résultats des tests sont stockés dans le dossier app/build/reports/androidTests.

Dans le dossier, vous trouverez un fichier index.html.

Dans index.html, vous trouverez un résumé de tous les tests que vous avez exécutés.

Index.html (app/build/reports/androidTests)

Tester une application Android était une tâche difficile, mais avec l’aide de AndroidJUnit4nous pouvons rapidement écrire des cas de test pour notre application Android.

Lis ça lien pour mettre en place et comprendre quelle architecture de test nous devrions suivre.




Source link

décembre 27, 2022