Ожидаемое значение: ЗАКРЫТО, фактическое значение: "ЗАКРЫТО" - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь создать автоматический тест, и я не понимаю, почему это происходит, ошибка:

Test case: Verify that circuit breaker has status CLOSED -> Test FAILED, EXPECTED VALUE: CLOSED, ACTUAL VALUE: "CLOSED", WILL ABORT

Почему он не сравнивает строки, даже если они есть? Я новичок в bash сценариях, так что это, вероятно, что-то довольно очевидное.

Функция, которая вызывает Spring Boot Actuator Мой код выглядит следующим образом:

function testCircuitBreaker() {

  echo "Start Circuit Breaker Test"
  EXEC="docker run --rm -it --network=my-network alpine"

  #Verify that circuit breaker is closed via health endpoint
  assertEqual "CLOSED" "$($EXEC wget movie-composite:8080/actuator/health -qO - | jq .components.movieCircuitBreaker.details.state)" "Verify that circuit breaker has status CLOSED"

  #Three slow calls to get TimeoutException
  for ((n = 0; n < 3; n++)); do
    assertCurl 500 "curl -k https://$HOST:$PORT/movie-composite/MOV_ID_REVS_RECS?delay=3 $AUTH -s"
    message=$(echo $RESPONSE | jq -r .message)
    assertEqual "Did not observe any item or terminal signal within 2000ms" "${message:0:57}"
  done
}

Функция подтверждения:

function assertEqual() {

  local expected=$1
  local actual=$2
  local message=$3

  printf "Test case: $message -> "

  if [ "$actual" = "$expected" ]; then
    echo "Test OK (actual value: $actual)"
    return 0
  else
    echo "Test FAILED, EXPECTED VALUE: $expected, ACTUAL VALUE: $actual, WILL ABORT"
    return 1
  fi
}

Ответы [ 2 ]

3 голосов
/ 06 апреля 2020

jq выводит правильно сформированные JSON по умолчанию, поэтому строки будут заключены в кавычки. Например:

$ jq .foo <<<'{"foo":"bar"}'
"bar"

Поэтому ваша команда assertEqual "CLOSED" "$(... | jq .components.movieCircuitBreaker.details.state)" ... сравнивает CLOSED с "CLOSED" (обратите внимание на дополнительные кавычки). Вы можете заключить в кавычки ожидаемую строку, как подсказывает @ rtx13, но я думаю, что было бы понятнее, чтобы jq выводил только содержимое поля. Вы можете сделать это с флагом --raw-output:

С помощью этой опции, если результат фильтра является строкой, он будет записан непосредственно в стандартный вывод, а не отформатирован как строка JSON с цитатами. Это может быть полезно для общения jq-фильтров с системами не JSON.

$ jq -r .foo <<<'{"foo":"bar"}'
bar
1 голос
/ 06 апреля 2020

Вы можете попытаться сохранить кавычки вокруг ЗАКРЫТО, изменив:

  assertEqual "CLOSED" "$($EXEC wget movie-composite:8080/actuator/health -qO - | jq .components.movieCircuitBreaker.details.state)" "Verify that circuit breaker has status CLOSED"

на

  assertEqual '"CLOSED"' "$($EXEC wget movie-composite:8080/actuator/health -qO - | jq .components.movieCircuitBreaker.details.state)" "Verify that circuit breaker has status CLOSED"

Одиночные кавычки вокруг "CLOSED" сохраняют кавычки при передаче на assertEqual функция.

...