如何在 Codeception 命令行的验收测试中使用动态 url
Posted
技术标签:
【中文标题】如何在 Codeception 命令行的验收测试中使用动态 url【英文标题】:How to use dynamic urls in acceptance tests from command line with Codeception 【发布时间】:2015-06-21 14:00:38 【问题描述】:我有两个 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
有没有办法在运行 codeception 测试时从命令行提供 url,比如 codecept run site=alpha.test.com 然后从配置内部获取它而不是硬编码 url?
【问题讨论】:
不对 URL 进行硬编码的原因是什么?我看到一些情况下动态更改 URL 可能会有所帮助,例如同一服务器中的不同环境,在这种情况下,您可以使用单独的配置文件放置在路径配置中 envs 选项指定的目录中,请参阅:codeception.com/docs/07-AdvancedUsage#Environments。你的情况是什么? 我们对每个开发者都有不同的开发环境,每次添加新的开发和环境时,我都不想更改配置文件 @Supra 你有没有遇到过一个好的解决方案?我有类似的情况,我们的构建管道会产生像my-application-4.26.phar
这样的工件,需要将其作为参数传递给 codecept。
@JoshJohnson 不幸的是还没有。尝试将它设置在 env 变量中的某个位置,但不确定它是否会起作用。值得一试。
@Supra 最终使用了带有自定义加载器的环境(就像你一样),我们可以通过 commandLocation: 'php my-application-1.*.phar'
【参考方案1】:
我遇到了同样的问题,并且确实扩展了 Codeception 以支持动态 Server-Url。
我还可以通过以下代码通过 php 调用我的 Codeceptions-Test:
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 选项进入编解码器(//参见其他一些选项)。
或
您可以扩展 Codecption cli 接口以实例化 Wrapper/Codecept 而不是原始 Codecept。
希望这对您有所帮助,并让您了解如何解决您的问题。
【讨论】:
【参考方案2】:在引导文件中,可以通过访问 static::$config 来访问并且更重要的是修改加载的配置。加载配置文件时,引导文件作为最后一步处理。
self::$config['modules']['config']['WebDriver']['url'] = $url;
其中 $url 已通过其他方式确定,例如环境变量,或者如果您准备自己解析命令行数据,它可能来自全局 argv。
【讨论】:
【参考方案3】:Codeception 文档说配置可以是merged。
codecept run --env alpha,beta
您可以根据需要创建具有动态域的自定义配置文件。 并用 --env 参数覆盖它。
例如beta.yml 文件是使用以下内容动态创建的:
modules:
config:
WebDriver:
url: http://dynamic-domain-1.mysite.com
【讨论】:
【参考方案4】:如果您想在 php 中设置 webdriver 的 url,可以将以下行添加到您的 tests/_bootstrap.php
文件中,并从您的 tests/acceptance.suite.yml
文件中删除 url 参数。
\Codeception\Configuration::append(['modules' => ['enabled' => [['WebDriver' => ['url' => 'http://YOUR-URL.COM']]]]]);
这里是一个例子,如何从 laravel .env
文件中设置 url。
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 中。
【讨论】:
以上是关于如何在 Codeception 命令行的验收测试中使用动态 url的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Codeception 验收测试中为 <input type="email"> 获取 WebGuy->fillField?