【问题标题】:Is there a way to control tests order in Codeception?有没有办法控制 Codeception 中的测试顺序?
【发布时间】:2014-01-10 09:36:33
【问题描述】:

在用普通的PHPUnit 编写单元测试多年后,我才开始使用Codeception。困扰我的一件事是,我找不到控制测试调用顺序的方法。

在纯旧的PHPUnit 中,我像这样手动构建测试结构:

$suite = new PHPUnit_Framework_TestSuite();
$suite->addTest('MyFirstTest');
$suite->addTest('MySecondTest');

并且测试将按照它们添加到套件的顺序被调用。另一方面,Codeception 似乎正在遍历目录并运行它可以找到的每个测试。

我希望能够在两个级别上控制测试的顺序:

  1. 调用不同类型测试的顺序(即我想在acceptance tests之前运行unit tests
  2. 我想控制在特定测试类型中调用的测试顺序(以类似的方式 PHPUnit 构建套件)

广告。 2:假设我在acceptance目录中有两个测试:

AbcCept.php
WebGuy.php
XyzCept.php

我希望能够在AbcCept.php 之前运行XyzCept.php。这甚至可能吗?

并且预见到挑剔的 cmets:是的,我知道测试应该能够以任何顺序运行,并且不相互依赖,但这不是我要问的。

【问题讨论】:

    标签: php phpunit codeception


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多