Я хочу исчерпывающе протестировать набор страниц с помощью 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 в параметр «»?
Или указать «путь» в командной строке или через среду?
Есть ли лучший способ подойти к этой проблеме?
редактировать: Я нашел эта почта, который в основном вытирает всю логику из файла .feature (Gherkin) в FeatureContext (PHP). Но это не похоже на способ заинтересовать заинтересованных сторон. Это действительно лучший / единственный подход?
Это будет в значительной степени копирование + вставка для вас. Я написал одно пользовательское определение шага 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
РЕЗУЛЬТАТ
FEATURECONTEXT
Все, что вам нужно, это использовать getPageAndContent()
запросить базу данных, чтобы вернуть то, что вы хотите. Пока я просто жестко запрограммировал несколько примеров в $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);
}
}
Других решений пока нет …