有没有办法控制 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

【讨论】:

好的,谢谢。这有点明显。我现在实际上对它们进行了数字排序(通过添加前缀001002 等)。但是对于复杂的目录结构,单元测试类位于命名空间(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 中的测试顺序?的主要内容,如果未能解决你的问题,请参考以下文章

codeception - 模拟 api 调用数据

如何使用 selenium 和 codeception 检测验收测试中的 dom 变化

使用 PHP Codeception 验收测试检查源代码中的单次出现

如何从codeception和phantomjs测试中获取当前url?

授权标头未通过 Codeception API 测试

Codeception 简单单元测试无法找到我的命名空间