PHPUnit 테스트를 실행하는 방법?


12

Drupal 8은 PHPUnit 으로 Simpletest 를 기반으로 한 테스트 프레임 워크를 보완 하고 있으며 Drupal 9에서 Simpletest를 제거 할 수 있습니다 .

아직 Drupal 8로 업그레이드하지는 않지만 Drupal 7 대신 PHPUnit에서 기존 테스트를 작성하여 Simpletest에서 어떻게 작성할 수 있는지 궁금합니다.

PHPUnit을 Drupal 7과 통합하기위한 방법이나 모듈이 있습니까?

phpunit 또는 drunit 과 같은 것은 드물지만 Drupal 7에는 적합하지 않습니다.


1
Behat을 버리고 싶을뿐입니다. 그것은 실제 테스트 시나리오 (정말 단위 테스트) 수행하는 중대 : drupal.org/project/drupalextension를 당신이 설치 일단, 그것은 바람 드루팔 기능을 테스트합니다. 우리는 CI 환경에서 Behat을 실행하고 사랑합니다!
donutdan4114

@ donutdan4114 Drupal로이 작업을 수행하는 방법을 보여주는 추가 정보 나 교육용 비디오를 제공 할 수 있습니까? 나는 매우 관심이 있습니다.
zkent

답변:


11

각 테스트 파일 내에서 Drupal을 부트 스트랩하여 PHPUnit 테스트를 실행할 수 있습니다. 이상적이지는 않지만 작동합니다.

define('DRUPAL_ROOT', 'your/path/to/drupal');
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
$_SERVER['REMOTE_ADDR'] = '127.0.0.1';

// Bootstrap Drupal.
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

// Proceed with PHPUnit tests as usual from here.
class MyTest extends \PHPUnit_Framework_TestCase {
  ...

4
이 작업을 수행해야하는 경우 작성중인 내용은 단위 테스트가 아니며 SimpleTest 기반 코어 테스트 모듈에서 DrupalWebTestCase를 사용해야합니다.
matt2000

@ matt2000 예 그리고 테스트가 끝날 때까지 몇 시간 기다립니다 ...
Codium

3

PHPUnit은 객체를 빌드하기위한 훌륭한 API를 제공하지만 Drupal의 가장 간단한 테스트는 그렇지 않습니다. 이 드루팔 7 phpunit을 통합하기위한 취지에서 사용할 수있는 하나 라이브러리 .
해당 스크립트를 실행하려면이 gist-repository 를 체크 아웃해야 합니다 . 명령 줄에서 단위-테스트를 실행하려면 단순히 드루팔 사이트 (예. 이동 <DRUPAL_ROOT>/sites/default) 및 사용 dphpunit.bash 는 phpunit을 명령을 사용하는 것처럼.

스크립트는 3 개의 파일로 구성됩니다.

  1. dphpunit.bash- 몇 가지 추가 매개 변수를 사용하여 drun-dphpunit.php를 호출합니다. PHP가 심볼릭 링크를 올바르게 처리 할 수 ​​없기 때문에 필요합니다.
  2. drun-dphpunit.php- 추가 매개 변수를 처리한다는 점을 제외하고는 기본적으로 업스트림 phpunit 러너와 동일합니다.
  3. bootstrap.inc.php -Drupal 부트 스트랩을 drush와 매우 유사하게 만듭니다.

출처 : http://devblog.more-onion.com/content/writing-unit-tests-drupal-7


bootstrap.inc.php

<?php

$path = CWD;

$site_dir = NULL;
$dpl_dir = NULL;

while ($path != '/') {
    if (file_exists($path . '/settings.php')) {
        $site_dir = $path;
    }
    if (file_exists($path . '/index.php') && file_exists($path . '/includes/bootstrap.inc')) {
        $dpl_dir = $path;
        break;
    }
    $path = dirname($path);
}

if (!$dpl_dir) {
    echo "No drupal directory found in or above current working directory. Aborting. \n";
    exit(1);
}
if (!$site_dir) {
    $site_dir = $dpl_dir . '/sites/default';
    if (!file_exists($site_dir . '/settings.php')) {
        echo "No configured site found. Aborting.\n";
        exit(1);
    }
}

$_SERVER['HTTP_HOST'] = basename($site_dir);
$_SERVER['REMOTE_ADDR'] = '127.0.0.1';

define('DRUPAL_ROOT', $dpl_dir);
set_include_path($dpl_dir . PATH_SEPARATOR . get_include_path());
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

dphpunit.bash

#!/bin/bash

# get dirname of the script
DIR="$(dirname $(readlink "$0"))"

# assume the boostrap script is stored in the same directory
php "$DIR/drun-phpunit.php" "$(pwd)" --bootstrap "$DIR/bootstrap.inc.php" "$@"

drun-phpunit.php

<?php
require_once 'PHP/CodeCoverage/Filter.php';
PHP_CodeCoverage_Filter::getInstance()->addFileToBlacklist(__FILE__, 'PHPUNIT');

if (extension_loaded('xdebug')) {
  xdebug_disable();
}

if (strpos('/usr/bin/php', '@php_bin') === 0) {
  set_include_path(dirname(__FILE__) . PATH_SEPARATOR . get_include_path());
}

require_once 'PHPUnit/Autoload.php';
define('PHPUnit_MAIN_METHOD', 'PHPUnit_TextUI_Command::main');
define('CWD', $_SERVER['argv'][1]);
unset($_SERVER['argv'][1]);

$command = new PHPUnit_TextUI_Command;
$command->run($_SERVER['argv']);

Drupal 7과 PHPUnit을 통합 할 수있는 라이브러리가 하나 더 있습니다 : https://github.com/sebastianbergmann/phpunit

이 스크립트에 대한 자세한 정보는 여기에서 확인할 수 있습니다 : http://thomaslattimore.com/blog/using-phpunit-with-drupal-7


5
슬프게도이 레포는 사라졌습니다.
sheldonkreger

2
요점이 없어서 -1입니다.
cwallenpoole

1

구성 파일에 대한 해결 방법이 있습니다.

  1. drupal 프로젝트 루트에 phpunit.xml.dist 파일을 작성하십시오 . 이것을 담아 야
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="phpunit.xsd"
         bootstrap="drupal_phpunit_bootstrap.php"
         verbose="true">

</phpunit>
  1. Phpunit은 드루팔 인스턴스를 부트 스트랩해야합니다. drupal phpunit 부트 스트랩 파일을 만듭니다. drupal_phpunit_bootstrap.php 라는 이름을 선호합니다
<?php

$_SERVER['HTTP_HOST'] = 'your.url';
$_SERVER['SCRIPT_NAME'] = '/index.php';
$_SERVER['REMOTE_ADDR'] = '127.0.0.1';
$_SERVER['REQUEST_METHOD'] = 'GET';
$_SERVER['SERVER_NAME'] = NULL;
$_SERVER['SERVER_SOFTWARE'] = NULL;
$_SERVER['HTTP_USER_AGENT'] = NULL;
// Fix for behat drupal instantiation.
define('DRUPAL_ROOT', dirname(realpath(__FILE__)));
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

요점 : https://gist.github.com/permanovd/cb9c02920c49a29c97653f4f697147b1

그게 다야. 이제 여러 가지 방법으로 테스트를 시작할 수 있습니다.

1. CLI

phpunit -c phpunit.xml.dist QuestionValidationValueOptionsInputTest /yoursite.dir/public_html/profiles/standard/modules/some_module/tests/QuestionValidationTest.php

어디:

  • -c : 구성 파일을 정의합니다.
  • QuestionValidationValueOptionsInputTest and path : 테스트 클래스 이름과 경로를 정의합니다.

2. IDE (phpstorm)

테스트 실행 구성을 추가해야합니다

테스트 실행 구성

또한 모든 테스트에 드루팔 부트 스트랩 코드를 포함시킬 필요가 없습니다.

노트

환경의 잘못된 PHP 버전으로 인해 테스트에 문제가있을 수 있습니다.

더 읽을 거리 :

https://phpunit.de/manual/current/en/organizing-tests.html

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.