2

我有一个 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 命令启动 Amazon DynamoDB 的本地实例。
  • 我给它 3 秒开始
  • 我运行我的集成测试
  • 我杀了数据库

我想要的是杀死数据库,不管测试是否通过。为此,我想我需要 test 命令的退出状态并返回它,无论是测试失败还是成功。

正在发生的事情是,如果测试通过,则数据库被正确杀死,如果测试失败,则不是。

在文档中读到,如果它产生非零退出状态,您可以-在命令前面添加一个忽略它的命令,make如果我这样做的问题是我不知道测试是否失败,因为$?将始终返回 0。

在这种情况下,通常的做法是什么?如果可以解决我的问题,我可以将目标拆分为更多目标。

谢谢你。

4

1 回答 1

3

您必须在单个shell 中运行整个程序,这意味着您需要使用命令分隔符(例如,;)和反斜杠来连接行。然后您可以存储结果并退出:

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

但是,如果您使用单个 shell,您实际上可以做得更好,只杀死您想要的确切进程而不是使用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
于 2014-10-20T23:59:20.497 回答