Поиск…


замечания

В этом разделе представлен обзор того, что нужно, и почему разработчик может захотеть его использовать.

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

Функциональное тестирование в качестве пользовательских историй

Функциональные тесты лучше всего описывать как тесты для ваших пользовательских историй. Если вы рассматривали истории пользователей, прежде чем они, как правило, следуют следующему шаблону:

As a [role], I want to [desire], so that [benefit/desired outcome]

В следующих примерах мы будем использовать эту историю пользователей в качестве примера:

As a Dungeon Master, I want to ensure harmony and mutual trust, so that
the party can work together as a team

Двумя наиболее популярными платформами тестирования для функциональных тестов на PHP являются Behat и PHPSpec .

Начиная с Бехата

Behat обеспечивает синтаксис Gherkin, который является удобочитаемым человеком. Это позволяет легко описать ваши истории пользователей.

Чтобы начать с Behat, вы должны установить его с помощью Composer, а затем инициализировать тестовые файлы:

$ composer require --dev behat/behat="^3.0.5"

$ ./vendor/bin/behat --init

+d features # place your *.feature files here
+d features/bootstrap # place your context classes here
+f features/bootstrap/FeatureContext.php # place your definitions, transformations and hooks here

По умолчанию вы размещаете тестовые файлы в папке features/ папке и имеете расширение .feature .

Каждый тестовый файл должен определять конкретную функцию приложения. Функция разбита на кучу сценариев и содержит ряд шагов, которые необходимо успешно выполнить для прохождения сценария. Каждый сценарий должен пройти для прохождения функции.

# features/PartyHarmony.feature
Feature: Party Harmony
    As a Dungeon Master, I want to ensure harmony and mutual trust, so that
    the party can work together as a team

    Scenario: Teach members to respect each others property
        Given that the Wizard has 10 cookies
        And the Bard eats 1 cookie
        Then the Bard is mysteriously on fire

Чтобы выполнить ваши тесты, вы выполняете двоичный код Behat напрямую. Мы можем опционально указать, какой файл функции запускаться (в противном случае все тесты будут запущены). Этот файл функции завершится с ошибками неопределенных шагов (потому что мы не определили, что означают эти шаги):

$ ./vendor/bin/behat features/PartyHarmony.feature
Feature: Party Harmony
    As a Dungeon Master, I want to ensure harmony and mutual trust, so that
    the party can work together as a team

  Scenario: Teach members to respect each others property # features/PartyHarmony.feature:6
    Given that the Wizard has 10 cookies
    And the Bard eats 1 cookie
    Then the Bard is mysteriously on fire

1 scenario (1 undefined)
3 steps (3 undefined)
0m0.01s (10.49Mb)

--- FeatureContext has missing steps. Define them with these snippets:

    /**
     * @Given that the Wizard has :arg1 cookies
     */
    public function thatTheWizardHasCookies($arg1)
    {
        throw new PendingException();
    }

    /**
     * @Given the Bard eats :arg1 cookie
     */
    public function theBardEatsCookie($arg1)
    {
        throw new PendingException();
    }

    /**
     * @Then the Bard is mysteriously on fire
     */
    public function theBardIsMysteriouslyOnFire()
    {
        throw new PendingException();
    }

Каждый шаг в сценарии запускает часть кода из файла PHP контекста (различные тесты функций могут загружать разные контексты). Мы можем скопировать примеры, предложенные Бехатом, или создать собственные. Этот шаг согласовывается с проверкой регулярного выражения. Поэтому, если мы реализуем

<?php
# 
class FeatureContext {
    /**
     * @Given that the wizard has :num cookies
     */
    public function wizardHasCookies($num) {
        // $this->wizard is a pre-existing condition.... like syphilis
        $this->wizard->setNumberOfCookies($num);
    }

    /**
     * @Given the Bard eats :num cookie
     */
    public function theBardEatsCookie($num)
    {
        $this->bard->consumeCookies($num);
    }

    /**
     * @Then the Bard is mysteriously on fire
     */
    public function theBardIsMysteriouslyOnFire() {
        PHPUnit_Framework_Assert::assertTrue(
            $this->bard->isBardOnFire()
        );
    }
}

Вы заметите использование PHPUnit_Framework_Assert . У Бегата нет собственной системы утверждения, поэтому вы можете использовать то, что хотите.

Теперь запуск тестов будет выполнять фактический код, и мы можем проверить, проходит ли все:

$ ./vendor/bin/behat features/PartyHarmony.feature
Feature: Party Harmony
    As a Dungeon Master, I want to ensure harmony and mutual trust, so that
    the party can work together as a team

  Scenario: Teach members to respect each others property # features/PartyHarmony.feature:6
    Given that the Wizard has 10 cookies                  # FeatureContext::thatTheWizardHasCookies()
    And the Bard eats 1 cookie                            # FeatureContext::theBardEatsCookie()
    Then the Bard is mysteriously on fire                 # FeatureContext::theBardIsMysteriouslyOnFire()

1 scenario (1 passed)
3 steps (3 passed)
0m0.01s (10.59Mb)

Расширение Behat с норкой

Mink предоставляет интерфейс для веб-драйверов (таких как Goutte и Selenium), а также MinkContext который при расширении предоставляет дополнительный веб-язык для наших шагов.

Чтобы установить Mink (и драйвер Goutte по умолчанию):

$ composer require --dev behat/mink-extension="^2.0"
$ composer require --dev behat/mink-goutte-driver="^1.0"

Затем расширьте свой контекст с помощью MinkContext :

<?php
use Behat\MinkExtension\Context\MinkContext;

class FeatureContext extends MinkContext … {
    …
}

Вы можете увидеть весь список синтаксиса, доступный в вашей установке Behat, с помощью следующей команды:

$ ./vendor/bin/behat -dl

Given /^(?:|I )am on "(?P<page>[^"]+)"$/
 When /^(?:|I )reload the page$/
 When /^(?:|I )move backward one page$/
 When /^(?:|I )move forward one page$/
 When /^(?:|I )press "(?P<button>(?:[^"]|\\")*)"$/
 When /^(?:|I )follow "(?P<link>(?:[^"]|\\")*)"$/
 When /^(?:|I )fill in "(?P<field>(?:[^"]|\\")*)" with "(?P<value>(?:[^"]|\\")*)"$/

Затем вам нужно настроить Mink, чтобы указать, где находится веб-сайт, который вы хотите проверить, и какие веб-драйверы использовать (Goutte по умолчанию):

# ./behat.yml
default:
    extensions:
        Behat\MinkExtension:
            base_url: "[your website URL]"
            sessions:
                default:
                    goutte: ~

Ниже приведен пример сценария, использующего только шаги, указанные в Mink:

# ./features/Authentication.feature
Feature: Authentication
    As a security conscious developer I wish to ensure that only valid users can access our website.

    Scenario: Login in successfully to my website
        When I am on "/login"
        And I fill in "email" with "[email protected]"
        And I fill in "password" with "my_password"
        And I press "Login"
        Then I should see "Successfully logged in"

    Scenario: Attempt to login with invalid credentials
        When I am on "/login"
        And I fill in "email" with "[email protected]"
        And I fill in "password" with "not_my_password"
        And I press "Login"
        Then I should see "Login failed"

Теперь вы можете проверить это, запустив функцию через Behat:

./vendor/bin/behat features/Authentication.feature

Вы можете создать свои собственные шаги, используя MinkContext для общих шагов (например, вход в систему - очень обычная операция):

Feature: Authentication
    As a security conscious developer I wish to ensure that only valid users can access our website.

    Scenario: Login in successfully to my website
        Given I login as "[email protected]" with password "my_password"
        Then I should see "Successfully logged in"

    Scenario: Attempt to login with invalid credentials
        Given I login as "[email protected]" with password "not_my_password"
        Then I should see "Login failed"

Вам нужно будет расширить свой контекстный файл с помощью MinkContext чтобы получить доступ к веб-драйверам и взаимодействиям с страницами:

<?php
use Behat\MinkExtension\Context\MinkContext;

class FeatureContext extends MinkContext {
    /**
      * @Given I login as :username with password :password
      */
    public function iLoginAsWithPassword($username, $password) {
        $this->visit("/login");
        $this->fillField("email", $username);
        $this->fillField("password", $password);
        $this->pressButton("Login");
    }
}

Mink также предоставляет селектор CSS в большинстве своих предварительно предоставленных вызовов, который позволяет идентифицировать элементы на странице с помощью таких конструкций, как:

When I click on "div[id^='some-name']"
And I click on ".some-class:first"
And I click on "//html/body/table/thead/tr/th[first()]"

Тестирование JavaScript с использованием норки и селена

Если мы хотим протестировать JavaScript на веб-сайте, нам нужно будет использовать что-то более мощное, чем Goutte (это просто cURL через Guzzle). Есть несколько вариантов, таких как ZombieJS , Selenium и Sahi . В этом примере я буду использовать Selenium.

Сначала вам нужно установить драйверы для Mink:

$ composer require --dev behat/mink-selenium2-driver="^1.2"

Вам также понадобится загрузить отдельный файл jar-файла Selenium и запустить его:

$ java -jar selenium-server-standalone-2.*.jar

Нам также нужно сказать Behat, что, когда мы используем тег @javascript для использования драйвера Selenium и предоставляем @javascript Selenium.

# ./behat.yml
default:
    # …
    extensions:
        Behat\MinkExtension:
        base_url: "[your website URL]"
        sessions:
            # …
            javascript:
                selenium2:
                    browser: "firefox"
                    wd_host: http://localhost:4444/wd/hub

Затем для каждого теста, который вы хотите запустить с использованием эмуляции браузера, вам просто нужно добавить @javascript (или @selenium2 ) в начало функции или сценария.

# ./features/TestSomeJavascriptThing.feature
@javascript # or we could use @selenium2
Feature: This test will be run with browser emulation

Затем тест можно запустить через Behat (как и любой другой тест). Единственное различие заключается в том, что при запуске теста он должен вызывать окно браузера на компьютере с автономным сервером Selenium, который затем будет выполнять описанные тесты.

Настройка тестовых данных

С функциональными данными тестирования часто меняются. Это может привести к сбою последующих прогонов тестового набора (поскольку данные могли быть изменены с исходного состояния, в котором он находился).

Если вы настроили источник данных с помощью ORM или фреймворка, поддерживающего миграцию или сеяние (например, Doctrine , Propel , Laravel ), вы можете использовать это для создания новой тестовой базы данных в комплекте с данными Fixture на каждом тестовом прогоне.

Если вы в настоящее время не используете один из них (или эквивалент), вы можете использовать такие инструменты, как Phinx, для быстрой настройки новой тестовой базы данных или подготовки существующей базы данных для каждого тестового прогона (очистка тестовых записей, возврат данных обратно в исходное состояние ).

# Install Phinx in your project
$ php composer.phar require robmorgan/phinx

$ php vendor/bin/phinx init
Phinx by Rob Morgan - https://phinx.org. version x.x.x
Created ./phinx.xml

Добавьте учетные данные своей базы данных в ./phinx.xml .

$ php vendor/bin/phinx create InitialMigration

Вы можете указать, как ваши базы данных базы данных создаются и заполняются с помощью синтаксиса, приведенного в документации .

Затем каждый раз, когда вы запускаете свои тесты, вы запускаете скрипт следующим образом:

#!/usr/bin/env bash

# Define the test database you'll use
DATABASE="test-database"

# Clean up and re-create this database and its contents
mysql -e "DROP DATABASE IF EXISTS $DATABASE"
mysql -e "CREATE DATABASE $DATABASE"
vendor/bin/phinx migrate

# Start your application using the test database (passed as an environment variable)
# You can access the value with $_ENV['database']
database=$DATABASE php -d variables_order=EGPCS -S localhost:8080

# Run your functional tests
vendor/bin/behat

Теперь ваши функциональные тесты не должны прерываться из-за изменений данных.

Захват писем

Функциональное тестирование также может включать процессы тестирования, которые выходят из вашей среды, такие как внешние вызовы API и электронные письма.

Например, представьте, что вы функционально тестируете процесс регистрации своего веб-сайта. Последним этапом этого процесса является отправка электронной почты с ссылкой активации. Пока эта ссылка не будет посещена, учетная запись не будет полностью зарегистрирована. Вы бы хотели протестировать оба:

  1. То, что письмо будет отправлено правильно (форматирование, замена заполнителя и т. Д.) И,
  2. Что работает ссылка активации

Теперь вы можете протестировать отправку по электронной почте, но используя IMAP или POP-клиент для извлечения отправленного письма из почтового ящика, но это означает, что вы также тестируете свое интернет-соединение, удаленный почтовый сервер и любые проблемы, которые могут возникнуть при доставке (обнаружение спама например).

Более простым решением является использование локальной службы, которая перехватывает исходящие SMTP-соединения и выгружает отправленное письмо на диск.

Несколько примеров:

smtp-sink - утилита, поставляемая вместе с Postfix.

# Stop the currently running service
sudo service postfix stop

# Dumps outgoing emails to file as "day.hour.minute.second"
smtp-sink -d "%d.%H.%M.%S" localhost:2500 1000

# Now send mails to your local SMTP server as normal and they will be
# dumped to raw text file for you to open and read

# Run your functional tests
vendor/bin/behat

Не забудьте убить smtp-sink и перезапустить службу postfix после этого:

# Restart postfix
sudo service postfix start

FakeSMTP - клиент на основе Java, который перемещает исходящую почту

# -b = Start without GUI interface
# -o = Which directory to dump your emails to
$ java -jar fakeSMTP.jar -b -o output_directory_name

В качестве альтернативы вы можете использовать удаленную службу, предоставляющую эту службу, например mailtrap, но тогда ваше тестирование зависит от доступа в Интернет.

Установка или настройка

Behat / Норка

Установка с использованием композитора (для проверки других методов) behat.org Если вы используете Linux, убедитесь, что у вас установлен php-curl (нормальная установка завивки не будет работать)

Linux

sudo apt-get install php5-curl

Если вы используете Windows , убедитесь, что у вас установлены PHP, Curl и Git. Вы можете найти их по следующим ссылкам:

Ваш композитор.json будет содержать следующее:

behat - composer.json

{
  "require": {
    "behat/behat": "dev-master",
    "behat/mink": "dev-master",
    "behat/mink-extension": "dev-master",
    "behat/mink-selenium2-driver": "dev-master",
    "phpunit/php-code-coverage": "dev-master",
    "phpunit/phpunit-mock-objects": "dev-master",
    "phpunit/phpunit": "dev-master"
  },
  "minimum-stability": "dev",
  "config": {
    "bin-dir": "bin/"
  }
}

(при сохранении файла composer.json в Windows вам нужно выбрать «Все файлы» в качестве типа Filetype и «ANSI»)

Затем выполните следующие команды:

$ curl http://getcomposer.org/installer | php
$ php composer.phar install

После этого устанавливаются Behat, Mink и Behat-Mink, чтобы выполнить поведение

выполнить

$ bin/behat

Чтобы активировать расширение Behat-Mink, используйте: behat.yml создайте файл «behat.yml» со ​​следующим содержимым

behat.yml

default:
  suites:
    default:
      paths:
        features: %paths.base%/features/
        bootstrap: %paths.base%/features/bootstrap/
      contexts: 
        - FeatureContext
  extensions:
    Behat\MinkExtension:
      base_url: 'http://www.startTestUrl.de'
      selenium2:
        browser: firefox
        wd_host: "http://localhost:4444/wd/hub"

Этот файл будет находиться в том же каталоге, который содержит каталог bin и ссылку на него.
Также обратите внимание, что в yml-файле не используйте вкладки для отступов. используйте пробелы. Чтобы получить список команд, доступных в режиме, используйте

$ bin/behat -di

Сделать частью вашей системы

Linux

Перейдите в свой Homedirectory и выполните следующие действия:

$ sudo vi .bashrc

И добавьте эти строки в конец каталога

export BEHAT_HOME=/home/*user*/path/to/behat
export PATH=$BEHAT_HOME/bin:$PATH

Перезапустите консоль или введите «source .bashrc»

Windows

Перейдите в Systemsettings и добавьте Path of behat / bin в переменные среды

Другие драйверы Над драйверами, такими как Selenium, phantomjs, goutte и т. Д., Также должны быть установлены.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow