在Codeception中,文档建议我向Helper\Acceptance
类添加操作,然后将其包含在AcceptanceTester
类中。 AcceptanceTester
课程也说明了这一点:
class AcceptanceTester extends \Codeception\Actor
{
use _generated\AcceptanceTesterActions;
/**
* Define custom actions here
*/
}
所以我可以将我的动作添加到AcceptanceTester
,这对于开发人员和他的IDE来说比自动生成的特征更直接。
有没有什么区别以及为什么文档建议不那么简单?
答案 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 非常有用。 (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。