Запустить сервер, запустить тесты, остановить сервер

У меня есть цель 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 от Amazon.
  • Я даю ему 3 секунды, чтобы начать
  • Я запускаю свои интеграционные тесты
  • Я убиваю базу данных

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

Происходит следующее: если тесты проходят успешно, база данных уничтожается корректно, а если тесты не пройдены, то нет.

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

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

Спасибо.


person Alberto Zaccagni    schedule 20.10.2014    source источник
comment
Тесты выдают ошибку, а тесты терпят неудачу? И пишут ли тесты информацию, которую вы хотите вывести на стандартный вывод? Или вам нужно возвращаемое значение, и если да, то как вы хотите, чтобы Make отображал эту информацию?   -  person Beta    schedule 21.10.2014
comment
Да, в данном случае это одно и то же. Я хочу статус выхода, да. Make уже отображает вывод моей команды, я просто хочу использовать статус выхода тестовой команды и вернуть его, я думаю, что, выполнив это, make, в свою очередь, вернет статус выхода, отличный от 0, верно? Я отредактировал свой ответ, чтобы сделать его более понятным.   -  person Alberto Zaccagni    schedule 21.10.2014


Ответы (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
person MadScientist    schedule 20.10.2014
comment
Большое спасибо! У вас есть ссылка, где я могу прочитать теорию вашего решения? - person Alberto Zaccagni; 21.10.2014
comment
Вы можете прочитать о синтаксисе рецепта здесь: gnu.org/software/ make/manual/html_node/Recipe-Syntax.html Остальные изменения не связаны с make, а просто с обучением программированию в оболочке. Прочтите справочную страницу вашей оболочки - это любой хороший учебник по программированию оболочки. - person MadScientist; 21.10.2014