我有一个Symfony 4应用程序和Doctrine with Doctrine迁移.我正在介绍用于运行API测试的Codeception,并且需要在测试运行之前运行迁移.由于我使用的是Doctrine2模块,因此我不想包括DB模块,因为测试不需要它,并且需要在两个不同的位置配置测试数据库.
我目前正在使用Symfony模块,我注意到Laravel模块有一个run_database_migrations配置选项.
在测试之前处理在Symfony应用程序中运行Doctrine迁移命令的最佳方法是什么?(bin/console doctrine:migrations:migrate -n是具体的命令).
编辑我已经找到了一个解决方案,虽然它有效,但远非理想.通过使用Codeception Customization,我创建了以下扩展,基本上手动exec执行基础Symfony命令.
class DatabaseMigrationExtension extends Extension
{
public static $events = [
Events::SUITE_BEFORE => 'beforeSuite',
];
public function beforeSuite(SuiteEvent $e)
{
echo(exec('bin/console doctrine:database:drop --force') . PHP_EOL);
echo(exec('bin/console doctrine:database:create') . PHP_EOL);
echo(exec('bin/console doctrine:migrations:migrate -n') . PHP_EOL);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑2这个目标基本上是复制类似于Codeception DB模块的功能,它允许您提供它在测试中自动使用的数据库的SQL转储,而是使用Doctrine迁移来处理数据库.- https://codeception.com/docs/modules/Db#sql-data-dump
当我尝试运行单元测试时,出现此错误
PHP警告:PHP启动:无法加载动态库'bz2'(试过:\xampp\php\ext\bz2(找不到指定的模块。),\xampp\php\ext\php_bz2.dll(指定的模块无法找到。)) 在 Unknown on line 0 PHP Warning: PHP Startup: Unable to load dynamic library 'curl' (tried: \xampp\php\ext\curl (The specified module could not be found.), \xampp \php\ext\php_curl.dll (The specified module could not be found.)) in Unknown on line 0 PHP Warning: PHP Startup: Unable to load dynamic library 'fileinfo' (tried: \xampp\php\ext\fileinfo (找不到指定的模块。), \xampp\php\ext\php_fileinfo.dll (The specified module could not be found.)) in Unknown on line 0 PHP Warning: PHP Startup: Unable to load dynamic library 'gd2' (试过:\xampp\php\ext\gd2 (The specified module …
我正在使用Laravel 5和Codeception,我想在我的单元测试中使用内存中的SQLite数据库,但是,我似乎无法将我的环境设置为在Codeception中"测试".我正在使用Laravel5模块,并在我的unit.suite.yml文件中定义了以下内容:
class_name: UnitTester
modules:
enabled: [Asserts, UnitHelper, Laravel5]
config:
Laravel5:
environment_file: .env.testing
Run Code Online (Sandbox Code Playgroud)
我有一个.env文件,它定义了我的所有本地设置,然后是.env.testing文件,它定义了所有特定于测试的设置.但是,它似乎从未真正正确地设置环境.
为了测试我刚才做的环境:
$this->assertEquals('testing', \App::environment());
Run Code Online (Sandbox Code Playgroud)
我总是得到:
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'testing'
+'local'
Run Code Online (Sandbox Code Playgroud)
任何人都知道我做错了什么?
我正在使用selenium运行codeception 2.我可以看到selenium打开浏览器并运行测试.然后我从代码中得到错误断言失败.
我知道有一个保存的HTML文件,但是有很多JS,所以我无法真正分析它.我需要firefox窗口保持打开状态,这样我才能看到输出并找出问题所在.
我怎样才能做到这一点?我已经使用-browserSessionReuse运行selenium了
如果它有所不同,它发生在$ I-> haveFriend(); $ friend-> does()声明.
我目前正在使用以下工具进行验收测试:
我的问题是访问自签名(https)页面时我的测试失败
我尝试过的:
phantomjs --webdriver=5555 --ignore-ssl-errors=true --ssl-protocol=any
phantomjs.cli.args: ["--ignore-ssl-errors=true"]在我的acceptance.suit.yml中添加这个功能到目前为止,这些选项并没有给我任何运气.
这是我的acceptance.suit.yml档案
class_name: AcceptanceTester
modules:
enabled:
- WebDriver
config:
WebDriver:
url: https://myproject.com
browser: firefox
capabilities:
unexpectedAlertBehaviour: 'accept'
env:
phantom:
modules:
enabled:
- WebDriver
config:
WebDriver:
url: https://myproject.com
http_proxy: 192.1.1.1
http_proxy_port: 3000
browser: phantomjs
capabilities:
phantomjs.cli.args: ["--ignore-ssl-errors=true"]
Run Code Online (Sandbox Code Playgroud)
UPDATE
出现此错误 [ModuleException] WebDriver: Current url is blank, no page was opened
我不知道为什么这个错误发生了,因为我已经指出了一个页面.这是我的测试样本
public function tryToTestThis(AcceptanceTester $I)
{
$I->wantTo('Test this function');
$I->amOnPage('/mypage/');
$I->see('This text');
}
Run Code Online (Sandbox Code Playgroud)
Codeception中的答案更可取.谢谢
我在新的 Symfony 4 项目中使用 Codeception v2.4.1 和 PHPUnit 7.1.3。
\n\n我创建了一个功能测试,并尝试运行它,但收到错误:\n./vendor/bin/codecept run function
\n\nThere was 1 error:\n\n---------\n1) CustomerControllerCest: Customers on index\n Test tests/functional/Controller/Internal/CustomerControllerCest.php:customersOnIndex\n\n [Symfony\\Component\\DependencyInjection\\Exception\\EnvNotFoundException] \nEnvironment variable not found: "CORS_ALLOW_ORIGIN".\nRun Code Online (Sandbox Code Playgroud)\n\n我有一个配置了此环境的 phpunit.xml 文件:
\n\n <php>\n <ini name="error_reporting" value="-1" />\n <env name="KERNEL_CLASS" value="App\\Kernel" />\n <env name="APP_ENV" value="test" />\n <env name="APP_DEBUG" value="1" />\n <env name="APP_SECRET" value="191a5940854807ee081eaa57aff30562" />\n <env name="SHELL_VERBOSITY" value="-1" />\n <!-- define your env variables for the test env here -->\n <env name="CORS_ALLOW_ORIGIN" value="^https?://localhost:?[0-9]*$" />\n </php>\nRun Code Online (Sandbox Code Playgroud)\n\n我还尝试使用 .env.test,并包含相同的变量:
\n\n …我想我可能会把这个概念弄错或者没有正确地考虑某些事情.我正在寻找一种连接到db的方法,然后为表的每一行运行selenium测试(在phantomjs中).测试是检查定制CMS上的损坏图像,并可应用于任何CMS.
我基本上希望通过从db加载它们的ID然后为每个ID运行单独的测试来为每个页面(特定类型)运行验收测试.
这是我到目前为止:
$I = new WebGuy($scenario);
$results = $I->getArrayFromDB('talkthrough', '`key`', array());
foreach ($results as $r) {
$I->wantTo('Check helpfile '.$r['key'].'for broken images');
$I->amOnPage('/talkThrough.php?id='.$r['key']);
$I->seeAllImages();
}
Run Code Online (Sandbox Code Playgroud)
这在某种程度上起作用,因为它执行直到第一次失败(因为它运行为具有许多断言的1个测试).
如何将此运行作为单独测试?
我试图在我的Laravel应用程序中运行一些验收测试.虽然功能测试会触发测试环境,但验收测试却没有.它是验收测试的错误还是功能?困扰我的主要问题是,它不是使用(+ populating + cleanup)测试数据库,它只连接到dev数据库(当没有指定其他ENV时使用,例如测试,生产),这个当我多次运行它们时经常会失败.
这是我的配置:
codeception.yml
paths:
tests: app/tests
log: app/tests/_log
data: app/tests/_data
helpers: app/tests/_helpers
settings:
bootstrap: _bootstrap.php
suite_class: \PHPUnit_Framework_TestSuite
colors: true
memory_limit: 1024M
log: true
modules:
config:
Db:
dsn: 'mysql:host=localhost;dbname=testdb'
user: 'root'
password: 'root'
dump: 'app/tests/_data/dump.sql'
populate: true
cleanup: true
Run Code Online (Sandbox Code Playgroud)
acceptance.suite.yml
class_name: WebGuy
modules:
enabled:
- PhpBrowser
- WebHelper
- Db
config:
PhpBrowser:
url: 'http://localhost/'
Run Code Online (Sandbox Code Playgroud)
functional.suite.yml
class_name: TestGuy
modules:
enabled: [Filesystem, TestHelper, Laravel4, Db]
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
我正在尝试测试项目但由于此错误而无法检查登录页面:
[RuntimeException] Call to undefined method AcceptanceTester::loadSessionSnapshot
这是我的代码:
<?php
$I = new AcceptanceTester($scenario);
$I->wantTo('Login');
$I->amOnPage('/');
if($I->loadSessionSnapshot('loggedin')) exit();
$I->dontSee('NotFound');
//$I->dontSee('Error');
$csrf = $I->grabCookie('_token');
$I->submitForm('.form',array('login'=>array(
'username'=>'username',
'password'=>'*******'
)
));
$I->saveSessionSnapshot('loggedin');
$I->see('username');
Run Code Online (Sandbox Code Playgroud)
我的配置是这样的
# Codeception Test Suite Configuration
#
# Suite for acceptance tests.
# Perform tests in browser using the WebDriver or PhpBrowser.
# If you need both WebDriver and PHPBrowser tests - create a separate suite.
class_name: AcceptanceTester
modules:
enabled:
- PhpBrowser:
url: http://myweb.com
- \Helper\Acceptance
Run Code Online (Sandbox Code Playgroud)
我使用命令行命令生成了它
codecept.bat generate:cept acceptance loginTest
Run Code Online (Sandbox Code Playgroud) 我正在努力使代码接收与 PhpStorm 一起工作。
我已经设置了 CLI 解释器:
我还设置了 Codeception:
这是 Codeception 的配置:
当我从 PhpStorm 运行测试时,我收到以下信息:
在左边:
和右边的文字:
Testing started at 00:06 ...
/Applications/MAMP/bin/php/php7.2.1/bin/php /private/var/folders/3g/xng_tnzj6797frqqk20r69mw0000gn/T/ide-codeception.php run --report -o "reporters: report: PhpStorm_Codeception_ReportPrinter" --no-ansi --no-interaction unit
Process finished with exit code 255
Run Code Online (Sandbox Code Playgroud)
但是当我concept run在终端上的项目文件夹中运行时,它工作正常,我收到了这个:
我究竟做错了什么?我真的在这里阅读了 PhpStorm 的手册和 youtube视频,但我无法让它工作:/
谢谢!
在进一步的调查中,我发现了以下内容:
$ /usr/bin/env php --version
PHP 7.2.1 (cli) (built: Jan 15 2018 12:20:50) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend …Run Code Online (Sandbox Code Playgroud) codeception ×10
php ×4
selenium ×3
phantomjs ×2
symfony ×2
unit-testing ×2
doctrine-orm ×1
laravel ×1
laravel-4 ×1
laravel-5 ×1
phpstorm ×1
phpunit ×1
ssl ×1
symfony4 ×1
xampp ×1