在Behat中分离测试套件

时间:2015-08-10 13:54:17

标签: php behat acceptance-testing

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

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

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

我不想要一个单片的FeatureContext.php文件。我的项目是如此巨大,以至于它将成为维持的噩梦,更不用说步骤之间潜在的附带损害了。如果有帮助,可以使用单个behat.yml文件。

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

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

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

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类缺少在Achievements中定义的步骤,并且AchievementsContext缺少在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是默认名称。

编辑:解决方案,感谢 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文件,这是我的主要要求,并且分隔的套件包含独立的功能文件。我是一个快乐的露营者!

1 个答案:

答案 0 :(得分:1)

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

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

# behat.yml

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

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