我目前正在使用Behat和Mink&Goutte Driver.当我试图在我的开发环境中使用它时,通过app_dev.php
文件,这是Symfony2标准版的典型app_dev.php
文件,我的测试工作正常(Gists).
但是,如果我想使用一个app_test
文件(与app_dev
文件相同,除了环境参数设置为"test"而不是"dev",并禁用调试模式),在注销场景中,似乎Goutte可以找不到"user_signup"标识符,并且在"登录"方案中,它找不到"根"文本节点.事实上,当我使用a时print last response
,似乎用户还没有登录:我仍然看到用户登录表单...
当我在我的开发环境(app_dev
)或prod环境(app
)时,一切似乎都工作正常但是......任何想法?
(如果您认为需要其他文件,请告诉我).
我一直在寻找SO和谷歌,但我无法得到明确的答案.
PHPUnit是一个单元测试框架,就像JUnit一样.我使用它,也结合Selenium扩展进行功能测试.浏览时,我看到Behat/Mink不断被提及.但我不完全理解Behat在这里的适用方式.
使用Behat,您可以用人类可读的格式编写场景.然后,Behat可以将其转换为新项目的骨架类吗?但它是否也为单元测试提供了骨架类?你是使用Behat编写单元测试,还是使用PHPUnit/SimpleTest?
但是Behat/Mink确实取代了PHPUnit_Selenium-extension进行功能测试?
您是仅将Behat用于新项目,还是可以适应现有项目?
我正在尝试从命令行运行特定的Behat场景,这就是我正在做的事情:
$ bin/behat features/features/baseline.feature:3
Run Code Online (Sandbox Code Playgroud)
然而,这并未取得这种情况.
如果我跑
bin/behat features/features/baseline.feature
Run Code Online (Sandbox Code Playgroud)
我可以运行整个功能文件.
这是文件的样子 - 我正在尝试运行的场景是在我的文本编辑器的第3行:
Feature:
@api
Scenario: Clear cache
Given the cache has been cleared
When I am on the homepage
Then I should get a "200" HTTP response
Scenario:
Given I am not logged in
When I am on the homepage
Then I should see the text "We love our users"
Run Code Online (Sandbox Code Playgroud) 我安装了Behat,Mink和其他一些相关的软件包.这是我的composer.json文件:
"require":{
//...
"behat/behat": "~3.0.6",
"behat/symfony2-extension": "dev-master",
"behat/mink": "dev-master",
"behat/mink-browserkit-driver": "dev-master",
"behat/mink-goutte-driver": "dev-master",
"behat/mink-selenium2-driver": "dev-master",
"phpunit/php-code-coverage": "dev-master",
"phpunit/phpunit-mock-objects": "dev-master",
"phpunit/phpunit": "dev-master"
}
Run Code Online (Sandbox Code Playgroud)
这是我的behat.yml文件:
default:
extensions:
Behat\Symfony2Extension:
mink_driver: true
kernel:
env: test
debug: true
Behat\MinkExtension\Extension:
base_url: 'http://localhost/app_test.php/'
#javascript_session: sahi
browser_name: chrome
sahi:
goutte: ~
selenium2: ~
paths:
features: features
bootstrap: %behat.paths.features%/Context
Run Code Online (Sandbox Code Playgroud)
现在当我运行behat时出现以下错误:
[Behat\Testwork\ServiceContainer\Exception\ExtensionInitializationException]
Behat\MinkExtension\Extension
无法找到扩展文件或类.
有谁知道如何解决这一问题?提前致谢.
解决了:
我只是忘了添加这一行:
"require": {
//...
"behat/mink-extension": "dev-master",
//... }
Run Code Online (Sandbox Code Playgroud)
并在你的behat.yml:评论这个:
# mink_driver: true
Run Code Online (Sandbox Code Playgroud)
并改变这个:
Behat\MinkExtension\Extension:
Run Code Online (Sandbox Code Playgroud)
对此:
Behat\MinkExtension:
Run Code Online (Sandbox Code Playgroud) 我希望能够在DateTime
PHPUnit或Behat Test的持续时间内为每个实例化实例设置时间.
我正在测试与时间相关的业务逻辑.例如,类中的方法仅返回过去或将来的事件.
如果可能的话,我不想这样做:
写一个包装器DateTime
并使用它代替DateTime
整个代码.这将涉及重写我当前的代码库.
每次运行测试/套件时动态生成数据集.
所以问题是:是否有可能覆盖DateTime
s行为以始终在请求时提供特定时间?
我知道只运行标记为选中的测试的方法@tag
:
@invite
Feature: As User I want to invite a friend to join on MySocial
@mytag
Scenario: Exists a Facebook user
Given I go to "/"
When I follow "Invite a friend"
...
Run Code Online (Sandbox Code Playgroud)
有可能完全相反吗?
有人一直在使用Behat和Zend Framework吗?关于如何使用两者的任何例子?
我在Symfony2/Doctrine2中使用Behat.现在,我有这个场景可以归结为"如果我已登录并进入/登录,我应该转到/取而代之":
@login
Scenario: Go to the login page while being logged in
Given I am logged in
When I go to "/login"
Then I should be on "/"
Run Code Online (Sandbox Code Playgroud)
对于@login,我创建了以下内容:
/**
* @BeforeScenario @login
*/
public function loginUser()
{
$doctrine = $this->getContainer()->get('doctrine');
$userRepository = $doctrine->getRepository('MyTestBundle:User');
$user = $userRepository->find(1); // 1 = id
$token = new UsernamePasswordToken($user, NULL, 'main', $user->getRoles());
$this->getContainer()->get('security.context')->setToken($token);
}
Run Code Online (Sandbox Code Playgroud)
在"当我进入/登录"代码(控制器被调用)时,令牌似乎消失了(不是我想要的):
/**
* @Route("/login", name="login")
*/
public function loginAction()
{
$token = $this->get('security.context')->getToken();
$fd = fopen('/tmp/debug.log', 'a');
fwrite($fd, $token);
// …
Run Code Online (Sandbox Code Playgroud) 作为标题,我的目标是回滚在Behat功能测试期间做出的任何提交.我检查这个答案非常相似,但它是从两年前开始,似乎不可能做到.
也许现在有了Behat 3,这是可能的.
我知道使用PHPUnit,我可以使用startUp和tearDown方法达到类似的效果.
我尝试使用@BeforeScenario和@AfterScenario注释来启动和回滚事务挂钩,但似乎behat和应用程序不共享实体管理器的相同实例.
一些建议吗?
谢谢.
谢谢大家的意见.这里有一些新的考虑:
LOAD FIXTURES:是的,它有效.我可以在测试开始之前运行灯具,但是问题(我的错误,不提它)是灯具有时需要几分钟才能加载,在测试开始前等待10分钟或更长时间是令人讨厌的.
BEGIN/ROLLBACK TRANSACTION:它既可以使用也可以使用.我没有收到任何错误,但测试期间写入的数据在结束时仍在我的数据库中.我在一个方法中添加了第一个标记为@BeforeScenario的方法,后者在一个用@AfterScenario标记的方法中
$this->kernel->getContainer() ->get('doctrine.orm.entity_manager') ->getConnection() ->beginTransaction(); $this->kernel->getContainer() ->get('doctrine.orm.entity_manager') ->getConnection() ->rollBack();
public function gatherContexts(BeforeScenarioScope $scope) { $environment = $scope->getEnvironment(); $connection = $this->kernel->getContainer()->get('doctrine.orm.entity_manager')->getConnection(); $connection->beginTransaction(); $connection->createSavepoint('tests'); } public function rollback(AfterScenarioScope $scope) { $connection = $this->kernel->getContainer()->get('doctrine.orm.entity_manager')->getConnection(); $connection->rollbackSavepoint('tests'); }
所有这些测试都用于测试我的API REST项目.经过这些考虑后,我认为Behat和我的应用程序不共享实体管理器的相同实例.您是否能够在测试期间在测试和项目之间共享相同的实例?