有没有办法控制 Codeception 中的测试顺序?
Posted
技术标签:
【中文标题】有没有办法控制 Codeception 中的测试顺序?【英文标题】:Is there a way to control tests order in Codeception? 【发布时间】:2014-01-10 09:36:33 【问题描述】:在用普通的phpUnit
编写单元测试多年后,我才开始使用Codeception。困扰我的一件事是,我找不到控制测试调用顺序的方法。
在纯旧的PHPUnit
中,我像这样手动构建测试结构:
$suite = new PHPUnit_Framework_TestSuite();
$suite->addTest('MyFirstTest');
$suite->addTest('MySecondTest');
并且测试将按照它们添加到套件的顺序被调用。另一方面,Codeception
似乎正在遍历目录并运行它可以找到的每个测试。
我希望能够在两个级别上控制测试的顺序:
-
调用不同类型测试的顺序(即我想在
acceptance tests
之前运行unit tests
)
我想控制在特定测试类型中调用的测试顺序(以类似的方式 PHPUnit
构建套件)
广告。 2:假设我在acceptance
目录中有两个测试:
AbcCept.php
WebGuy.php
XyzCept.php
我希望能够在AbcCept.php
之前运行XyzCept.php
。这甚至可能吗?
并且预见到挑剔的 cmets:是的,我知道测试应该能够以任何顺序运行,并且不相互依赖,但这不是我要问的。
【问题讨论】:
【参考方案1】:文件按名称排序(我假设我们正在谈论来自同一目录的文件)。换句话说,如果您需要在AbcCept.php
之前运行测试XyzCept.php
,您可以将XyzCept.php
重命名为AazCept.php
。
【讨论】:
好的,谢谢。这有点明显。我现在实际上对它们进行了数字排序(通过添加前缀001
、002
等)。但是对于复杂的目录结构,单元测试类位于命名空间(PSR-0)中呢?
所有文件按全名排序,即路径+文件名。【参考方案2】:
您可以创建一个批处理脚本,以您喜欢的任何顺序运行测试,例如,
cd \path\to\test\dir
codecept run unit
codecept run acceptance
或
cd \path\to\test\dir
codecept run unit
codecept run acceptance XycCept.php
codecept run acceptance AbcCept.php
请参阅this page 上的“运行”命令。
【讨论】:
请注意,有些测试会调用它们自己的批处理文件。在这种情况下,该过程可能不会返回到您的批处理脚本,因此列表中的某些测试可能不会运行。如果发生这种情况,请使用“调用”而不是“运行”。【参考方案3】:对于那些正在寻找适当解决方案并遇到此问题的人。
我相信,您真正想要实现的是在另一个测试之前运行一个特定的测试。订单本身可能并不那么重要。为此,您可以将 @dependency
注释添加到测试中。
完整的文档可以在这里找到:https://codeception.com/docs/07-AdvancedUsage#Dependencies。
示例:
class ModeratorCest
public function login(AcceptanceTester $I)
// logs moderator in
/**
* @depends login
*/
public function banUser(AcceptanceTester $I)
// bans user
【讨论】:
这在 Codeception 验收测试中对我不起作用。 奇怪了,可以试试上面的例子吗? 这可能告诉我们登录首先运行,但我们无法知道 @ 依赖是否有任何影响。我的情况可能会因为我同时使用@example 注释而变得复杂。 我刚刚重新阅读了有关使用 @depends 注释的文档。我不相信它控制方法的执行顺序。如果依赖的测试失败,它的作用是阻止依赖的测试运行。所以在上面的例子中,如果 login(0) 测试失败,banUser() 测试将永远不会执行。 我同意它会在 login() 测试失败时阻止 banUser() 运行,但是为了知道这个测试是否成功,它应该已经执行了,对吧?否则将无法判断测试是否失败。 suffle (codeception.com/docs/07-AdvancedUsage#Shuffle) 配置属性的文档告诉您,除了具有依赖关系的测试之外,测试将被打乱。【参考方案4】:要选择特定套件,或指定运行不同测试套件的顺序,您可以使用以下语法(无空格):
codecept run unit,functional,acceptance
【讨论】:
以上是关于有没有办法控制 Codeception 中的测试顺序?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 selenium 和 codeception 检测验收测试中的 dom 变化
使用 PHP Codeception 验收测试检查源代码中的单次出现