Drupal 8은 PHPUnit 으로 Simpletest 를 기반으로 한 테스트 프레임 워크를 보완 하고 있으며 Drupal 9에서 Simpletest를 제거 할 수 있습니다 .
아직 Drupal 8로 업그레이드하지는 않지만 Drupal 7 대신 PHPUnit에서 기존 테스트를 작성하여 Simpletest에서 어떻게 작성할 수 있는지 궁금합니다.
PHPUnit을 Drupal 7과 통합하기위한 방법이나 모듈이 있습니까?
Drupal 8은 PHPUnit 으로 Simpletest 를 기반으로 한 테스트 프레임 워크를 보완 하고 있으며 Drupal 9에서 Simpletest를 제거 할 수 있습니다 .
아직 Drupal 8로 업그레이드하지는 않지만 Drupal 7 대신 PHPUnit에서 기존 테스트를 작성하여 Simpletest에서 어떻게 작성할 수 있는지 궁금합니다.
PHPUnit을 Drupal 7과 통합하기위한 방법이나 모듈이 있습니까?
답변:
각 테스트 파일 내에서 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 {
...
PHPUnit은 객체를 빌드하기위한 훌륭한 API를 제공하지만 Drupal의 가장 간단한 테스트는 그렇지 않습니다. 이 드루팔 7 phpunit을 통합하기위한 취지에서 사용할 수있는 하나 라이브러리 .
해당 스크립트를 실행하려면이 gist-repository 를 체크 아웃해야 합니다 . 명령 줄에서 단위-테스트를 실행하려면 단순히 드루팔 사이트 (예. 이동 <DRUPAL_ROOT>/sites/default
) 및 사용 dphpunit.bash 는 phpunit을 명령을 사용하는 것처럼.
스크립트는 3 개의 파일로 구성됩니다.
출처 : 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
<?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>
<?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
그게 다야. 이제 여러 가지 방법으로 테스트를 시작할 수 있습니다.
phpunit -c phpunit.xml.dist QuestionValidationValueOptionsInputTest /yoursite.dir/public_html/profiles/standard/modules/some_module/tests/QuestionValidationTest.php
어디:
테스트 실행 구성을 추가해야합니다
또한 모든 테스트에 드루팔 부트 스트랩 코드를 포함시킬 필요가 없습니다.
환경의 잘못된 PHP 버전으로 인해 테스트에 문제가있을 수 있습니다.