如何从测试套件中运行单个测试?

95

我有下面这个测试类,我想只运行其中一个测试,例如 "aboutPage"。有什么好的想法吗?

这是我如何只运行该文件的方法:

codecept run tests/acceptance/VisitorCest.php

但是现在我只想运行文件中的一个测试。

<?php
use \AcceptanceTester;

class VisitorCest
{
    public function _before(){}
    public function _after(){}

    public function aboutPage(AcceptanceTester $I)
    {
        $I->wantTo('check about page');
    }

    public function contactPage(AcceptanceTester $I)
    { 
        $I->wantTo('check contact page');
    }
}
9个回答

160
您只需添加一个冒号和函数名称,如下所示:
codecept run tests/acceptance/VisitorCest.php:myTestName

或者更简短的版本:

codecept run acceptance VisitorCest:myTestName

(注意套件名称与文件名之间的空格。)

只是一个提示。如果一个测试是 单元 测试(继承自 PHPUnit_Framework_TestCase),你不能运行单个测试,因为 codeception 没有 过滤器 选项(不像 phpunit)。 - coviex
3
codecept run unit/TestThatExtendsPHPUnit.php:testMethod 对我来说运行良好。 - mike.pj
4
你可以省略.php文件扩展名,像这样:codecept run -- -c frontend unit models/ContactFormTest:testSendEmail - jlapoutre
1
myTestName 不必是完整的测试名称。它将运行任何部分匹配的测试。 - andrewtweber
1
我该如何运行包含依赖项的程序? - Diogo Alves

41

这是有效的方法:

codecept run {suite-name} {file-name}.php:{function-name}

注意 suite-name 和 file-name 之间有一个空格


从技术上讲,你有更一般的解决方案。但是经过证明,大多数人更喜欢看到实例。 - Igbanam
2
不需要.php部分。 - tivnet
2
@tivnet 这只适用于 Codeception 2.x 版本。 - conceptdeluxe

23

除了@Tzook Bar Noy提供的答案外,当有多个以相同名称开头的测试时,您可以添加尾随的$。请考虑以下示例:

<?php

use \AcceptanceTester;

class VisitorCest
{
    public function aboutPage(AcceptanceTester $I)
    {
    }

    public function aboutPageOption(AcceptanceTester $I)
    { 
    }
}

以下命令将执行这两个测试:

codecept run tests/acceptance/VisitorCest.php:aboutPage

这将只执行第一个:

codecept run tests/acceptance/VisitorCest.php:aboutPage$

14

更加合适的做法是为相关的测试用例分配一个组注释。这样做有以下优势: 例如,在同一类 VisitorCest 中有两个测试用例时,这种方法更可取。

public function aboutPage
public function aboutPage2

执行中

codecept run tests/acceptance/VisitorCest.php:aboutPage

将同时运行VisitorCest:aboutPage和VisitorCest:aboutPage2测试用例。

像这样为测试用例分配一个组

/**
 * @group aaa
 */
public function aboutPage(AcceptanceTester $I)
{
}

然后像这样执行特定的测试用例

codecept run -g aaa


5

除了前面的答案,您可以通过按给定名称分组运行一个或多个方法:

/**
 * @group test-aboutPage
 */
public function aboutPage(AcceptanceTester $I)
{
    $I->wantTo('check about page');
}

使用选项-g和组名:

$ codecept run acceptance VisitorCest -g test-aboutPage

我更喜欢稍微不同的方式,因为在这种情况下你可以使用制表符轻松导航到所需的Cest,codecept run tests/acceptance/VisitorCest -group test-aboutPage - Stipe

2

这是我所做的事情。 php codecept.phar run unit UnitNameTest.php


与所问问题无关。 - tivnet

2

如果你正在使用 PHP Yii2 Framework,那么你可以使用这个命令只运行一个测试。

确保你在测试目录中。

cd /codeception/frontend

codecept run -vv acceptance HomeCept

这与Yii2无关,而是因为Cept只包含一个测试,而Cest可以包含多个测试-请参见最初的问题。 - Oliver Hader

0
今天我学到了更一般化的回答。有一个隐藏的方法可以运行任意数量的 Codeception 测试。假设你想要运行 Cest1.php、Cest2.php 和 Cest3.php,而不运行其他测试。它们来自不同的套件、不同的组等。
下面是实现此目的的示例代码:
codecept run -o "groups: custom: [Cest1.php, Cest2.php, Cest3.php]" -g custom

诀窍在于您可以即时定义一个组,将所需的测试包含在其中,并立即在单个命令中执行新生组中的测试。

-3

尝试使用以下命令:phpunit --filter {TestMethodName} {FilePath}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接