PHPUnit testleri nasıl yapılır?


12

Drupal 8 takviye edilir göre test çerçevesi SimpleTest ile PHPUnit ve SimpleTest olabilir çıkarıldı Siteye 9.

Henüz Drupal 8'e yükseltme yapmıyorum, ancak PHPUnit'te mevcut testleri nasıl yazabileceğimi merak ediyordum (bununla birlikte takip etmek için) Drupal 7 için, bunun yerine Simpletest?

PHPUnit'i Drupal 7 ile entegre etmek için herhangi bir yöntem veya modül var mı?

Orada gibi birkaçıdır PHPUnit veya drunit , ancak Drupal 7 için değil.


1
Sadece Behat'ı dışarı atmak istiyorum. Gerçek dünya test senaryoları yapmak için harika (gerçekten birim test değil): drupal.org/project/drupalextension Bir kez kurduktan sonra, Drupal işlevselliğini test etmeyi kolaylaştırır. Behat'ı bir CI ortamında çalıştırıyoruz ve seviyoruz!
donutdan4114

@ donutdan4114 Drupal ile bunu nasıl başardığınızı gösteren daha fazla bilgi veya öğretici bir video sunabilir misiniz? İlgimi çekiyor.
zkent

Yanıtlar:


11

Test dosyalarınızın her birinde Drupal'ı önyükleyerek PHPUnit testlerini çalıştırabilirsiniz. İdeal değil, ama işe yarıyor.

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
Bunu yapmanız gerekiyorsa, yazdığınız şey Birim Testler değildir ve muhtemelen SimpleTest tabanlı çekirdek test modülünden DrupalWebTestCase kullanmanız gerekir.
matt2000

@ matt2000 evet ve testler bitene kadar bekleyin ...
Codium

3

PHPUnit, nesneleri oluşturmak için güzel bir API sağlarken, Drupal'ın en basit olanı değildir. Orada Drupal 7 ile PHPUnit entegre ve özü mevcut bir kütüphane .
Bu komut dosyalarını yürütmek için bu gist deposunu kontrol etmeniz gerekir . Birim-Testleri komut satırında yürütmek için bir Drupal sitesine gidin (yani <DRUPAL_ROOT>/sites/default) ve phpunit komutunu kullandığınız gibi dphpunit.bash kullanın.

Komut dosyası 3 dosyadan oluşur:

  1. dphpunit.bash - sadece birkaç ekstra parametre ile drun-dphpunit.php'yi çağırır. PHP, sembolik bağlarla doğru bir şekilde başa çıkamayacağı için gereklidir.
  2. drun-dphpunit.php - temel olarak akış yukarı phpunit koşucusuyla aynıdır, ancak ekstra parametreyi işlemesi gerekir.
  3. bootstrap.inc.php - Drupal önyüklemeyi drush'a çok benzetir.

Kaynak: 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 ile Drupal 7 entegrasyonu için bir kütüphane daha mevcut: https://github.com/sebastianbergmann/phpunit

Bu komut dosyaları hakkında daha fazla bilgiyi buradan kontrol edebilirsiniz: http://thomaslattimore.com/blog/using-phpunit-with-drupal-7


5
Ne yazık ki, bu repo gitti.
sheldonkreger

2
-1 çünkü gist gitti.
cwallenpoole

1

Yapılandırma dosyasıyla ilgili bir geçici çözüm var.

  1. Drupal proje kökünde phpunit.xml.dist dosyası oluşturun . Bunu içermeli
<?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 bizim drupal örneğimizi önyüklemek zorunda. Drupal phpunit bootstrap dosyası oluşturun. Ben drupal_phpunit_bootstrap.php olarak adlandırmayı tercih ederim
<?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);

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

Bu kadar. Şimdi testlerinizi birkaç şekilde başlatabilirsiniz.

1. CLI

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

nerede:

  • -c : Yapılandırma dosyasını tanımlar.
  • QuestionValidationValueOptionsInputTest ve path : Test sınıfı adını ve yolunu tanımlar.

2. IDE (phpstorm)

Test çalıştırması yapılandırması eklemelisiniz

Test çalıştırması yapılandırması

Ve her testte drupal bootstrap kodunu eklemeye gerek yok.

Not

Ortamınızın yanlış php sürümü nedeniyle testlerde sorun yaşayabilirsiniz.

Daha fazla okuma:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.