在 Behat 中分离测试套件
Separating test suites in Behat
我正尝试像使用 Cucumber 一样使用 Behat 重现孤立的测试套件。我一直在尝试使用套件和路径以及移动文件和文件夹来调整 behat.yml 文件。 Behat 结果毫无意义,以至于我开始得出结论,它的设计根本就没有考虑到这一点。并且文档没有描述预期的文件和文件夹布局
对于我想要的每个测试套件:
- 特定的 xxx.feature 文件
- 一个特定的 xxxContext.php 文件,定义它自己的
xxxContext
class
我不想要单一的 FeatureContext.php 文件。我的项目是如此之大,以至于维护起来将成为一场噩梦,更不用说步骤之间潜在的附带损害了。如果有帮助,可以使用单个 behat.yml 文件。
我也看了这篇post,但还是没有解决问题。我如何使用 Behat 创建独立的测试套件?
注意:我使用的是 behat 3.0-dev
编辑:这是我可以实现的 "best"。我有两间套房,一间叫 "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 class 缺少成就中定义的步骤,而 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 文件中定义了两个单独的 classes。但我真的不想做一个单体class。事实上,我什至想要两个单独的 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,否则根本找不到 class。我不明白这一点,因为我的理解是 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 文件中执行步骤,这是我的主要要求,并使用分离的功能文件分离套件。我是快乐的露营者!
根据您当前组织套件的方式,每个套件的每个功能文件都将 运行。
使用 filters or paths 定义哪些功能文件应与给定套件匹配:
# behat.yml
default:
suites:
OAuth2:
contexts:
- OAuth2Context
paths: [ %paths.base%/features/oauth ]
Achievements:
contexts:
- AchievementsContext
paths: [ %paths.base%/features/achievements ]
每个套件只有一个功能文件可能不值得,因为您最终会得到很多套件而没有真正的好处。在稍大的套件中更好地分组功能,并在每个套件中注册多个上下文。
我正尝试像使用 Cucumber 一样使用 Behat 重现孤立的测试套件。我一直在尝试使用套件和路径以及移动文件和文件夹来调整 behat.yml 文件。 Behat 结果毫无意义,以至于我开始得出结论,它的设计根本就没有考虑到这一点。并且文档没有描述预期的文件和文件夹布局
对于我想要的每个测试套件:
- 特定的 xxx.feature 文件
- 一个特定的 xxxContext.php 文件,定义它自己的
xxxContext
class
我不想要单一的 FeatureContext.php 文件。我的项目是如此之大,以至于维护起来将成为一场噩梦,更不用说步骤之间潜在的附带损害了。如果有帮助,可以使用单个 behat.yml 文件。
我也看了这篇post,但还是没有解决问题。我如何使用 Behat 创建独立的测试套件?
注意:我使用的是 behat 3.0-dev
编辑:这是我可以实现的 "best"。我有两间套房,一间叫 "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 class 缺少成就中定义的步骤,而 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 文件中定义了两个单独的 classes。但我真的不想做一个单体class。事实上,我什至想要两个单独的 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,否则根本找不到 class。我不明白这一点,因为我的理解是 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 文件中执行步骤,这是我的主要要求,并使用分离的功能文件分离套件。我是快乐的露营者!
根据您当前组织套件的方式,每个套件的每个功能文件都将 运行。
使用 filters or paths 定义哪些功能文件应与给定套件匹配:
# behat.yml
default:
suites:
OAuth2:
contexts:
- OAuth2Context
paths: [ %paths.base%/features/oauth ]
Achievements:
contexts:
- AchievementsContext
paths: [ %paths.base%/features/achievements ]
每个套件只有一个功能文件可能不值得,因为您最终会得到很多套件而没有真正的好处。在稍大的套件中更好地分组功能,并在每个套件中注册多个上下文。