จะทำการทดสอบ PHPUnit ได้อย่างไร?


12

Drupal 8 กำลังเสริมกรอบการทดสอบตามSimpletestด้วยPHPUnitและ Simpletest สามารถลบออกได้ใน Drupal 9

ฉันยังไม่อัปเกรดเป็น Drupal 8 แต่ฉันสงสัยว่าฉันจะเขียนการทดสอบที่มีอยู่ใน PHPUnit (เพื่อติดตามแนวโน้ม) สำหรับ Drupal 7 ได้อย่างไรแทนที่จะเป็น Simpletest?

มีวิธีการหรือโมดูลสำหรับการรวม PHPUnit กับ Drupal 7 หรือไม่?

มีไม่กี่phpunitหรือdrunitแต่พวกมันไม่ใช่ Drupal 7


1
แค่อยากโยน Behat ออกไปที่นั่น มันยอดเยี่ยมสำหรับการทำสถานการณ์การทดสอบในโลกแห่งความเป็นจริง (ไม่ใช่การทดสอบหน่วย): drupal.org/project/drupalextensionเมื่อคุณตั้งค่ามันจะทำให้การทดสอบการทำงานของ Drupal เป็นเรื่องง่าย เรากำลังใช้ Behat ในสภาพแวดล้อม CI และรักมัน!
donutdan4114

@ donutdan4114 คุณสามารถให้ข้อมูลเพิ่มเติมหรือวิดีโอคำแนะนำที่แสดงให้เห็นว่าคุณทำสิ่งนี้กับ Drupal ได้อย่างไร? ฉันสนใจมาก
zkent

คำตอบ:


11

คุณสามารถรับการทดสอบ PHPUnit เพื่อให้ทำงานโดย bootstrapping Drupal ภายในไฟล์ทดสอบแต่ละไฟล์ของคุณ มันไม่เหมาะ แต่มันใช้งานได้

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
หากคุณต้องการทำสิ่งที่คุณเขียนไม่ใช่การทดสอบหน่วยและคุณควรใช้ DrupalWebTestCase จากโมดูลทดสอบหลักที่ใช้ SimpleTest
matt2000

@ matt2000 จ้ะและต้องรอหลายชั่วโมงจนกว่าการทดสอบจะเสร็จสิ้น ...
Codium

3

PHPUnit มี API ที่ดีสำหรับการสร้างวัตถุในขณะที่ Simpletest ของ Drupal ไม่สามารถทำได้ นอกจากนี้หนึ่งในห้องสมุดที่มีอยู่ในส่วนสำคัญสำหรับการบูรณาการกับ PHPUnit Drupal 7
ในการรันสคริปต์เหล่านั้นคุณต้องทำการเช็คเอาต์พื้นที่เก็บข้อมูลนี้ หากต้องการดำเนินการทดสอบหน่วยในบรรทัดคำสั่งให้ไปที่ไซต์ Drupal (เช่น<DRUPAL_ROOT>/sites/default) และใช้dphpunit.bashเช่นเดียวกับที่คุณใช้คำสั่ง phpunit

สคริปต์ประกอบด้วย 3 ไฟล์:

  1. dphpunit.bash - ซึ่งเรียกใช้ drun-dphpunit.php ด้วยพารามิเตอร์พิเศษบางอย่าง จำเป็นเพราะ PHP ไม่สามารถจัดการกับ symlink ได้อย่างถูกต้อง
  2. drun-dphpunit.php - ซึ่งโดยทั่วไปเหมือนกับ phpunit runner ยกเว้นว่ามันจัดการพารามิเตอร์พิเศษ
  3. bootstrap.inc.php - ซึ่งทำให้ bootstrap ของ 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']);

มีอีกหนึ่งไลบรารีสำหรับการรวม PHPUnit กับ Drupal 7: https://github.com/sebastianbergmann/phpunit

ข้อมูลเพิ่มเติมเกี่ยวกับสคริปต์นี้สามารถตรวจสอบได้ที่นี่: http://thomaslattimore.com/blog/using-phpunit-with-drupal-7


5
น่าเสียดายที่ repo นี้หายไป
sheldonkreger

2
-1 เนื่องจากส่วนสำคัญหายไป
cwallenpoole

1

มีวิธีแก้ปัญหาพร้อมไฟล์กำหนดค่า

  1. สร้างไฟล์phpunit.xml.distในรูทโปรเจ็กต์ drupal ของคุณ ต้องมีสิ่งนี้
<?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 ต้อง bootstrap ตัวอย่าง drupal ของเรา สร้างไฟล์ bootstrap ของ 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 และพา ธ : กำหนดชื่อคลาสการทดสอบและพา ธ

2. IDE (phpstorm)

คุณต้องเพิ่มการทดสอบการกำหนดค่า

ทดสอบการกำหนดค่าการทำงาน

และไม่จำเป็นต้องรวมรหัส bootstrap drupal ในการทดสอบทุกครั้ง

บันทึก

คุณอาจมีปัญหากับการทดสอบเนื่องจากสภาพแวดล้อมของคุณในเวอร์ชัน php ผิด

อ่านเพิ่มเติม:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.