2014-09-01 2 views
2

Behat 3 및 Laravel을 사용하여 API를 테스트하는 데 혼란스러운 문제가 있습니다.Behat 3 및 Laravel, 테스트 환경이 적용되지 않습니다.

그것은 (내 경우에는 sqlite 메모리 데이터베이스) '테스트'환경 데이터베이스를 사용하지 않는 것 같습니다 ...하지만 시간의 일부만.

testing/database.php 파일에 로그 메시지를 넣었습니다.로드 된 시간을 확인하고 Behat을 실행할 때 로그 메시지가 표시됩니다.

하지만 Behat 기능을 실행하면 개발 데이터베이스에 행을 추가하는 것과 같은 이유로 내 테스트 중 일부가 실패합니다.

내 phpunit 테스트가 잘 실행되고 dev 데이터베이스가 변경되지 않습니다.

제가 놓친 behat.yml에 있어야 할 것이 있습니까?

EDIT : 나는 API를 테스트하기 위해 Guzzle을 사용하고 Behat의 설정 기능은 테스트 환경에서 작동하지만, 일단 Guzzle이 작동하면 앱은 테스트 환경에서 전혀 모른다. 그래서 나는 앱에 테스트 환경을 알려주거나 개발 환경을 사용하도록 behat에게 지시하는 방법을 찾아야한다.

답변

3

PHPUnit을 사용하면 부트 스트랩에서 환경을 구성 할 수 있으며이 구성은 전체 테스트 동안 사용됩니다. Behat을 사용하면 PHPUnit과 달리 상황이 다릅니다. PHP는 PHPUnit과 달리 서버에 요청을 보내고 PHP 코드와 직접 대화하지 않습니다. 우리 개발자들에게 다음 폴더에있는 기능을 테스트하는 것처럼 보이지만 실제로는 해당 코드를 가리키는 로컬 서버를 통해 액세스됩니다. 즉, 테스트에 노출되지 않는 원격 코드를 처리하고 있으며 (예상대로) 구성을 무시합니다 (어쨌든 로컬 코드에서 설정).

코드에 구성을 전달하려면 서버를 진입 점으로 생각해야합니다. 두 가지 기본 접근법이 있습니다 - app (app.dev 및 app.tst)에 두 개의 로컬 도메인을 사용하거나 app.tst가 테스트 중임을 알리는 매개 변수/쿠키를 허용하도록합니다. 당신이 앱에 어떤 논리를 추가하지 않는 및 서버 설정을 통해 설정 환경 변수 또는 다른 부트 스트랩에 도메인 지점을 만들 수있는 첫 번째는 최선의 선택이 될 것 등 당신의 FeatureContext.php 추가하려면이 방법에서

+0

예 - 데이터베이스와 로컬 url로 'acceptance'환경을 만들고 vhats 설정에 환경 변수를 설정하여 Behat 테스트를 실행할 때 laravel에게 알려줍니다. – Adamski

+0

올바른 선택. MySql 스키마의 복사 자동화를위한 보너스 (Laravel이 비슷한 것을 가지고 있지만) 약간의 리펙토링으로 멋진 코드 조각이됩니다 : http://www.matteomattei.com/how-to-clone-mysql-database-schema- in-php/ –

+0

SQLite가 MySQL보다 훨씬 빠르다는 것을 알았습니다. 메모리 내 모드를 사용하고 싶지만 요청간에 지속될 수는 없습니다. – Adamski

1

:

/** 
* @BeforeSuite 
*/ 
public static function bootstrapLaravel() 
{ 
    $unitTesting = true; 
    $testEnvironment = 'testing'; 


    require __DIR__ . '/../../../bootstrap/start.php'; // adjust this to right path. This will work if FeatureContext.php is in app/tests/acceptance 
} 

테스트 데이터베이스를 사용하고 Laravel aswell을 포함하므로 모델도 사용할 수 있습니다.