Behat是一个强大的PHP行为驱动开发(BDD)框架,它使用Gherkin语言进行测试用例的编写。该框架提供了一种简洁、灵活且易于理解的方式来编写和执行测试,使得开发者能够更好地理解系统的行为和预期结果。Behat支持多种浏览器和环境,可以轻松地与现有的PHP应用程序集成。通过使用Behat,开发者可以确保他们的代码质量和稳定性,从而提高项目的可靠性和可维护性。
Behat是一个开源的、基于PHP的行为驱动开发(BDD)框架,它允许开发人员使用自然语言编写测试,从而提高代码质量和可维护性,本文将详细介绍Behat的基本概念、安装和配置、核心组件以及如何使用Behat进行Web应用程序的测试。
1、Behat简介
行为驱动开发(BDD)是一种软件开发方法,它关注于描述软件应如何与用户进行交互,而不是描述软件应该如何实现,Behat是这种方法的一个实现,它使用Gherkin语言编写测试,Gherkin语言是一种简单易读的语言,用于描述软件功能的行为。
2、安装和配置
要开始使用Behat,首先需要安装PHP和Composer,通过Composer安装Behat及其依赖:
composer require behat/behat composer require behat/mink-extension composer require behat/mink-goutte-driver composer require behat/mink-selenium2-driver
创建一个behat.yml
配置文件,用于定义测试套件、环境和其他设置:
default: extensions: Behat\MinkExtension\Extension: base_url: http://localhost goutte: ~ selenium2: ~ paths: features: %paths%/features bootstrap: %paths%/features/bootstrap contexts: default: class: FeatureContext
3、核心组件
Behat由以下几个核心组件组成:
Gherkin语言:用于编写测试用例的自然语言。
Behat命令行工具:用于运行测试、生成报告等。
Mink浏览器驱动:用于与Web浏览器进行交互。
Symfony控制台输出组件:用于在控制台中显示测试结果。
4、编写测试用例
使用Behat编写测试用例非常简单,创建一个名为features
的目录,然后在该目录下创建一个名为example.feature
的文件:
Feature: 示例功能 As a 网站用户 I want to 登录到我的帐户 So that I can 查看我的个人信息 Scenario: 成功登录 Given I am on the login page When I fill in the following: | field | value | |-------|-------| | username | myusername | | password | mypassword | And I press "Login" Then I should see "Welcome, myusername!"
创建一个名为FeatureContext
的类,用于定义测试用例中所需的上下文:
<?php use Behat\Gherkin\Node\PyStringNode; use Behat\Gherkin\Node\TableNode; class FeatureContext extends MinkContext { private $page; public function __construct(array $parameters) { parent::__construct($parameters); $this->page = $this->getSession()->getPage(); } /** * @Given I am on the :arg1 page */ public function iAmOnThePage($arg1) { $this->visit($arg1); } /** * @When I fill in the following: */ public function iFillInTheFollowing(TableNode $table) { $fields = $table->getHash(); foreach ($fields as $field => $value) { $this->fillField($field, $value); } } /** * @When I press :buttonText */ public function iPressButton($buttonText) { $this->clickLink($buttonText); } /** * @Then I should see :message */ public function iShouldSeeMessage($message) { $this->assertSession()->assertContains($message); } }
在bootstrap
目录下创建一个名为FeatureContext.php
的文件,用于加载FeatureContext
类:
<?php use Behat\Behat\Context\Context; use Behat\Behat\Hook\Scope\BeforeScenarioScope; use Behat\Gherkin\Node\PyStringNode; use Behat\Gherkin\Node\TableNode; use Behat\MinkExtension\Context\MinkContext; use Behat\MinkExtension\Context\InitializedContext; use Behat\MinkExtension\Context\MinkContextAwareInterface; use Behat\MinkExtension\Context\RawMinkContext; use Behat\MinkExtension\Exception\CouldNotOpenBrowserException; use Behat\MinkExtension\Exception\DriverException; use Behat\MinkExtension\Exception\UnsupportedDriverActionException; use Behat\MinkExtension\ServiceContainer\Parameters; use Behat\MinkExtension\ServiceContainer\MinkFactory; use Behat\MinkExtension\ServiceContainer\SessionManager; use Behat\MinkExtension\Tester\MinkTester; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\KernelInterface; use Webmozart\Assert\Assert; require_once 'vendor/autoload.php'; class FeatureContext implements MinkContextAwareInterface { private $parameters; private $session; private $page; private $initialized; private $mink; private $tester; private $kernel; private $container; public function __construct(array $parameters) { $this->parameters = $parameters; $this->initialized = false; $this->mink = new Mink(); $this->tester = new MinkTester($this->mink); $this->kernel = $this->getContainer()->get('kernel'); } public function setContainer(ContainerBuilder $container = null) { $this->container = $container; } public function getContainer() { if (null === $this->container) { $this->container = $this->tester->getContainer(); } return $this->container; } public function initializeContext() { if (!$this->initialized) { if (method_exists($this, 'setUp')) { $this->setUp(); } elseif ($this->parameters instanceof Parameters && $this->parameters->get('browser', 'firefox') === 'chrome') { $this->initialized = true; $options = array( '--disable-extensions' => '', '--disable-gpu' => '', '--no-sandbox' => '', '--window-size=1024x768' => '', '--headless' => '', '--disable-dev-shm-usage' => '', ); $webServerUrl = $this->getParameter('web_server.base_url'); if ($this->getSession()->getDriver() instanceof Selenium2Driver) { $this->getSession()->visit($webServerUrl); } else { $this->getSession()->visit($webServerUrl . '/login'); } $this->getSession()->start(); $this->page = $this->getSession()->getPage(); } else { throw new Exception('You have to set up the parameters for browser and webdriver!'); } } } public function closeContext() { $this->initialized = false; if ($this->parameters instanceof Parameters && $this->parameters->get('browser', 'firefox') === 'chrome') { $this->getSession()->stop(); } } public function getSession() { if (null === $this->session) { $this->session = $this->getContainer()->get('session'); } return $this->session; } }
5、运行测试
可以运行测试了,在项目根目录下,打开终端,输入以下命令:
bin/behat features/example.feature --format pretty --out output.txt
这将运行example.feature
文件中定义的测试用例,并将结果输出到output.txt
文件中。
Behat是一个非常强大的PHP测试框架,它使用Gher