Php Codeception参与者与助手?
在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 */ } 因此,我可以将我的
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