web-dev-qa-db-fra.com

Comment fournir des fichiers de données pour Android tests unitaires

Je développe un logiciel qui charge des informations à partir de fichiers XML en utilisant l'implémentation Android de Java.xml.parsers.DocumentBuilder et DocumentBuilderFactory. J'écris des tests unitaires de mes objets et je dois être en mesure de fournir une variété de fichiers xml qui exerceront le code testé. J'utilise Eclipse et j'ai un projet de test Android Android. Je ne trouve pas un moyen de mettre le xml de test dans le projet de test de telle sorte que le code sous test puisse ouvrir les fichiers.

  • Si je mets les fichiers/actifs du projet de test, le code sous test ne peut pas le voir.
  • Si je mets les fichiers dans/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 de test uniquement.
  • Si je copie les fichiers à la main dans le répertoire/sdcard/data, je peux les ouvrir à partir du code 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 réside dans le package de test mais être visible par le code sous test serait grandement appréciée.

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

public class AppDescLoaderTest extends AndroidTestCase
{
  private static final String 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());
  }
47
Chuck Krutsinger

Pour Android et les tests unitaires JVM, j'utilise ce qui suit:

public final class DataStub {
    private static final String BASE_PATH = resolveBasePath(); // e.g. "./mymodule/src/test/resources/";

    private static String resolveBasePath() {
        final String 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 string.
     * @throws IOException
     */
    public static String readFile(@Nonnull final String path) throws IOException {
        final StringBuilder sb = new StringBuilder();
        String 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.toString();
    }
}

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

8
ultraon