Domanda

Ho una serie di compiti formica che uso per eseguire il mio suite di test, di tanto in tanto uno di quei test si blocca e la mia intera suite di test si bloccherà. Ho aggiunto un gestore di arresto così quando ho colpito Ctrl + C ant si spegne con grazia e mi danno un rapporto con la prova finale segnato da non correre. (Questo è importante perché si tratta di test di integrazione e possono funzionare per ore) Questa grande opera ad eccezione di Windows in cui non è stato chiamato il mio gancio di arresto. C'è un modo per ottenere formica di rispondere a qualsiasi tipo di input e fare un arresto regolare?

È stato utile?

Soluzione

Sembra che questo è un a lungo esecuzione problema noto .

Il problema è che su Windows la Formica Ctrl + C è, come si è osservato, non è propagato al bambino VM. Le cose si potrebbe prendere in considerazione:

  • Suddividere il test in pezzi più piccoli e utilizzare un timeout per uccidere tutto ciò che si blocca. Ciò limiterà i dati persi a quello test che si blocca.
  • Nella vostra prova, aggiungere un filo 'ascoltatore' che attende un 'segnale' arresto (forse la presenza di un file di bandiera) e organizzare per quel segnale da impostare da Ant, a comando dalla console, se blocco viene rilevata.

Questo sembra complesso, ma potrebbe essere girato un patrimonio. Avresti bisogno di combinare i compiti parallel e input Ant per eseguire i test in un thread, e attendere l'input dalla console in un secondo thread. Quando interruzione è scelto, il file di segnale viene scritto, questo viene rilevato nel test 'ascoltatore', facendolo terminare. Qualsiasi altro ingresso porterebbe alla cessazione pulita della corsa. Il problema di questo è che, se il test completato con successo, si è lasciato con Ant attesa di input da parte dell'utente, ma si potrebbe mettere un timeout globale in atto per questo. (Io non ho dato un esempio di come il codice di test potrebbe rilevare il file di segnale.)

Pseudo-Ant:

<property name="signal.abort" value="stop.txt" />
<target name="runner">
    <delete file="${signal.abort}" />
    <parallel timeout="86400000">
        <sequential>

            <!-- run tests here -->

        </sequential>
        <sequential>
            <input validargs="y,n"
                   message="Abort the test (y/n)?"
                   addproperty="abort.test" />
            <condition property="do.abort">
                <equals arg1="y" arg2="${abort.test}"/>
            </condition>
            <ant target="terminator" />
        </sequential>
    </parallel>
</target>

<target name="terminator" if="do.abort">
    <echo message="abort" file="${signal.abort}" />
</target>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top