2015-12-01 67 views
1

我想用behat詳盡地測試一組頁面。有沒有辦法以編程方式爲behat功能提供變量?

例如,此方案概述:

Scenario Outline: 
    Given I am at <path> 
    When I click some button 
    Then I should see <hidden-stuff> 
    | path | hidden-stuff | 
    | path1 | element1  | 
    | path1 | element2  | 
    | path1 | element3  | 
    | path2 | element1  | 
    | path2 | element2  | 
    | path2 | element3  | 
    | path3 | element1  | 
    | path3 | element2  | 
    | path3 | element3  | 
    ... 

在我的特定情況下,我有超過10例和50路,所以你可以看到這是如何變得非常笨重。我試圖避免500行不可維護的功能,每次添加新路徑或更多元素時都需要對其進行編輯。

我可以將mysql查詢的結果提供給「」參數嗎?

或者在命令行或通過環境提供「路徑」?

有沒有更好的方法來解決這個問題?

編輯:我確實發現this post,它基本上把.feature文件(Gherkin)和FeatureContext(PHP)中的所有邏輯都奪走了。但是,這看起來不像利益相關方友好的做法。這真的是最好的/唯一的方法嗎?

回答

2

這將是一個複製+粘貼工作給你。我爲你寫了一個自定義步驟定義Given the page contents are correct。我還添加了一個Scenario Outline作爲典型示例,因此它們都是相同的,但您感興趣的是自定義步驟定義。

GHERKHIN

Feature: Just testing 

    Scenario Outline: Multiple generic visits 
    Given I am on "<page>" 
    Then I should see "<content>" 
    Examples: 
    | page    | content | 
    |/    | HOME PAGE | 
    | /login   | Username | 
    | /profile/step_one | Name  | 

    Scenario: Multiple dynamic visits 
    Given the page contents are correct 

結果

enter image description here

FEATURECONTEXT

所有你需要的是用getPageAndContent()查詢d atabase返回你想要的。現在我只是在$pageAndContent中對幾個例子進行了硬編碼。

namespace Application\FrontendBundle\Features\Context; 

use Behat\MinkExtension\Context\MinkContext; 
use Behat\Symfony2Extension\Context\KernelAwareContext; 
use Doctrine\ORM\EntityManager; 
use Doctrine\ORM\EntityRepository; 
use Symfony\Component\HttpKernel\KernelInterface; 
use Exception; 
use LogicException; 

class FeatureContext extends MinkContext implements KernelAwareContext 
{ 
    /* @var KernelInterface */ 
    private $kernel; 

    public function setKernel(KernelInterface $kernelInterface) 
    { 
     $this->kernel = $kernelInterface; 
    } 

    /** 
    * @Given /^the page contents are correct$/ 
    */ 
    public function thePageContentsAreCorrect() 
    { 
     $pageAndContent = $this->getPageAndContent(); 

     foreach ($pageAndContent as $page => $content) { 
      try { 
       $this->visitPath($page); 
      } catch (Exception $e) { 
       throw new LogicException(sprintf('The page "%s" does not exist.', $page)); 
      } 

      try { 
       $this->assertSession()->pageTextContains($this->fixStepArgument($content)); 
      } catch (Exception $e) { 
       throw new LogicException(sprintf('The page "%s" does not contain "%s".', $page, $content)); 
      } 
     } 
    } 

    /** 
    * @return array 
    */ 
    private function getPageAndContent() 
    { 
     /* 
     $em = $this->getEntityManager(); 
     $repo = $this->getRepository($em, 'ApplicationFrontendBundle:Pages'); 

     $pageAndContent = []; 
     $pages = $repo->findAll(); 
     foreach ($pages as $page) { 
      // Build you array here 
      $pageAndContent[$page->getUrl] = $page->getContent(); 
     } 

     return $pageAndContent; 
     */ 

     return [ 
      '/' => 'HOME PAGE', 
      '/login' > 'Username', 
      '/profile/step_one' => 'Name' 
     ]; 
    } 

    /** 
    * @return EntityManager 
    */ 
    private function getEntityManager() 
    { 
     return $this->kernel->getContainer()->get('doctrine')->getManager(); 
    } 

    /** 
    * @param EntityManager $entityManager 
    * @param string  $serviceName 
    * 
    * @return EntityRepository 
    */ 
    private function getRepository(EntityManager $entityManager, $serviceName) 
    { 
     return $entityManager->getRepository($serviceName); 
    } 
} 
+0

好像你在暗示,正如我擔心的那樣,純粹在小黃瓜功能中沒有辦法做到這一點。例如以利益相關方友好的方式。 – aaronbauman

+0

小黃瓜的步驟是有限的,所以在邊緣情況下,我們將不得不編寫我們自己的步驟定義,您的案例就是其中之一。如果我向您展示了我的一個Context文件,您可能會哭泣! – BentCoder

相關問題