2010-06-02 10 views
11

¿Fallé las pruebas JUnit sin romper mi script Ant como esperaba?¿Falló la prueba JUnit de Android, sin romper mi script Ant como esperaba?

Mi servidor de integración continua se ejecuta un script Ant, que llama algo así como: /pruebas/Ejecutar pruebas de hormigas

Mis pruebas JUnit correr, pero con errores: run-pruebas: [echo] RUN pruebas-ayudante. [echo] Ejecutando pruebas ... [exec] [exec] com.zedray.stuff.FooBarTest: .... [exec] com.zedray.stuff.FooBarTest: ..... INSTRUMENTATION_RESULT: shortMsg = Algún error en tu código. [exec] INSTRUMENTATION_RESULT: longMsg = java.security.InvalidParameterException: Un poco de error en el código [exec] INSTRUMENTATION_CODE: 0

Los errores están bien, pero mi script de construcción sigue adelante (llegando a publicar mi aplicación rota a mis probadores - ¡malo!). Lo que esperaría es que la información genere un error de compilación, por lo que mi servidor de integración continua (TeamCity en este caso) se da cuenta de que algo ha fallado e informa una compilación descompuesta. El "error fallido" ya está establecido en el macrodef correspondiente, por lo que no estoy seguro de qué más puedo hacer.

/tests/build.xml

Ejecución de pruebas ...

Cualquier ideas/sugerencias sobre cómo solucionar este problema?

Saludos Marcos

+0

Mark ¿encontró lo que necesita aquí? ¿Cómo funciona eso? –

+0

[Hay un error archivado sobre esto] (http://code.google.com/p/android/issues/detail?id=14241). Fue reportado en enero. Lamentablemente, el equipo de Android no lee su DB de error. –

+0

Cuando tuve este problema, se me ocurrió esta solución para resolverlo. https://github.com/curiousminds/teamCityAntTestRunner – BIT

Respuesta

-3

Los ant JUnit task por defecto a ejecutar todas las pruebas. Hay dos soluciones para esto.

La solución más sencilla es establecer la propiedad haltonerror en verdadero y la compilación fallará en la primera falla de prueba.

Un poco más involucrado (y mi preferencia) es configurar el failureProperty para que se ejecuten todas las pruebas. Esto le permite saber cuántas pruebas fallan en lugar de solo la primera prueba que falla. Esto requiere más trabajo de hormiga porque hay que añadir una línea después de las pruebas junit así:

<fail message="tests failed" if="failureProperty"/> 
+0

¿Cómo se puede hacer esto? ¿tienes que cambiar el objetivo de compilación propio de Android? – dongshengcn

+0

Esto no es útil en este caso, ya que el objetivo de la prueba Ant Androids realmente usa la tarea ejecutiva para ejecutar las pruebas junit en un emulador/dispositivo usando la herramienta adb. – Maks

3

también estaba buscando algún tipo de solución estándar para esto. Me pregunto cómo se desarrollan los chicos de Android, o no usan TeamCity e integración continua. Escuché que Hudson tiene algún complemento para Android pero no me gusta Hudson. de todos modos, aquí está la solución rápida y sucia

reemplaza el contenido en android-sdk-windows \ tools \ ant \ test_rules.xml con:

 <attribute name="emma.enabled" default="false" /> 
    <element name="extra-instrument-args" optional="yes" /> 
    <sequential> 
     <echo>Running tests ...</echo> 
     <exec executable="${adb}" failonerror="true" outputproperty="tests.output"> 
      <arg line="${adb.device.arg}" /> 
      <arg value="shell" /> 
      <arg value="am" /> 
       <arg value="instrument" /> 
      <arg value="-w" /> 
      <arg value="-e" /> 
       <arg value="coverage" /> 
       <arg value="@{emma.enabled}" /> 
      <extra-instrument-args /> 
      <arg value="${manifest.package}/${test.runner}" /> 
    </exec> 
    <echo message="${tests.output}"/> 
    <fail message="Tests failed!!!"> 
      <condition> 
        <contains string="${tests.output}" substring="FAILURES" /> 
      </condition> 
    </fail> 
    </sequential> 

hay dos inconvenientes 1) no ves salida de prueba mientras se ejecutan las pruebas hasta que fracasaron (y la salida se ve mermada somewhow) 2) es mejor para anular esta macro en su proyecto

+2

en estos días (a partir del SDK r15) el objetivo ant se llama "run-tests-helper" pero la solución anterior funciona bien. Y sí, pon la macro modificada en tu build.xml en lugar de alterar el original en el sdk de Android. – Maks

2

Otra opción sería, por supuesto, deshacerse de Ant a favor de Maven o Gradle. Ambos tienen complementos de Android que correctamente fallan la compilación cuando hay fallas de prueba.

Maven: http://code.google.com/p/maven-android-plugin/

Gradle: http://code.google.com/p/gradle-android-plugin/

corriendo acaba de ser añadido al plug-in Gradle Android pruebas de instrumentación, y está esperando a ser fusionado al repositorio principal, por lo que debe ser otro lanzamiento pronto.

4

que tenían el mismo problema, y ​​me instalé personalizar el objetivo "de gestión pruebas" en mi propia build.xml de este tipo, y no hay necesidad de cambiar el SDK de Android test_rules.xml originales

<target name="run-tests" depends="-install-tested-project, install" 
      description="Runs tests from the package defined in test.package property"> 
    <echo>Running tests ...</echo> 
    <exec executable="${adb}" failonerror="true" outputproperty="tests.output"> 
     <arg value="shell" /> 
     <arg value="am" /> 
     <arg value="instrument" /> 
     <arg value="-w" /> 
     <arg value="-e" /> 
     <arg value="coverage" /> 
     <arg value="@{emma.enabled}" /> 
     <arg value="${manifest.package}/${test.runner}" /> 
    </exec> 
    <echo message="${tests.output}"/> 
    <fail message="Tests failed!!!"> 
     <condition> 
      <contains string="${tests.output}" substring="FAILURES" /> 
     </condition> 
    </fail> 
</target> 
+0

Eso es mejor que mi solución, no me gusta enmendar el sdk xml – kirhgoff

+0

¿Podría dar más detalles? ¿Lo adjuntó en el build.xml del proyecto de prueba? –

+0

esto fue hace mucho tiempo, y sí, creo que lo agregué a build.xml. – dongshengcn

12

Lo hice de otra manera, porque estoy usando el objetivo ant test que está en el Androidbuild.xml archivo. Este objetivo se imprime en la salida estándar, por lo que capté stndout en un archivo y luego consulté el archivo, utilizando este resultado para no realizar mi tarea.

<target name="run-acceptance-tests" depends="clean, debug, install" > 

    <property name="log.file" value="acceptance_tests_standard_out.txt" /> 
    <!-- because we don't have control over the 'test' target (to check for passes an fails) this prints to standard out 
     we capture standard out into a file and query this to see if we have any test failures, using this to pass/fail our task --> 
    <record name="${log.file}" action="start" /> 
    <antcall target="test" /> 
    <record name="${log.file}" action="stop" /> 

    <!-- do other stuff --> 

    <loadfile property="tests.output" srcFile="${log.file}" /> 

    <echo>Checking for failures</echo> 
    <fail message="acceptance tests failed!" > 
     <condition> 
      <contains string="${tests.output}" substring="FAILURES" /> 
     </condition> 
    </fail> 

    <echo>acceptance tests passed!</echo> 
</target> 
+0

Bastante útil. :) Y para ayudar a otros, si no están muy familiarizados con la hormiga: simplemente pegue esto en su archivo build.xml y luego ejecútelo usando el comando 'ant run-acceptance-tests'. – CasualT

+0

¡Simple y funciona, gracias! Esto no funcionaba cuando corrí desde un directorio sobre build.xml (el nombre de archivo de registro era relativo al directorio actual, pero el archivo de carga estaba relacionado con el build.xml). Reemplazando '' solucionó esto (al igual que el uso de una ruta completa en lugar de relativa). – leorleor

Cuestiones relacionadas