标签: behat

Behat&Mink:使用测试环境

我目前正在使用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)时,一切似乎都工作正常但是......任何想法?

(如果您认为需要其他文件,请告诉我).

php testing behat mink goutte

31
推荐指数
1
解决办法
3171
查看次数

PHPUnit&Behat; 补充还是替代?

我一直在寻找SO和谷歌,但我无法得到明确的答案.

PHPUnit是一个单元测试框架,就像JUnit一样.我使用它,也结合Selenium扩展进行功能测试.浏览时,我看到Behat/Mink不断被提及.但我不完全理解Behat在这里的适用方式.

使用Behat,您可以用人类可读的格式编写场景.然后,Behat可以将其转换为新项目的骨架类吗?但它是否也为单元测试提供了骨架类?你是使用Behat编写单元测试,还是使用PHPUnit/SimpleTest?

但是Behat/Mink确实取代了PHPUnit_Selenium-extension进行功能测试?

您是仅将Behat用于新项目,还是可以适应现有项目?

php bdd phpunit behat mink

30
推荐指数
3
解决办法
1万
查看次数

如何运行特定的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)

php behat

28
推荐指数
2
解决办法
1万
查看次数

在PHP中使用Cucumber

别误会我的意思.我认为这两个项目都很棒.

但随着这两个PHP和Ruby开发者,我不知道是否有任何有说服力的理由,除了可能语言不通,一个为什么会选择贝哈特黄瓜(与cuke4php)为BDD与PHP或一些PHP框架的工作也是如此.

php bdd behat

27
推荐指数
1
解决办法
6281
查看次数

Mink不适用于behat 3.0.12

我安装了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)

symfony behat mink

24
推荐指数
1
解决办法
5937
查看次数

模拟所有DateTime实例用于测试目的的时间

我希望能够在DateTimePHPUnit或Behat Test的持续时间内为每个实例化实例设置时间.

我正在测试与时间相关的业务逻辑.例如,类中的方法仅返回过去或将来的事件.

如果可能的话,我不想这样做:

  1. 写一个包装器DateTime并使用它代替DateTime整个代码.这将涉及重写我当前的代码库.

  2. 每次运行测试/套件时动态生成数据集.

所以问题是:是否有可能覆盖DateTimes行为以始终在请求时提供特定时间?

php testing datetime phpunit behat

20
推荐指数
2
解决办法
1万
查看次数

可以用Behat排除标签吗?

我知道只运行标记为选中的测试的方法@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

17
推荐指数
2
解决办法
4770
查看次数

Zend Framework与Behat BDD集成

有人一直在使用Behat和Zend Framework吗?关于如何使用两者的任何例子?

php tdd bdd zend-framework behat

16
推荐指数
1
解决办法
2764
查看次数

Behat对Symfony2用户进行身份验证

我在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)

symfony behat

12
推荐指数
1
解决办法
5912
查看次数

如何使用Symfony2和Doctrine回滚Behat 3功能测试中的提交?

作为标题,我的目标是回滚在Behat功能测试期间做出的任何提交.我检查这个答案非常相似,但它是从两年前开始,似乎不可能做到.

也许现在有了Behat 3,这是可能的.

我知道使用PHPUnit,我可以使用startUp和tearDown方法达到类似的效果.

我尝试使用@BeforeScenario和@AfterScenario注释来启动和回滚事务挂钩,但似乎behat和应用程序不共享实体管理器的相同实例.

一些建议吗?

谢谢.


UPDATE

谢谢大家的意见.这里有一些新的考虑:

  • 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();
  • SAVEPOINT:我认为这正是我所需要的,但我的数据仍然存在.我尝试在@BeforeScenario方法中添加保存点的创建,并在@AfterScenario方法上回滚
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和我的应用程序不共享实体管理器的相同实例.您是否能够在测试期间在测试和项目之间共享相同的实例?

bdd symfony doctrine-orm behat

12
推荐指数
2
解决办法
1227
查看次数

标签 统计

behat ×10

php ×6

bdd ×4

mink ×3

symfony ×3

phpunit ×2

testing ×2

datetime ×1

doctrine-orm ×1

goutte ×1

tdd ×1

zend-framework ×1