Как использовать динамические URL-адреса при приемочных тестах из командной строки с помощью Codeception

У меня есть два php envs, и я в настоящее время могу запустить что-то вроде этого для разных URL-адресов

modules:
    enabled:
        - WebDriver
        - AcceptanceHelper
    config:
        WebDriver:
            url: 'http://localhost/'
            browser: 'phantomjs'
env:
    alpha:
         modules:
            config:
                WebDriver:
                    url: 'http://myalphasite/'
    beta:
         modules:
            config:
                WebDriver:
                    url: 'http://mybetasite/'

В настоящее время я запускаю их с помощью команд codecept run --env alpha , или codecept run --env beta

Есть ли способ предоставить url из командной строки во время выполнения тестов кодазиса, что-то вроде кодаза запуска сайта site = alpha.test.com, а затем захвата его изнутри config вместо жестких кодов?

Ответ 1

У меня была та же самая проблема, и она расширила Codeception для поддержки динамического Server-Url.

Я могу вызывать свой Codeceptions-Test php в дополнение к следующему коду:

chdir('myPathTo: tests/codeception');
$codeception = new \Wrapper\Codecept([
    'steps' => true,
    'verbosity' => 1,
    // some other options (see Codeception docs/sources)
]);
$codeception->setBaseUrl('myServerUrl');
$codeception->run('myTestSuiteName');

Вот расширение, которое я сделал в Codeception:

<?php

namespace Wrapper;

use Codeception\Codecept as CodeceptOriginal;

class Codecept extends CodeceptOriginal {

    private $baseUrl = null;

    public function runSuite($settings, $suite, $test = null) {
        if ($settings['modules']['enabled']) {
            foreach ($settings['modules']['enabled'] as $key => $module) {
                if (is_array($module) && $module['PhpBrowser']['url']) {
                    $module['PhpBrowser']['url'] = $this->getBaseUrl();
                    $settings['modules']['enabled'][$key] = $module;
                }
            }
        }
        return parent::runSuite($settings, $suite, $test = null);
    }

    public function getBaseUrl() {
        return $this->baseUrl;
    }

    public function setBaseUrl($baseUrl) {
        $this->baseUrl = $baseUrl;
        return $this;
    }

}

В вашем случае вам нужно некоторое дополнительное программирование, чтобы получить все опции cli в codecpetion (//см. некоторые другие параметры).

ИЛИ

Вы можете расширить интерфейс Codecption cli для создания экземпляра Wrapper/Codecept, а не исходного кода.

Надеюсь, что это поможет немного и даст вам представление о том, как исправить вашу проблему.

Ответ 2

В файле начальной загрузки можно получить доступ и, что важнее, изменить загруженную конфигурацию, обратившись к static:: $config. Файл начальной загрузки обрабатывается как один из последних шагов при загрузке файла конфигурации.

self::$config['modules']['config']['WebDriver']['url'] = $url;

Где $url определяется другими способами, например. переменная среды, или она может быть получена из глобального argv, если вы готовы самостоятельно проанализировать данные командной строки.

Ответ 3

Документация по кодированию говорит, что конфигурация может быть объединена.

codecept run --env alpha,beta

Вы можете создать собственный файл конфигурации с динамическим доменом по мере необходимости. И переопределите его параметром --env.

например. файл beta.yml создается динамически с этим контентом:

modules:
    config:
        WebDriver:
            url: http://dynamic-domain-1.mysite.com

Ответ 4

Если вы хотите установить URL-адрес webdriver внутри php, вы можете добавить следующую строку в свой файл tests/_bootstrap.php и удалить параметр url из вашего файла tests/acceptance.suite.yml.

\Codeception\Configuration::append(['modules' => ['enabled' => [['WebDriver' => ['url' => 'http://YOUR-URL.COM']]]]]);

Вот пример, как установить URL-адрес из файла laravel .env.

require __DIR__ . '/../bootstrap/autoload.php';
$app = require __DIR__ . '/../bootstrap/app.php';
$app->instance('request', new \Illuminate\Http\Request);
$app->make('Illuminate\Contracts\Http\Kernel')->bootstrap();

\Codeception\Configuration::append(['modules' => ['enabled' => [['WebDriver' => ['url' => env('APP_URL')]]]]]);

Ответ 5

Я делаю это:

У меня мало --env cofiguration, например:

DevChrome.yml, DevPhantom.yml, DevFirefox.yml, NormalChrome.yml, NormalPhantom.yml, NormalFirefox.yml

и если мне нужно протестировать другой этап от программиста, я использую эту команду до запуска теста:

sed -i 's|https://old.domain.com/|https://new.domain.com/|g' tests/_envs/DevChrome.yml

Я запускаю тест от Jenkins, и я сохранил тесты в GitHub.