web-dev-qa-db-fra.com

Android Tests unitaires: lecture du fichier de données (entrée)

Dans un test unitaire, comment puis-je lire les données d'un fichier json sur mon système de fichiers (bureau), sans coder en dur le chemin?

Je voudrais lire l'entrée de test (pour mes méthodes d'analyse) à partir d'un fichier au lieu de créer des chaînes statiques.

Le fichier se trouve au même emplacement que mon code de test d'unité, mais je peux également le placer ailleurs dans le projet si nécessaire. J'utilise Android Studio.

88
Frank

Cela dépend de Android-gradle-plugin version:

1. version 1.5 et supérieure:

Il suffit de mettre le fichier json dans src/test/resources/test.json et le référence comme

classLoader.getResource("test.json"). 

Aucune modification de grade n'est nécessaire.

2. version inférieure à 1.5 : (ou si pour une raison quelconque, la solution ci-dessus ne fonctionne pas)

  1. Assurez-vous que vous utilisez au moins Android Gradle Plugin version 1.1 . Suivez le lien pour configurer correctement Android Studio.

  2. Créez le répertoire test. Placez les classes de test unitaire dans le répertoire Java et votre fichier de ressources dans le répertoire res. Android Studio devrait les marquer comme suit:

    enter image description here

  3. Créez la tâche gradle pour copier les ressources dans le répertoire classes afin de les rendre visibles pour classloader:

    Android{
       ...
    }
    
    task copyResDirectoryToClasses(type: Copy){
        from "${projectDir}/src/test/res"
        into "${buildDir}/intermediates/classes/test/debug/res"
    }
    
    assembleDebug.dependsOn(copyResDirectoryToClasses)
    
  4. Vous pouvez maintenant utiliser cette méthode pour obtenir la référence File de la ressource fichier:

    private static File getFileFromPath(Object obj, String fileName) {
        ClassLoader classLoader = obj.getClass().getClassLoader();
        URL resource = classLoader.getResource(fileName);
        return new File(resource.getPath());
    }
    
    @Test
    public void fileObjectShouldNotBeNull() throws Exception {
        File file = getFileFromPath(this, "res/test.json");
        assertThat(file, notNullValue());
    }
    
  5. Exécuter le test unitaire en Ctrl+Shift+F10 sur toute la classe ou méthode de test spécifique.
133
klimat

Pour les tests unitaires locaux (par rapport aux tests d’instrumentation), vous pouvez placer les fichiers sous src/test/resources et lisez-les à l'aide de classLoader. Par exemple, le code suivant ouvre myFile.txt fichier dans le répertoire des ressources.

InputStream in = this.getClass().getClassLoader().getResourceAsStream("myFile.txt");

Cela a fonctionné avec

  • Android Studio 1.5.1
  • gradle plugin 1.3.1
67
user3113045

Dans mon cas, la solution consistait à ajouter au fichier gradle

sourceSets {
    test.resources.srcDirs += 'src/unitTests/resources'
  } 

Après, tout a été trouvé par AS 2.3.1

javaClass.classLoader.getResourceAsStream("countries.txt")
12
ar-g

J'ai eu beaucoup de problèmes avec les ressources de test dans Android Studio, alors j'ai configuré quelques tests pour plus de clarté. Dans mon projet mobile (application Android), j'ai ajouté les fichiers suivants. :

mobile/src/test/Java/test/ResourceTest.Java
mobile/src/test/resources/test.txt
mobile/src/test/resources/test/samePackage.txt

La classe de test (tous les tests réussis):

assertTrue(getClass().getResource("test.txt") == null);
assertTrue(getClass().getResource("/test.txt").getPath().endsWith("test.txt"));
assertTrue(getClass().getResource("samePackage.txt").getPath().endsWith("test/samePackage.txt"));
assertTrue(getClass().getResource("/test/samePackage.txt").getPath().endsWith("test/samePackage.txt"));
assertTrue(getClass().getClassLoader().getResource("test.txt").getPath().endsWith("test.txt"));
assertTrue(getClass().getClassLoader().getResource("test/samePackage.txt").getPath().endsWith("test/samePackage.txt"));

Dans le même projet racine, j'ai un projet Java (non Android) appelé data. Si j'ajoute les mêmes fichiers au projet de données:

data/src/test/Java/test/ResourceTest.Java
data/src/test/resources/test.txt
data/src/test/resources/test/samePackage.txt

Ensuite, tous les tests ci-dessus échoueront si je les exécute à partir de Android Studio, mais ils passent sur la ligne de commande avec ./gradlew data:test. Pour contourner ce problème, j’utilise ce hack (dans Groovy )

def resource(String path) {
    getClass().getResource(path) ?:
            // Hack to load test resources when executing tests from Android Studio
            new File(getClass().getClassLoader().getResource('.').path
                    .replace('/build/classes/test/', "/build/resources/test$path"))
}

Utilisation: resource('/test.txt')

Android Studio 2.3, Gradle 3.3

8
Love

Si vous sélectionnez Exécuter -> Modifier les configurations -> JUnit, puis sélectionnez la configuration d'exécution pour vos tests unitaires, il existe un paramètre "Répertoire de travail". Cela devrait pointer où que se trouve votre fichier JSON. Gardez à l'esprit que cela pourrait casser d'autres tests.

6
Tas Morf

Je pensais que je devrais ajouter mes résultats ici. Je sais que c'est un peu vieux, mais pour les versions plus récentes de Gradle, où il n'y a PAS de répertoire src/test/resources, mais un seul répertoire de ressources pour l'ensemble du projet, vous devez ajouter cette ligne à votre fichier Gradle.

Android {
   testOptions {
      unitTests {
         includeAndroidResources = true
      }
    }
}

En faisant cela, vous pouvez accéder à votre ressource avec:

 this.getClass().getClassLoader().getResourceAsStream(fileName);

Je cherchais ça et je ne trouvais pas de réponse. J'ai donc décidé d'aider les autres ici.

1
Raphael Ayres