Мне поручено улучшить тестирование поведения в нашей существующей системе 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 даже делать то, что я хочу, чтобы это сделать? Первый раз погрузиться в поведение, поэтому дайте мне знать, если я пропущу что-то простую архитектуру.