Bagaimana cara menjalankan tes PHPUnit?

12

Drupal 8 melengkapi kerangka pengujian berdasarkan Simpletest dengan PHPUnit , dan Simpletest dapat dihapus di Drupal 9.

Saya belum meningkatkan ke Drupal 8, tapi saya bertanya-tanya bagaimana saya bisa menulis tes yang ada di PHPUnit (untuk menindaklanjuti dengan tren) untuk Drupal 7, sebagai gantinya di Simpletest?

Apakah ada metode atau modul untuk mengintegrasikan PHPUnit dengan Drupal 7?

Ada beberapa seperti phpunit atau pemabuk , tetapi mereka bukan untuk Drupal 7.

kenorb
sumber
1
Hanya ingin membuang Behat di sana. Ini bagus untuk melakukan skenario pengujian dunia nyata (tidak benar-benar unit testing): drupal.org/project/drupalextension Setelah Anda membuatnya, itu membuat pengujian fungsi Drupal menjadi mudah. Kami menjalankan Behat di lingkungan CI dan menyukainya!
donutdan4114
@ donutdan4114 dapatkah Anda memberikan lebih banyak info atau video instruksional yang menunjukkan bagaimana Anda menyelesaikan ini dengan Drupal? Aku sangat tertarik.
zkent

Jawaban:

11

Anda bisa menjalankan tes PHPUnit dengan menjalankan Drupal bootstrap di dalam setiap file pengujian Anda. Ini tidak ideal, tetapi berhasil.

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 {
  ...
sheldonkreger
sumber
4
Jika Anda perlu melakukan ini, apa yang Anda tulis bukanlah Tes Unit, dan Anda mungkin harus menggunakan DrupalWebTestCase dari modul pengujian inti berbasis SimpleTest.
matt2000
@ matt2000 ya dan tunggu sampai tes selesai ...
Codium
3

PHPUnit menyediakan API yang bagus untuk membangun objek sedangkan yang paling sederhana dari Drupal tidak. Ada satu perpustakaan yang tersedia di intinya untuk mengintegrasikan PHPUnit dengan Drupal 7 .
Untuk mengeksekusi skrip-skrip tersebut, Anda perlu checkout repositori inti ini . Untuk menjalankan Tes Unit di baris perintah cukup buka situs Drupal (mis. <DRUPAL_ROOT>/sites/default) Dan gunakan dphpunit.bash sama seperti Anda akan menggunakan perintah phpunit.

Script terdiri dari 3 file:

  1. dphpunit.bash - yang hanya memanggil drun-dphpunit.php dengan beberapa parameter tambahan. Ini diperlukan karena PHP tidak mampu menangani symlink dengan benar.
  2. drun-dphpunit.php - yang pada dasarnya sama dengan runner phpunit upstream, kecuali ia menangani parameter tambahan.
  3. bootstrap.inc.php - yang membuat bootstrap Drupal sangat mirip dengan drush.

Sumber: 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']);

Ada satu lagi perpustakaan yang tersedia untuk integrasi PHPUnit dengan Drupal 7: https://github.com/sebastianbergmann/phpunit

Informasi lebih lanjut tentang skrip ini dapat diperiksa di sini: http://thomaslattimore.com/blog/using-phpunit-with-drupal-7

Ankit Agrawal
sumber
5
Sayangnya, repo ini hilang.
sheldonkreger
2
-1 karena inti hilang.
cwallenpoole
1

Ada solusi dengan file konfigurasi.

  1. Buat file phpunit.xml.dist di root proyek drupal Anda. Harus mengandung ini
<?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 harus mem-bootstrap instance drupal kami. Buat file bootstrap phupit drupal. Saya lebih suka menyebutnya 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);

Intisari: https://gist.github.com/permanovd/cb9c02920c49a29c97653f4f697147b1

Itu saja. Sekarang Anda dapat memulai tes dengan beberapa cara.

1. CLI

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

dimana:

  • -c : Menentukan file konfigurasi.
  • QuestionValidationValueOptionsInputTest dan jalur : Menentukan nama kelas uji dan jalur untuk itu.

2. IDE (phpstorm)

Anda harus menambahkan konfigurasi uji coba

Konfigurasi uji coba

Dan tidak perlu menyertakan kode bootstrap drupal ke dalam setiap tes.

Catatan

Anda mungkin memiliki masalah dengan tes karena versi php yang salah dari lingkungan Anda.

Bacaan lebih lanjut:

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

David Permanov
sumber