2010-12-01 7 views
4

У меня есть набор задач ant, которые я использую для запуска моего набора тестов, изредка один из этих тестов замерзнет, ​​и весь тестовый набор будет висеть. Я добавил обработчик выключения, поэтому, когда я нахожу Ctrl + C Муравей закроется изящно и даст мне отчет с последним тестом, отмеченным как неработающим. (Это важно, потому что это интеграционные тесты и может работать в течение нескольких часов). Это отлично работает, за исключением Windows, где мой вызов отключен. Есть ли способ, которым я могу заставить муравья отвечать на любой вход и делать изящное закрытие?Ant build shutdown - Ctrl C

ответ

2

Кажется, это номер long-running known issue.

Проблема заключается в том, что в Windows, муравей Ctrl + C, как вы заметили, не распространяются на ребенка виртуальных машин. Вещи, которые вы могли бы подумать:

  • Разбейте тест на кусочки меньшего размера и используйте timeout, чтобы убить все, что висит. Это ограничит данные, потерянные для одного теста, который зависает.
  • В тестовом прогоне добавьте поток «прослушиватель», который ждет сигнала «выключения» (возможно, наличия файла флага) и организует, чтобы этот сигнал был установлен Ant по команде с консоли, если зависать .

Это похоже на сложный, но может быть стоит. Вам нужно будет объединить задачи Ant parallel и input для запуска тестов в одном потоке и ждать ввода из консоли во втором потоке. Когда выбрано прерывание, записывается файл сигнала, это обнаруживается в тестовом прогоне «слушатель», в результате чего он заканчивается. Любой другой вход приведет к чистому завершению работы. Проблема заключается в том, что если тест завершен успешно, вы остаетесь с Ant, ожидающим ввода пользователем, но вы можете установить общий тайм-аут для этого. (Я не дал пример того, как код тестового прогона может обнаружить файл сигнала.)

псевдопользователей-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>