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