Codeception Actor Actor vs Helper?

时间:2017-11-08 19:50:03

标签: php testing codeception

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

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

   /**
    * Define custom actions here
    */
}

所以我可以将我的动作添加到AcceptanceTester,这对于开发人员和他的IDE来说比自动生成的特征更直接。

有没有什么区别以及为什么文档建议不那么简单?

2 个答案:

答案 0 :(得分:1)

我刚查过文档。所以Helper\Acceptance类充当codeception模块。因为它是一个模块,所以可以在另一个模块中加载/调用为该类定义一些public method。请参见示例here。这与AcceptanceTester类不同,methods只能通过$I实例访问。老实说,从不尝试更深入的所有实施。但这是一个非常好的话题要讨论。

答案 1 :(得分:0)

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

演员

<块引用>

所有动作和断言都由 Actor 对象 source

执行

Actor 在您定义测试时实际使用:

public function loginAsRegularUser(\AcceptanceTester $I)

$I = new AcceptanceTester($scenario);

Actor 本身充当模块(帮助程序)的代理:

<块引用>

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

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

<块引用>

要让您的 IDE 看到所有 FunctionalTester 方法,您应该运行 codecept build 命令。它从启用的模块生成方法签名,并将它们保存到一个包含在 actor 中的特征中。 source

请记住,每个套件只能有 1 个演员 (reference)。

帮手

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

<块引用>

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

<块引用>

您可以使用您自己的操作和断言扩展测试套件,方法是将它们写入一个名为 Helper 的自定义模块中。 source

结论

如果您进一步检查 \Codeception\Module\Codeception\Actor,您会发现它们用于非常不同的目的。模块(或帮助程序)旨在提供操作和断言。

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

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

奖励 - StepObjects

<块引用>

如果您需要为一组测试提供一些通用功能,StepObjects 非常有用。 (source)

StepObjects 是从 actors 扩展而来的,因为它们扩展了给定套件的 actor。现在,为什么将 StepObjects 分配给特定套件而不是通用类可能更有意义:

<块引用>

php vendor/bin/codecept generate:stepobject acceptance Admin

何时使用 StepObjects?当您想对演员相关的动作进行分组时,例如将多个断言或多个动作组合在一起。

奖励 - 页面对象

<块引用>

PageObject 模式将网页表示为一个类,将该页面上的 DOM 元素表示为它的属性,并将一些基本的交互表示为它的方法。 (source)

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

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

奖励结论

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

<块引用>

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

<块引用>

将 CSS 和 XPath 定位器移动到 PageObjects 中。 (source)

换句话说,您的 css 和 xpath 查询应移至 PageObjects,而常见操作和断言应移至 StepObject。