如何在 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?

使用 PHP Codeception 验收测试检查源代码中的单次出现

Codeception 验收测试因底部导航而失败

Codeception 验收测试在浏览器启动之前运行

Codeception:生成验收测试在并行虚拟机上引发异常

Codeception - 验收测试有效,但功能测试无效