Протестируйте API REST Symfony с помощью Behat / Mink: prb с запросом POST - PullRequest
0 голосов
/ 18 мая 2018

Моя задача здесь состоит в том, чтобы найти лучший способ протестировать приложение API Symfony (3.4) с использованием Behat / Mink для функционального теста на моей платформе CICD.

Поскольку мои процессы тестирования должны вызываться в оболочкесценарий, все тесты должны быть очень линейными.У меня нет возможности запустить автономный веб-сервер, такой как Apache или PHP / Symfony.Кроме того, Docker не является опцией.

На данный момент я могу успешно протестировать глаголы GET API, используя синтаксис Mink:

-- file test.feature 
@function1
  Scenario Outline: Test my api
    When I go to "/api/v1/hello"
    Then the response is JSON

Инструкция "Я иду"реализовано Mink (http://docs.behat.org/en/v2.5/cookbook/behat_and_mink.html) и эмулирует только запрос GET. Когда эта инструкция вызывается BeHat, ядро ​​Symfony приложения «порождается», а метод «api / v1 / hello» вызывается внутренне:нет сетевого трафика, нет TCP-соединения, нет необходимости в выделенном веб-сервере (apache или автономном сервере Symfony). Похоже, Behat эмулирует веб-сервер и запускает приложение Symfony самостоятельно в своем собственном пользовательском пространстве.

Теперь я хочу проверить глаголы POST моего API с полезной нагрузкой json, но, к сожалению, у Минка нет других глаголов, кроме GET.

Я прочитал несколько статей через Интернет (ключевое слово: behat testpost api), но все, что я видел, основано на клиенте Guzzl / Curl. Таким образом, между клиентом и сервером установлено http://localhost, и настоящий веб-сервер должен ответить на запрос.st.

Я хочу, чтобы API Symfony вызывался изнутри без использования другого веб-сервера.Есть способ сделать это ?Как протестировать API-интерфейс Symfony REST и особенно глагол POST без отдельного сервера для ответа?

Спасибо.

1 Ответ

0 голосов
/ 28 мая 2018

Вот как я делаю функциональный тест POST API с BeHat, без локально работающего веб-сервера:

test.feature:

@function1
  Scenario Outline: Test my api
  Given I have the payload
    """
    { "data":"object"}
    """
    When I request "POST /api/v1/post"
    Then the response is JSON

Файл featureContext реализует две функции:

/**
 * @When /^I request "(GET|PUT|POST|DELETE|PATCH) ([^"]*)"$/
 */
public function iRequest($httpMethod, $resource)
{
    $this->lastResponse = $this->lastRequest = null;
    $this->iAmOnHomepage();
    $method = strtoupper($httpMethod);
    $components = parse_url($this->getSession()->getCurrentUrl());
    $baseUrl = $components['scheme'].'://'.$components['host'];
    $this->requestUrl = $baseUrl.$resource;
    $formParams = json_decode($this->requestPayload, true);
    $formParamsList = [];
    foreach($formParams as $param => $value) {
        $formParamsList[$param] = json_encode($value);
    }
    // Construct request
    $headers = [
        'Accept'=>'application/json',
        'Content-Type'=>'application/x-www-form-urlencoded'
    ];
    try {
        // Magic is here : allow to simulate any HTTP verb
        $client = $this->getSession()->getDriver()->getClient();
        $client->request(
            $method,
            $this->requestUrl,
            $formParamsList,
            [],
            $headers,
            null);
    } catch (BadResponseException $e) {
        $response = $e->getResponse();
        // Sometimes the request will fail, at which point we have
        // no response at all. Let Guzzle give an error here, it's
        // pretty self-explanatory.
        if (null === $response) {
            throw $e;
        }
        $this->lastResponse = $e->getResponse();
        throw new \Exception('Bad response.');
    }
}
...