2013-10-11 38 views
1

我正在使用PHPUnit和Selenium来测试我的Web应用程序。PHPUnit和Selenium - 从另一个类运行测试

目前我有2个测试类 - 用户测试权限测试

  • UserTest我有一个测试程序可以成功地创建一个新用户的方法。
  • 权限测试我打开和关闭某些权限并测试结果。

例如,我可能会关闭“创建用户”权限,然后测试“创建用户”按钮被禁用。但是,如果我再次打开“创建用户”权限,我想测试是否可以创建用户。

能够创建用户的所有逻辑已经在UserTest类中 - 那么是否有任何方式从PermissionsTest类的UserTest类运行测试?

此刻我想下面的代码:

public function testUserPermission(){ 
    $userTest = new UserTest(); 
    if($this->hasPermission = true){ 
    $userTest->testCanCreateUser(); 
    } 
} 

然而,当我运行这个测试,我得到的错误"There is currently no active session to execute the 'execute' command. You're probably trying to set some option in setup() with an incorrect setter name..."

谢谢!

回答

1

解决方案如下:

//instantiate and set up other test class 
$userTest = new UserTest(); 
$userTest->setUpSessionStrategy($this::$browsers[0]); 
$userTest->prepareSession(); 

//carry out a test from this class 
$userTest->testCanCreateUser(); 

这工作得很好。我不明白为什么在这种情况下使用来自另一个测试类的功能是一个糟糕的主意,因为如果我没有这样做,我不得不将这个功能重写到我的新类中,这看起来不那么'纯粹'。 。

+0

你怎么包括类?是由PHPUnit自动加载还是需要手动指令? – xiankai

+0

我使用自动加载来包含“UserTest”类。具体而言,我使用composer创建自动加载文件,并将此文件包含在PHPUnit“bootstrap”文件中。 – user1578653

+0

谢谢,你知道,如果类似的东西可以用于Selenium 1吗?我刚刚发现'setUpSessionStrategy'和'prepareSession'只是Webdriver特有的命令。 – xiankai

3

这听起来我像你缺少你与它的逻辑测试执行的分离 - 我说的不是PHP的问题,而是一般的测试model.It将允许你重新使用在不同的测试案例的测试组件。

你可以看一下关于页面对象的一些 材料PHP here或普通硒wiki

1

对于硒1(RC),

我作了如下的修改,而不是(以及应用所述页面对象的设计模式):

具体Test类

//instantiate and set up other test class 
$userTest = new UserTest($this->getSessionId()); 

//carry out a test from this class 
$userTest->createUser(); 

//asserts as normal 
$userTest->assertTextPresent(); 
... 

基本页对象类别

class PageObject extends PHPUnit_Extensions_SeleniumTestCase { 
    public function __construct($session_id) { 
     parent::__construct(); 
     $this->setSessionId($session_id); 
     $this->setBrowserUrl(BASE_URL); 
    } 
} 

特定页Object类

class UserTest extends PageObject { 

    public function createUser() { 
     // Page action 
    } 
}