Php Codeception参与者与助手?

Php Codeception参与者与助手?,php,testing,codeception,Php,Testing,Codeception,在Codeception中,文档建议我向Helper\Acceptance类添加操作,然后将这些操作包含在AcceptanceTester类中。AcceptanceTester类也说明: class AcceptanceTester extends \Codeception\Actor { use _generated\AcceptanceTesterActions; /** * Define custom actions here */ } 因此,我可以将我的

在Codeception中,文档建议我向
Helper\Acceptance
类添加操作,然后将这些操作包含在
AcceptanceTester
类中。
AcceptanceTester
类也说明:

class AcceptanceTester extends \Codeception\Actor
{
    use _generated\AcceptanceTesterActions;

   /**
    * Define custom actions here
    */
}
因此,我可以将我的操作添加到
AcceptanceTester
,这对于开发人员和他的IDE来说都比自动生成的特性更简单


有什么区别吗?为什么文档中建议使用不那么直接的方法?

我刚刚查看了文档。所以
Helper\Acceptance
类充当
codeception
模块。由于它是一个模块,因此可以在另一个模块中加载/调用为此类定义的一些
公共方法。参见示例。这就是与
AcceptanceTester
类的区别,只能通过
$I
实例访问
方法。老实说,永远不要尝试所有更深层次的实现。但这是一个很好的讨论话题。

以下是我对此的看法。文档有点挑剔,所以我不得不从多个页面(参考资料包括在下面)把它放在一起

演员 所有操作和断言都由Actor对象执行

定义测试时,实际上使用了Actor:

公共函数loginAsRegularUser(\AcceptanceTester$I)

$I=新的验收测试仪($scenario);
参与者本身充当模块(助手)的代理:

FunctionalTester类的方法在模块中定义。实际上,它不包含它们中的任何一个,而是充当代理。它知道哪个模块执行此操作并将参数传递给它

要利用IDE自动完成功能,您可能需要手动生成方法:

要使IDE看到所有FunctionalTester方法,应运行
codecept build
命令。它从启用的模块生成方法签名,并将它们保存到包含在actor中的trait中

请记住,每个套件只能有一个参与者()

助手 模块包含实际操作和断言:

类中的Tester对象可以执行的所有操作和断言都在模块中定义

您可以通过将自己的操作和断言写入名为Helper的自定义模块,来扩展测试套件

结论 如果您进一步检查
\Codeception\Module
\Codeception\Actor
,您会发现两者的用途截然不同。模块(或助手)旨在提供操作和断言

另一方面,actor是模块和测试代码之间的代理。Actor可以访问
$scenario
,您可以从中获取元信息,如测试描述或其名称

模块能够与其他模块()交互,并且它们具有生命周期挂钩()

奖金-StepObjects 如果您需要一组测试的一些通用功能,StepObjects非常好。()

StepObject在扩展给定套件的参与者时从参与者扩展而来。现在,StepObjects被指定给特定套件而不是泛型类的原因可能更有意义了:

php供应商/bin/codecept生成:stepobject接受管理

何时使用StepObjects?当您想要将与参与者相关的操作分组时,例如将多个断言或多个操作分组在一起

奖励-页面对象 PageObject模式将web页面表示为一个类,该页面上的DOM元素表示为其属性,一些基本交互表示为其方法。()

Selenium文档包含更多详细信息-

如果您熟悉MVC,PageObject看起来像一个测试页面的模型,即它包含实际的css和xpath查询,这样它们就不会污染实际的测试。有关实际示例,请参阅Codeception手册

奖金结论 那么什么时候使用StepObjects而不是PageObjects呢?以下是Codeception的建议:

将常见的[actor]操作组合在一起,并将它们移动到actor类或StepObjects中。()

将CSS和XPath定位器移动到页面对象中。()

为了解释这一点,css和xpath查询应该移动到PageObjects,而常见操作和断言应该移动到StepObject