2014-02-19 2 views
6

Я пытаюсь запустить некоторые приемочные тесты в моем приложении Laravel. В то время как функциональные тесты запускают тестовую среду, приемочные тесты этого не делают. Является ли это ошибкой или признаком приемочных испытаний? Основная проблема, по которой это меня беспокоит, заключается в том, что она не использует (+ populating + cleanup) тестовую базу данных, она подключается только к базе данных dev (которая используется, когда не указана никакая другая ENV, например, тестирование, производство), и это часто терпит неудачу в тех тестах, когда я запускаю их несколько раз.Являются ли приемочные испытания в Codeception предполагаемыми для работы в тестовой среде? (Laravel4 + Codeception)

Это моя конфигурация:

codeception.yml

paths: 
    tests: app/tests 
    log: app/tests/_log 
    data: app/tests/_data 
    helpers: app/tests/_helpers 
settings: 
    bootstrap: _bootstrap.php 
    suite_class: \PHPUnit_Framework_TestSuite 
    colors: true 
    memory_limit: 1024M 
    log: true 
modules: 
    config: 
     Db: 
      dsn: 'mysql:host=localhost;dbname=testdb' 
      user: 'root' 
      password: 'root' 
      dump: 'app/tests/_data/dump.sql' 
      populate: true 
      cleanup: true 

acceptance.suite.yml

class_name: WebGuy 
modules: 
    enabled: 
     - PhpBrowser 
     - WebHelper 
     - Db 
    config: 
     PhpBrowser: 
      url: 'http://localhost/' 

functional.suite.yml

class_name: TestGuy 
modules: 
    enabled: [Filesystem, TestHelper, Laravel4, Db] 

Благодарим за помощь!

+0

У меня такая же проблема. Мои приемочные тесты для Codeception НЕ запускаются в среде тестирования. Я попытался включить Laravel4 в accept.suite.yml - и это ничего не меняет. – Laurence

+0

Из того, что я могу сказать - Codeception запускает «два» цикла каждого теста. Один из них запускается как среда «test», но второй не запускается в среде «test». Я могу подтвердить это, потому что, если вы вынуждаете тесты BOTH работать в среде «test», ваши маршруты не работают корректно (поскольку они обычно отключены для тестов). – Laurence

+0

@Fabrizio - какая дополнительная информация вам нужна? Я уже дал ответ? – Laurence

ответ

7

«Приемочные испытания» не запускаются в тестовой среде. The reason is when Laravel is in the testing environment, it disables filters by default. Поэтому среда тестирования предназначена только для функциональных и функциональных тестов.

Приемочные испытания должны выполняться в другой среде (например, dev или определенной для Codeception).

Поскольку Codeception 2.x теперь использует Guzzle для получения ответа на страницу, его можно обнаружить, когда вы находитесь на хост-машине, а Codeception выполняет конкретный запрос. Таким образом, вы можете иметь «тестовую» среду, а также среду «кодирования», специально предназначенную для ваших приемочных испытаний.

Если вы используете Homestead, я делаю это в моем start.php файл, чтобы обнаружить, если Codeception работает, и, в частности поместить его в окружающую среду «codeception», в противном случае я смочите мое обнаружение среды обычно

if ((gethostname() === 'homestead') && (isset($_SERVER['REMOTE_ADDR'])) && ($_SERVER['REMOTE_ADDR'] === '127.0.0.1')) 
{ 
    $env = $app->detectEnvironment(['codeception' => ['homestead']]); 
} 
else 
{ 
    $env = $app->detectEnvironment(['dev' => ['homestead']]); 
} 

Затем в моей среде «codeception» я настраиваю базу данных SQLite и запускаю приемочные тесты против этого (что быстрее, чем тестирование mySQL).

+0

У меня такая же проблема, но я использую Behat и MAMP. Вы знаете, как правильно настроить среду? У меня уже есть база данных * _acceptance и папка config/accept, указывающая на правильную базу данных. В моем файле featureContext.php я устанавливаю среду для «принятия». Когда тесты проходят, Behat использует мою локальную БД. :( Заранее спасибо –

+0

Это не работает, есть ли дополнительные объяснения вокруг этого? – DavidT

5

Во-первых, вы должны понимать, что приемочные тесты Codeception не работают в среде тестирования Laravel. Скорее, он использует Guzzle для выполнения внешних HTTP-запросов. Предполагая, что ваши приемочные тесты выполняются с использованием localhost, вы работаете в стандартной среде разработки. Это похоже на использование вашего браузера.

Это, как я использую тесты приемо-сдаточных тестов для работы в среде тестирования Laravel. Я запускаю Vagrant со стеком LAMP на Ubuntu.

  1. Редактировать /etc/hosts файл. Добавьте test.localhost в строку 127.0.0.1. Не удаляйте другие хосты. Если вы используете WAMP/MAMP/или другие, это может быть аналогичная настройка.

    /и т.д./хосты

    127.0.0.1 localhost test.localhost

  2. Настройка вашей обработки с Laravel среды. Ниже приведен код в файле bootstrap/start.php в вашем корневом каталоге larval. обратите внимание на строку «тестирование».

    самозагрузки/start.php

    $env = $app->detectEnvironment(array(
        'local' => array('your-machine-name'), 
        'testing' => array('test.localhost') 
    )); 
    
  3. Убедитесь, что Приемка codeception настроен попадать в домен/URL. Код ниже приведен из моих собственных приемочных тестов для API. Обратите внимание на то, что url: разделы имеют test.localhost. Это URL-адрес, который Codeception поразит для тестов.

    приложение/тесты/acceptance.suite.yml

    class_name: ApiGuy 
    modules: 
        enabled: [PhpBrowser, REST, ApiHelper, Db, FileSystem] 
        config: 
         PhpBrowser: 
          url: http://test.localhost/ 
         REST: 
          url: http://test.localhost/api/v1/ 
    

Собираем все вместе

  1. Мы редактировали файл /etc/hosts так, что Codeception можно найти test.localhost. Редактирование конфигурации вашего веб-сервера для обработки test.localhost выходит за рамки этого ответа.
  2. Мы отредактировали bootstrap/start.php Laravel, чтобы он знал, что любые запросы, поступающие в test.localhost, должны запускаться в тестовой среде.
  3. Мы отредактированный файл Codeception в acceptance.suite.yml сказать ему, чтобы запустить все тесты на http://test.localhost

Теперь, если предположить, что выше сделано правильно, вы должны быть в состоянии выполнить принятие запуска codeception и увидеть результаты тестов.

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