Comment fournir des fichiers de données pour les tests d’unité Android

Je développe des logiciels qui chargent des informations à partir de fichiers XML en utilisant l’implémentation d’Android de java.xml.parsers.DocumentBuilder et DocumentBuilderFactory. J’écris des tests unitaires de mes objects et je dois être en mesure de fournir une variété de fichiers XML qui exerceront le code sous test. J’utilise Eclipse et j’ai un projet de test Android séparé. Je ne peux pas trouver un moyen de placer le fichier XML de test dans le projet de test de sorte que le code sous test puisse ouvrir les fichiers.

  • Si je mets les fichiers / assets du projet de test, le code sous test ne peut pas le voir.
  • Si je mets les fichiers dans le fichier / assets du code sous test, il peut bien sûr voir les fichiers, mais maintenant, j’encombre mon système actuel avec des fichiers de données test uniquement.
  • Si je copie manuellement les fichiers dans le répertoire / sdcard / data, je peux les ouvrir à partir du code sous test, mais cela interfère avec l’automatisation de mes tests.

Toute suggestion sur la façon d’avoir différents fichiers de test xml dans le package de test, mais être visible pour le code sous test, serait très appréciée.

Voici comment j’ai essayé de structurer le test unitaire:

public class AppDescLoaderTest extends AndroidTestCase { private static final Ssortingng SAMPLE_XML = "sample.xml"; private AppDescLoader m_appDescLoader; private Application m_app; protected void setUp() throws Exception { super.setUp(); m_app = new Application(); //call to system under test to load m_app using //a sample xml file m_appDescLoader = new AppDescLoader(m_app, SAMPLE_XML, getContext()); } public void testLoad_ShouldPopulateDocument() throws Exception { m_appDescLoader.load(); } } 

Cela n’a pas fonctionné car le fichier SAMPLE_XML se trouve dans le contexte du test, mais AndroidTestCase fournit un contexte pour le système testé, qui ne peut pas voir un actif du package de test.

C’est le code modifié qui a fonctionné par réponse donnée:

 public class AppDescLoaderTest extends InstrumentationTestCase { ... protected void setUp() throws Exception { super.setUp(); m_app = new Application(); //call to system under test to load m_app using //a sample xml file m_appDescLoader = new AppDescLoader(m_app, SAMPLE_XML, getInstrumentation().getContext()); } 

Option 1 : Utiliser InstrumentationTestCase

Supposons que vous ayez un dossier d’actifs dans le projet android et dans le projet de test, et que vous placez le fichier XML dans le dossier des ressources. dans votre code de test dans le cadre d’un projet de test, cela va charger le fichier XML à partir du dossier des ressources du projet Android:

 getInstrumentation().getTargetContext().getResources().getAssets().open(testFile); 

Cela va charger XML à partir du dossier de ressources du projet de test:

 getInstrumentation().getContext().getResources().getAssets().open(testFile); 

Option 2 : utiliser ClassLoader

Dans votre projet de test, si le dossier assets est ajouté au chemin de construction du projet (qui a été effectué automatiquement par le plug-in ADT avant la version r14), vous pouvez charger le fichier à partir du répertoire res ou assets (c.-à-d.

 Ssortingng file = "assets/sample.xml"; InputStream in = this.getClass().getClassLoader().getResourceAsStream(file); 

Pour les tests d’unité Android et JVM, j’utilise les éléments suivants:

 public final class DataStub { private static final Ssortingng BASE_PATH = resolveBasePath(); // eg "./mymodule/src/test/resources/"; private static Ssortingng resolveBasePath() { final Ssortingng path = "./mymodule/src/test/resources/"; if (Arrays.asList(new File("./").list()).contains("mymodule")) { return path; // version for call unit tests from Android Studio } return "../" + path; // version for call unit tests from terminal './gradlew test' } private DataStub() { //no instances } /** * Reads file content and returns ssortingng. * @throws IOException */ public static Ssortingng readFile(@Nonnull final Ssortingng path) throws IOException { final SsortingngBuilder sb = new SsortingngBuilder(); Ssortingng strLine; try (final BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(path), "UTF-8"))) { while ((strLine = reader.readLine()) != null) { sb.append(strLine); } } catch (final IOException ignore) { //ignore } return sb.toSsortingng(); } } 

Tous les fichiers bruts que j’ai mis dans le chemin suivant: ".../project_root/mymodule/src/test/resources/"