Php 有没有办法控制Codeception中的测试顺序?

Php 有没有办法控制Codeception中的测试顺序?,php,phpunit,codeception,Php,Phpunit,Codeception,我在用纯PHPUnit编写单元测试多年后才开始使用。有一件事困扰着我,那就是我找不到控制调用测试顺序的方法 在纯旧的PHPUnit中,我手动构建测试结构,如下所示: $suite = new PHPUnit_Framework_TestSuite(); $suite->addTest('MyFirstTest'); $suite->addTest('MySecondTest'); 测试将按照它们添加到套件中的顺序调用Codeception似乎正在遍历目录并运行它能找到的每个测试 我

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

在纯旧的
PHPUnit
中,我手动构建测试结构,如下所示:

$suite = new PHPUnit_Framework_TestSuite();
$suite->addTest('MyFirstTest');
$suite->addTest('MySecondTest');
测试将按照它们添加到套件中的顺序调用<另一方面,code>Codeception似乎正在遍历目录并运行它能找到的每个测试

我希望能够在两个层面上控制测试顺序:

  • 调用不同类型测试的顺序(即,我希望在
    验收测试之前运行
    单元测试
  • 我想控制在特定测试类型中调用的测试的顺序(类似于
    PHPUnit
    builds套件)
  • 广告2:假设我在
    验收
    目录中有两个测试:

    AbcCept.php
    WebGuy.php
    XyzCept.php
    
    我希望能够在
    abaccept.php
    之前运行
    XyzCept.php
    。这可能吗


    为了预测挑剔的评论:是的,我知道测试应该能够以任何顺序运行,而不是相互依赖,但这不是我要问的。

    文件按名称排序(我假设我们讨论的是来自同一目录的文件)。换句话说,如果您需要在
    abaccept.php
    之前运行测试
    XyzCept.php
    ,您可以将
    XyzCept.php
    重新命名为
    AazCept.php

    ,您可以创建一个批处理脚本,以任意顺序运行测试,例如

    cd \path\to\test\dir
    codecept run unit
    codecept run acceptance
    


    请参阅上的“运行”命令。

    了解正在搜索适当解决方案并遇到此问题的人。
    我相信,您真正想要实现的是,在另一个测试之前运行一个特定的测试。秩序本身可能并不那么重要。为此,您可以将
    @dependency
    注释添加到测试中。
    完整文档可在此处找到:。 例如:


    要选择特定套件,或指定运行不同测试套件的顺序,可以使用以下语法(无空格):


    好的,谢谢。这是很明显的。实际上,我现在正在对它们进行数字排序(通过添加前缀
    001
    002
    等)。但是对于复杂的目录结构,单元测试类位于名称空间(PSR-0)中,如何处理呢?所有文件都按其全名排序,即路径+文件名。请注意,一些测试将调用自己的批处理文件。在这种情况下,进程可能不会返回批处理脚本,因此列表中的某些测试可能无法运行。如果出现这种情况,请使用“call”而不是“run”。这在Codeception验收测试中对我不起作用。这很奇怪,可能尝试运行上面的示例?这可能会告诉我们登录先运行,但我们无法知道@depends是否有任何影响。我的情况可能因为同时使用@example注释而变得复杂。我刚刚重新阅读了使用@depends注释的文档。我不相信它控制着方法的执行顺序。它所做的是防止依赖测试在其依赖的测试失败时运行。所以在上面的例子中,如果登录(0)测试失败,banUser()测试将永远不会执行。我同意当登录()测试失败时,它将阻止banUser()运行,但为了知道这个测试是否成功,应该执行它,对吗?否则就无法判断测试是否失败。关于suffle()config属性的文档告诉您,除了那些具有依赖关系的测试之外,测试将被洗牌。
    cd \path\to\test\dir
    codecept run unit
    codecept run acceptance XycCept.php
    codecept run acceptance AbcCept.php
    
    class ModeratorCest {
    
        public function login(AcceptanceTester $I)
        {
            // logs moderator in
        }
    
        /**
         * @depends login
         */
        public function banUser(AcceptanceTester $I)
        {
            // bans user
        }
    }
    
    codecept run unit,functional,acceptance