在 Behat 中分离测试套件

Posted

技术标签:

【中文标题】在 Behat 中分离测试套件【英文标题】:Separating test suites in Behat 【发布时间】:2015-08-10 13:54:16 【问题描述】:

我正在尝试使用 Behat 重现孤立的测试套件,就像使用 Cucumber 一样。我一直在尝试使用套件和路径以及移动文件和文件夹来调整 behat.yml 文件。 Behat 结果毫无意义,以至于我开始得出结论,它根本没有考虑到这一点。并且文档没有描述预期的文件和文件夹布局

对于我想要的每个测试套件:

特定的 xxx.feature 文件 一个特定的 xxxContext.php 文件,定义一个自己的 xxxContext

我不想要一个单一的 FeatureContext.php 文件。我的项目非常庞大,以至于维护起来将成为一场噩梦,更不用说步骤之间潜在的附带损害了。如果有帮助,可以有一个单独的 behat.yml 文件。

我也读过这个post,但我仍然没有解决问题。如何使用 Behat 创建独立的测试套件?

注意:我使用的是 behat 3.0-dev


编辑:这是我能达到的“最好”。我有两个套件,一个叫做“OAuth2”,另一个叫做“Achievements”。

beyat.yml:

default:
    suites:
        OAuth2:
            contexts:
                - OAuth2Context
        Achievements:
            contexts:
                - AchievementsContext

文件层次结构:

├── behat.yml
└── features
    ├── Achievements.feature
    ├── OAuth2.feature
    └── bootstrap
        └── OAuth2Context.php  <-- Contains the OAuth2Context and AchievementsContext classes. Also, classes are found only if I name this file this way, I don't know why.

我的主要问题是,当我运行 behat 时,它抱怨缺少步骤。基本上,OAuth2Context 类缺少在成就中定义的步骤,而成就上下文缺少在 OAuth2 中定义的步骤。这个输出完全让我困惑:

--- OAuth2Context has missing steps. Define them with these snippets:

    /**
     * @When I say yes
     */
    public function iSayYes()
    
        throw new PendingException();
    

    /**
     * @Then you say no
     */
    public function youSayNo()
    
        throw new PendingException();
    

--- AchievementsContext has missing steps. Define them with these snippets:

    /**
     * @When I ask for an Access Token with my credentials
     */
    public function iAskForAnAccessTokenWithMyCredentials2()
    
        throw new PendingException();
    

    /**
     * @Then I receive an Access Token
     */
    public function iReceiveAnAccessToken2()
    
        throw new PendingException();
    

    /**
     * @When I ask for an Access Token with a Partner User grant type where:
     */
    public function iAskForAnAccessTokenWithAPartnerUserGrantTypeWhere(TableNode $table)
    
        throw new PendingException();
    

我相信这是因为我在 php 文件中定义了两个单独的类。但我真的不想做一个单一的单片课。事实上,我什至想要两个单独的 PHP 文件。类是这样定义的:

class OAuth2Context implements Context, SnippetAcceptingContext

...
    /**
     * @When I ask for an Access Token with my credentials
     */
    public function iAskForAnAccessTokenWithMyCredentials()
    
    ...
    
...


class AchievementsContext implements Context, SnippetAcceptingContext

...
    /**
     * @When I say yes
     */
    public function iSayYes()
    
    ...
    
...

其他(较小的)问题是我必须将我的 php 文件命名为 OAuth2Context.php 而不是 FeatureContext.php,否则根本找不到这些类。我不明白这一点,因为我理解 FeatureContext.php 是 behat 的默认名称。


编辑:解决方案,感谢 Jakub Zalas

这是有效的文件布局:

├── behat.yml
└── features
    ├── achievements
    │   └── Achievements.feature
    ├── bootstrap
    │   ├── AchievementsContext.php  <-- AchievementsContext class
    │   └── OAuth2Context.php        <-- OAuth2Context class
    └── oauth
        └── OAuth2.feature

使用以下 beyat.yml 文件:

default:
    suites:
        OAuth2:
            contexts:
                - OAuth2Context
            paths:    [ %paths.base%/features/oauth ]
        Achievements:
            contexts:
                - AchievementsContext
            paths:    [ %paths.base%/features/achievements ]

通过这种方式,我可以在分离的 PHP 文件中执行步骤,这是我的主要要求,以及具有分离功能文件的分离套件。我是一个快乐的露营者!

【问题讨论】:

您想要做的事情在 Behat 中非常简单。到目前为止,您尝试过什么? 感谢您的回复!我编辑了我的原始帖子并添加了尽可能多的细节。 【参考方案1】:

按照您当前组织套件的方式,将为每个套件运行每个功能文件。

使用filters 或paths 定义哪些功能文件应与给定套件匹配:

# behat.yml

default:
    suites:
        OAuth2:
            contexts:
                - OAuth2Context
            paths:    [ %paths.base%/features/oauth ]
        Achievements:
            contexts:
                - AchievementsContext
            paths:    [ %paths.base%/features/achievements ]

每个套件只有一个功能文件可能不值得,因为您最终会得到很多套件而没有真正的好处。在稍大的套件中更好地分组功能,并为每个套件注册多个上下文。

【讨论】:

我尝试了您的建议,更改文件布局后效果很好。我编辑了我的原始帖子来描述解决方案。谢谢!

以上是关于在 Behat 中分离测试套件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用注释在 testng + maven 中分离单元测试和集成测试?

在 Spring Boot 应用程序中分离集成测试

BEHAT - 无法在浏览器中执行测试

如何使用 Behat 测试在多总线场景中调度 Symfony Messenger 事件?

php Behat测试checkout css属性

如何有效地测试使用 Behat/Mink 访问大文件?