Как использовать динамические 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.