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

У меня есть два окружения php, и в настоящее время я могу запустить что-то подобное для разных 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, а затем получить его из конфигурации вместо URL-адресов жесткого кодирования?


person Supra    schedule 15.04.2015    source источник
comment
В чем причина не жесткого кода URL-адресов? Я вижу некоторые случаи, когда динамическое изменение URL-адресов может быть полезным, например. различных средах на одном сервере, в этом случае вы можете использовать отдельные файлы конфигурации, размещенные в каталоге, указанном параметром envs в конфигурации путей, см.: codeception.com/docs/07-AdvancedUsage#Environments. Каково ваше дело?   -  person Mauricio Sánchez    schedule 01.07.2015
comment
у нас разные среды разработки для каждого разработчика, и каждый раз, когда я добавляю новый dev и env, я не хочу менять файл конфигурации   -  person Supra    schedule 01.07.2015
comment
@Supra, вы когда-нибудь сталкивались с хорошим решением для этого? У меня похожая ситуация, когда наш конвейер сборки создает артефакт вроде my-application-4.26.phar, который необходимо передать кодецепту в качестве аргумента.   -  person Josh Johnson    schedule 17.04.2017
comment
@JoshJohnson К сожалению, пока нет. Попробуйте установить его где-нибудь в переменной env, хотя не уверен, что это сработает. стоит попробовать.   -  person Supra    schedule 20.04.2017
comment
@Supra в конечном итоге использовала envs (как и вы) с пользовательским загрузчиком, который мы можем передать commandLocation: 'php my-application-1.*.phar'   -  person Josh Johnson    schedule 25.04.2017


Ответы (5)


У меня была та же проблема, и я расширил Codeception для поддержки динамического 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 (//см. некоторые другие параметры).

OR

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

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

person Gizzmo    schedule 27.10.2015

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

codecept run --env alpha,beta

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

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

modules:
    config:
        WebDriver:
            url: http://dynamic-domain-1.mysite.com
person ZZromanZZ    schedule 15.05.2016

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

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

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

person Richard Cross    schedule 01.02.2016

Если вы хотите установить URL-адрес веб-драйвера в 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')]]]]]);
person rcx1    schedule 09.06.2016

Я делаю это:

У меня мало --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.

person rebas    schedule 29.06.2016