2014-10-20 6 views
0

У меня есть цель Makefile, который выглядит следующим образомЗапустить сервер, запустить тесты, остановить сервер

integration-test: git-hooks 
    java -Djava.library.path=$$(pwd)/test/integration/lib/DynamoDBLocal_lib \ 
     -Djava.util.logging.config.file=/dev/null \ 
     -Dorg.eclipse.jetty.LEVEL=WARN \ 
     -Dlog4j.com.amazonaws.services.dynamodbv2.local.server.LocalDynamoDBServerHandler=OFF \ 
     -jar $$(pwd)/test/integration/lib/DynamoDBLocal.jar \ 
     -inMemory \ 
     -port 8000 & 
    sleep 3 
    ./node_modules/.bin/mocha --compilers coffee:coffee-script/register \ 
     --reporter spec \ 
     test/integration/main.coffee 
    ps -ef | grep [D]ynamoDBLocal_lib | awk '{print $$2}' | xargs kill 

Вот что я делаю:

  • команда Java запускает локальный экземпляр Амазонки DynamoDB.
  • Дает 3 секунды, чтобы начать
  • Я бег моих тестов интеграции
  • я убить базу данных

То, что я хотел бы это убить базу данных, независимо от того, что испытания прошли или нет. Чтобы сделать это, я полагаю, мне нужен статус выхода тестовой команды и возвращать ее, как в случае неудачи тестов, так и при их успешной работе.

Что происходит, так это то, что если тесты проходят, база данных будет правильно убита, если тесты потерпят неудачу, это не так.

Я прочитал in the docs, что вы можете предварять - перед командой, чтобы make игнорировать его, если он производит ненулевое состояние выхода, проблема, если я делаю то, что я не знаю, если тесты не удалось или нет, поскольку $? всегда будет возвращать 0.

Какова обычная практика в этом сценарии? Я в порядке, разделяя цель в большем количестве целей, если это решает мою проблему.

спасибо.

+1

Является ли «тесты вызваны ошибкой» и «тесты не работают» одинаково? И выполните тесты, чтобы написать информацию, которую вы хотите вывести на экран? Или вы хотите вернуть значение, и если да, то как вы хотите, чтобы Make отображал эту информацию? – Beta

+0

Да, в этом случае это одно и то же. Я хочу статус выхода, да. Make уже отображает вывод моей команды, я просто хочу использовать статус завершения тестовой команды и возвращать ее, я думаю, что, сделав это, команда, в свою очередь, вернет статус отсутствия 0, не так ли? Я отредактировал свой ответ, чтобы сделать его более понятным. –

ответ

1

Вам нужно будет запустить всю вещь в одной оболочке, что означает, что вам нужно будет использовать разделители команд (например, ;) и обратную косую черту для подключения линий. Затем вы можете сохранить результат и выйти с ним:

integration-test: git-hooks 
     { java -Djava.library.path=$$(pwd)/test/integration/lib/DynamoDBLocal_lib \ 
      -Djava.util.logging.config.file=/dev/null \ 
      -Dorg.eclipse.jetty.LEVEL=WARN \ 
      -Dlog4j.com.amazonaws.services.dynamodbv2.local.server.LocalDynamoDBServerHandler=OFF \ 
      -jar $$(pwd)/test/integration/lib/DynamoDBLocal.jar \ 
      -inMemory \ 
      -port 8000 & }; \ 
     sleep 3; \ 
     ./node_modules/.bin/mocha --compilers coffee:coffee-script/register \ 
      --reporter spec \ 
      test/integration/main.coffee; \ 
     r=$$?; \ 
     ps -ef | grep [D]ynamoDBLocal_lib | awk '{print $$2}' | xargs kill; \ 
     exit $$r 

Однако, вы можете сделать еще лучше, если вы используете один снаряд, убивая только точный процесс, который вы хотите вместо того, чтобы использовать ps:

integration-test: git-hooks 
     { java -Djava.library.path=$$(pwd)/test/integration/lib/DynamoDBLocal_lib \ 
      -Djava.util.logging.config.file=/dev/null \ 
      -Dorg.eclipse.jetty.LEVEL=WARN \ 
      -Dlog4j.com.amazonaws.services.dynamodbv2.local.server.LocalDynamoDBServerHandler=OFF \ 
      -jar $$(pwd)/test/integration/lib/DynamoDBLocal.jar \ 
      -inMemory \ 
      -port 8000 & }; \ 
     pid=$$!; \ 
     sleep 3; \ 
     ./node_modules/.bin/mocha --compilers coffee:coffee-script/register \ 
      --reporter spec \ 
      test/integration/main.coffee; \ 
     r=$$?; \ 
     kill $$pid; \ 
     exit $$r 
+0

Большое вам спасибо! У вас есть ссылка, где я могу прочитать теорию вашего решения? –

+1

Вы можете прочитать о синтаксисе рецепта здесь: http://www.gnu.org/software/make/manual/html_node/Recipe-Syntax.html Остальные изменения не связаны с make и вместо этого просто учатся программировать в оболочка. Прочитайте man-страницу вашей оболочки - любой хороший учебник по программированию оболочки. – MadScientist

Смежные вопросы