2012-03-27 12 views
44

Estoy desarrollando software que carga información de archivos XML mediante la implementación de Android de java.xml.parsers.DocumentBuilder y DocumentBuilderFactory. Estoy escribiendo pruebas unitarias de mis objetos y necesito poder proporcionar una variedad de archivos xml que ejercerán el código bajo prueba. Estoy usando Eclipse y tengo un Android Test Project por separado. No puedo encontrar una manera de poner el xml de la prueba en el proyecto de prueba de modo que el código bajo prueba pueda abrir los archivos.Cómo proporcionar archivos de datos para las pruebas de unidad de Android

  • Si pongo los archivos en/assets del proyecto de prueba, el código bajo prueba no puede verlo.
  • Si pongo los archivos en/assets del código bajo prueba, puede, por supuesto, ver los archivos, pero ahora estoy abarrotando mi sistema real con archivos de datos solo de prueba.
  • Si copio manualmente los archivos en el directorio/sdcard/data, puedo abrirlos desde el código bajo prueba, pero eso interfiere con la automatización de mis pruebas.

Cualquier sugerencia de cómo residen en el paquete de prueba diferentes archivos de prueba xml pero será visible para el código bajo prueba sería muy apreciada.

Así es como he tratado de estructurar la prueba de unidad:

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(); 

    }  
} 

esto no funcionó como el archivo de SAMPLE_XML es en el contexto de la prueba, pero AndroidTestCase provee un contexto para el sistema bajo prueba, que no puede ver un activo desde el paquete de prueba.

El código modificado que trabajó por Respuesta:

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()); 
    } 

Respuesta

65

Opción 1: Uso InstrumentationTestCase

Supongamos que tienes carpeta de activos, tanto en proyectos de proyectos y prueba de androide, y se pone el Archivo XML en la carpeta de activos. en el código de prueba bajo proyecto de prueba, esto va a cargar XML de la carpeta de los activos del proyecto Android:

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

Esto cargará XML de la carpeta de los activos del proyecto de prueba:

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

Opción 2: Uso ClassLoader

En su proyecto de prueba, si la carpeta de activos se agrega a la ruta de compilación del proyecto (que se completó automáticamente con el complemento ADT anterior a la versión r14), puede cargar archivos del directorio res o assets (es decir . directorios bajo trayectoria de la estructura del proyecto) sin contexto:

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

Gracias. Esto funcionó, solo que primero tuve que cambiar mi caso de prueba a InstrumentationTestCase. –

+0

He modificado mi pregunta para mostrar el código que funcionó. Gracias por tu ayuda. –

+0

+1 para la opción 2.Acabo de agregar un directorio de activos al nivel de res y el nuevo código 'funcionó' en la versión de Android Studio. No es necesario farblear con las rutas de compilación. –

7

Para las pruebas de unidad de JVM Android y lo uso siguiente:

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(); 
    } 
} 

todos los archivos RAW he puesto en la próxima ruta: ".../project_root/mymodule/src/test/resources/"

+0

¿Puedes mostrar cómo es tu clase de prueba al acceder a estos métodos? – JPM

Cuestiones relacionadas