2017-02-01 8 views
0

Мне поручено улучшить тестирование поведения в нашей существующей системе Drupal на основе распределения. Проблема в том, что я хочу запускать тесты поведения из разных каталогов, которые ссылаются друг на друга. Мы поддерживаем несколько сайтов D7 и основываем их на нашем внутреннем дистрибутиве, поэтому все сайты могут совместно использовать модули, которые создают такую ​​же функциональность. Примерами модулей распространения будут: dist_news и dist_events, и для того, чтобы тесты, основанные на распределении, могли жить в модуле dist_test. Эти модули будут создавать типы контента новостей и событий на разных сайтах, таких как dentist.oursite.org или radio.oursite.org, и каждый модуль имеет свое собственное репо в git. Конкретные сайты размещаются в репо, называемом dentist_builder или radio_builder, оба из которых основаны на dist_builder, который живет в своем собственном репо и строит себя из отдельных репозиториев модулей через композитор, ворчание, пряжу и т. Д. Тесты для конкретного сайта живут в модуле называемый dentist_test, который живет в стоматологическом застройщике. Проблема возникает, когда я хочу протестировать функциональность, которая находится на одном сайте, но не другая. Например. На сайте стоматолога есть новости и события, на радио-сайте есть новости, но не события, а в новостях о стоматологе есть раздел «В новостях», а радио-сайт - нет. Различные тесты на новости и события живут в dist_test, так что если я хочу, чтобы проверить их, я могу запустить что-то вроде:Behat Drupal: доступ к функциям вне% paths.base%

vendor/bin/behat -c build/html/profiles/dist/modules/dist/dist_test/tests/behat.yml build/html/profiles/dist/modules/dist/dist_test/tests/features/news/news.feature 
vendor/bin/behat -c build/html/profiles/dist/modules/dist/dist_test/tests/behat.yml build/html/profiles/dist/modules/dist/dist_test/tests/features/events/events.feature 

и для радио, я мог бы работать:

vendor/bin/behat -c build/html/profiles/dist/modules/dist/dist_test/tests/behat.yml build/html/profiles/dist/modules/dist/dist_test/tests/features/news/news.feature 

но сценарий тестирования В новостях часть новостей не сработает, потому что ее нет на Радио.

Так что я пытаюсь создать испытывает испытания проходят через behat.yml в dentist_test или behat.yml в radio_test так что я могу проверить только материал, который я хочу, чтобы проверить на сайте:

vendor/bin/behat -c build/html/src/modules/dentist_test/tests/behat.yml --suite=news 

vendor/bin/behat -c build/html/src/modules/radio_test/tests/behat.yml --suite=news 

где соответствующие апартаменты будут запускать ВСЕ тесты, через тег-фильтр или путь, для сайта-стоматолога и ТОЛЬКО те тесты, которые нам нужны для радио-сайта.

Dentist_builder, в том числе тесты, которые работают до сих пор, имеет соответствующую структуру каталогов:

vendor/ 
    bin/ 
     behat 
build/ 
    html/ 
     profiles/ 
      dist/ 
       modules/ 
        dist/ 
         dist_test/ 
          tests/ 
           behat.yml 
           contexts/ 
            /FeatureContext.php 
           features/ 
            /news 
             /news.feature 
     src/ 
      modules/ 
       dentist_test/ 
        tests/ 
         behat.yml 
         features/ 
          /homepage.feature 

behat.yml в dentist_test настроен так:

default: 
    suites: 
     default: 
      contexts: 

       - Dist\Context\FeatureContext: 
       - screenshotDirectory: '%paths.base%/screenshots' 
       - Drupal\DrupalExtension\Context\DrupalContext 
       - Drupal\DrupalExtension\Context\MinkContext 
       - Drupal\DrupalExtension\Context\MessageContext 
       - Drupal\DrupalExtension\Context\DrushContext 

Я попытался установить еще один набор для использования функций в dist_test, но он не работает:

news: 
      contexts: 
      - Dist\Context\FeatureContext: 
       - screenshotDirectory: '%paths.base%/screenshots' 
      - Drupal\DrupalExtension\Context\DrupalContext 
      - Drupal\DrupalExtension\Context\MinkContext 
      - Drupal\DrupalExtension\Context\MessageContext 
      - Drupal\DrupalExtension\Context\DrushContext 
      filters: 
      tags: "@news" 
      paths: 
      - %paths.base%/../../../../../../profiles/dist/modules/dist/dist_test/tests/features/news 

dist_test/тесты/контексты/FeatureContext.php выглядит следующим образом:

<?php 
/** 
* @file 
* Default context class defining how behat should test our application. 
* 
* @see http://docs.behat.org/en/latest/guides/4.contexts.html 
*/ 

namespace Dist\Context; 
use Drupal\DrupalExtension\Context\RawDrupalContext; 
use Behat\Behat\Context\SnippetAcceptingContext; 
use Behat\Behat\Hook\Scope\BeforeScenarioScope; 
use Behat\Behat\Hook\Scope\AfterScenarioScope; 
use Behat\Behat\Hook\Scope\AfterStepScope; 
use Behat\Behat\Tester\Exception\PendingException; 
use Behat\Gherkin\Node\PyStringNode; 
use Behat\Gherkin\Node\TableNode; 
use Behat\Mink\Exception\ExpectationException; 
use Behat\Mink\Exception\ElementNotFoundException; 
use Symfony\Component\DependencyInjection\Container; 

/** 
* Defines application features from the specific context. 
*/ 
class FeatureContext extends RawDrupalContext implements SnippetAcceptingContext { 

    /** 
    * Initializes context. 
    * 
    * Every scenario gets its own context instance. 
    */ 
    public function __construct($parameters = array()) { 
    foreach ($parameters as $key => $value) { 
     $property = lcfirst(Container::camelize($key)); 
     $this->$property = $value; 
    } 
    } 

    /** 
    * Custom step to assert that username of user with uid is not listed. 
    * 
    * @Then I should not see user :uid 
    */ 
    public function iShouldNotSeeUser($uid) { 
    $user = \user_load($uid); 
    $this->assertSession()->pageTextNotContains($user->name); 
    } 

    ... (a bunch more functions) 
} 

После того, как я выяснить, как получить доступ news.feature в dist_tests из behat.yml в dentist_test я могу исправить все остальное с дорожками и теги, я думаю, , Мне просто нужно сейчас, как добраться до этих функций. То, что я хочу избежать, - это реплицировать и поддерживать те же тесты, основанные на распределении, как в dentist_test, так и в radio_test, потому что как только мы попадаем на сотни сайтов, которые станут смешными. Я предполагаю, что

paths: 
     - %paths.base%/../../../../../../profiles/dist/modules/dist/dist_test/tests/features/news 

где я неправильно, или может behat даже делать то, что я хочу, чтобы это сделать? Первый раз погрузиться в поведение, поэтому дайте мне знать, если я пропущу что-то простую архитектуру.

ответ

0

Оказывается, это был путь, только я взял все, чтобы понять это. Изменено:

paths: 
    - %paths.base%/../../../../../../profiles/dist/modules/dist/dist_test/tests/features/news 

к:

paths: 
    - %paths.base%/../../../../profiles/dist/modules/dist/dist_test/tests/features/news 

вещь, которую я пропустил, что dental_test живет в SRC/модулей/dentist_test но слинкован для создания/HTML/сайты/все/модули/пользовательские/dental_test во время сборки сайта. Мне нужно было положить путь от прежнего, а не к последнему. Теперь он отлично работает! Но если у кого-то есть лучший способ сделать это, пожалуйста, дайте мне знать.

Смежные вопросы