Cara menguji komponen Joomla 2.5

12

Saya telah menanyakan pertanyaan ini di StackOverflow , dan disarankan agar saya bertanya di sini.

Saya akrab dengan pengujian unit / sistem / integrasi, dan ingin dapat menguji komponen Joomla saya. Apakah ada cara standar untuk melakukan ini?

Saya sedang mengerjakan contoh komponen joomla mvc ini , yang tidak termasuk tes. Yang bisa saya temukan di dokumentasi Joomla dan di berbagai situs web adalah fragmen kode uji & file bootstrap.php. Khususnya apa yang ingin saya ketahui adalah:

  • Di mana menempatkan kode uji komponen
  • Apakah saya perlu memberikan bootstrap.php saya sendiri, atau adakah cara untuk hanya 'memasukkan joomla' dan menjalankan tes saya

Idealnya seseorang dapat mengarahkan saya ke komponen Joomla open source yang memiliki tes & instruksi tentang cara menjalankannya (melihat sekilas, pertama 5 atau lebih tidak memiliki tes).

Yang paling dekat yang saya temukan adalah ini , yang menjadi dasar pengujian dummy saya.

Apa yang telah saya lakukan sejauh ini

Struktur direktori komponen:

  • Halo Dunia/
    • admin /
      • ...
      • tes /
        • bootstrap.php
        • phpunit.xml
        • modelHelloWorldsTest.php
    • situs /
      • ...
    • helloworld.xml

Percobaan pertama

Untuk menjalankan tes, saya menginstal / menyalin komponen ke instalasi Joomla saya. Saya kemudian menjalankan perintah berikut dari ~ joomla / administration / components / com_helloworld / tests:

php phpunit-4.2.phar --bootstrap bootstrap.php .

dari mana saya terima

Fatal error: Class 'ContentController' not found in C:\inetpub\wwwroot\ws_cairnstest\administrator\components\com_helloworld\tests\modelsHelloWorldsTest.php on line 5

Saya mengumpulkan ini berarti bootstrap.php saya tidak benar dan belum memuat kelas Joomla yang diperlukan. Saya akan menyelidiki ini di beberapa titik, tetapi ini sepertinya banyak pengaturan hanya untuk mendapatkan beberapa tes untuk dijalankan.

bootstrap.php:

<?php
error_reporting(E_ALL);

define('_JEXEC', 1);
define('BASEPATH',realpath(dirname(__FILE__).'/../../'));
define('JOOMLA_PATH',realpath(dirname(__FILE__).'/../../../../../'));
define('JOOMLA_ADMIN_PATH',realpath(dirname(__FILE__).'/../../../../'));
$_SERVER['HTTP_HOST'] = 'localhost';
$_SERVER['REQUEST_METHOD'] = 'GET';

if (file_exists(JOOMLA_ADMIN_PATH . '/defines.php'))
{
    include_once JOOMLA_ADMIN_PATH . '/defines.php';
}

if (!defined('_JDEFINES'))
{
    define('JPATH_BASE', JOOMLA_ADMIN_PATH);
    require_once JPATH_BASE . '/includes/defines.php';
}

require_once JPATH_BASE . '/includes/framework.php';
require_once JPATH_BASE . '/includes/helper.php';
require_once JPATH_BASE . '/includes/toolbar.php';
define('JPATH_COMPONENT',JOOMLA_ADMIN_PATH.'/components/com_content');
$app = JFactory::getApplication('administrator');
include BASEPATH.'/controller.php';

modelsHelloWorldsTest.php:

<?php
class HelloWorldsTest extends \PHPUnit_Framework_TestCase {

    public function testList(){
        $c = new ContentController();
        $model = $c->getModel('helloworlds');
        $worlds = $model->getItems();
        var_dump($worlds);
        $this->assertNotEmpty($worlds);
    }
}

phpunit.xml:

<phpunit bootstrap="bootstrap.php"
    colors="true"
    convertErrorsToExceptions="true"
    convertNoticesToExceptions="true"
    convertWarningsToExceptions="true"
    processIsolation="false"
    stopOnFailure="false"
    syntaxCheck="false"
    verbose="true">
</phpunit>

Usaha kedua

Setelah melihat jawaban ini , saya meletakkan tes saya di bawah test / unit di bawah instalasi joomla saya, menyalin phpunit.dist.xml dan bootstrap.php dari repo joomla-cm ke lokasi yang sesuai, dan masih mendapatkan

Fatal error: Class 'ContentController' not found in C:\inetpub\wwwroot\ws_cairnstest\administrator\components\com_helloworld\tests\modelsHelloWorldsTest.php on line 5

kesalahan yang saya terima sebelumnya.

uozuAho
sumber

Jawaban:

3

Di mana menempatkan kode uji komponen

Praktik terbaik biasanya mengatakan:

/src/
/tests/

Tapi saya melewatkan / src dan hanya tetapi / tes / di dalam direktori komponen. Di ujung depan, untuk komponen "abc", mungkin terlihat seperti:

/components/com_abc/
/components/com_abc/abc.php
/components/com_abc/controller.php
/components/com_abc/router.php
/components/com_abc/tests/
/components/com_abc/tests/controllerTest.php

Apakah saya perlu memberikan bootstrap.php saya sendiri

Aku melakukannya. Semacam. Saya baru saja menyalin barang dalam file index.php root ke bagian atas skrip tes unit saya. Milikmu dekat dengan milikku. Langkah saya selanjutnya adalah merangkum ke dalam file terpisah yang saya butuhkan_once ().

<?php

error_reporting(E_ALL);

define('_JEXEC', 1);
define('_PHPUNIT', 1);
define('JPATH_BASE', "/var/www/html/abcsite");

require_once JPATH_BASE . '/includes/defines.php';
require_once JPATH_BASE . '/includes/framework.php';

// Instantiate the application.
$app = JFactory::getApplication('site');

// Include dependancies
require_once '../controller.php';

// This is specific to this component
define('JPATH_COMPONENT', JPATH_BASE . "/components/com_abc");

class controllerTest extends PHPUnit_Framework_TestCase
{
    public function testCronjob()
    {

        // Need access to the controller
        $controller = JController::getInstance('Abc');

        // Should return
        $this->assertEquals('test', $controller->execute("cronjob"));

    }
...

Idealnya seseorang dapat mengarahkan saya ke komponen Joomla open source yang memiliki tes & instruksi tentang cara menjalankannya (melihat sekilas, pertama 5 atau lebih tidak memiliki tes).

Saya merasa cukup mudah untuk menggulung sendiri. Saya bahkan tidak mau repot-repot mengatur phpunit.xml.

Nada Garot
sumber
Saya akhirnya mencoba ini (belum menggunakan Joomla dalam waktu lama sekarang!). Tampaknya melakukan trik!
uozuAho
Saya mengerti Error: Call to undefined method JController::getInstance().
Olle Härstedt
6

Maaf jika jawaban saya tidak secara langsung membahas masalah Anda, tetapi penting untuk memahami apa pengujian unit dan bagaimana menggunakannya, tidak masalah apakah kita berbicara tentang Joomla atau tidak. Anda telah mengatasi banyak masalah dan agak sulit untuk berurusan dengan semuanya.

Pertama-tama, penting untuk membaca dokumentasi di PHPUnit . Bangun sendiri kelas kecil (terlepas dari Joomla) dan cobalah menulis beberapa tes untuknya. Dapatkan PHPUnit pertama berjalan dalam skenario seperti itu. Pahami apa yang dilakukannya. Saya khawatir Anda terlalu fokus untuk menjalankan PHPUnit alih-alih memahami bagaimana ini membantu perkembangan Anda.

Untuk menjalankan Joomla , Anda perlu:

  • bootstrap.php - yang akan memberi Anda contoh Joomla.
  • phpunit.xml - fine tuning pengaturan PHPUnit. Berguna misalnya menentukan satu kali untuk seluruh proyek di mana folder uji di setiap komponen. Sehingga Anda dapat menjalankan serangkaian tes.

Kesalahan yang Anda dapatkan sejelas mungkin. 'ContentController' jelas tidak dimuat secara otomatis oleh Joomla. Periksa dengan debugger jika autoloader di Joomla dipanggil dan mengapa gagal memuat kelas. Skenario kasus terburuk menyediakan autoloader Anda sendiri dan gunakan file bootstrap untuk menyebutnya. Perbaikan cepat juga memuat file yang diperlukan secara manual dengan require_once.

Putuskan apa yang ingin Anda uji dan gunakan maket

Dalam contoh yang disediakan Anda menggunakan JModel untuk mengambil data dari database. Ini adalah larangan dari sudut pandang TDD. Menguji bahwa Anda dapat mengambil data dari database tidak memiliki nilai IMHO. Apa sebenarnya yang Anda uji di sana?

Jika Anda perlu bekerja dengan data dari database, gunakan tiruan untuk memodelkan respons dari database. Dengan cara ini tes Anda akan memiliki perilaku yang konsisten dari waktu ke waktu. Anda tidak ingin memiliki tes yang gagal hanya karena Anda mengubah sesuatu di database.

Jika Anda memiliki metode yang menghitung sesuatu atau hal lain yang masuk akal untuk diuji. Ini adalah pengujian unit: Anda mengambil unit kecil dari sistem kompleks Anda, mengisinya dengan data uji palsu dan menguji perilaku itu.

Perlu melihat bahwa sistem Anda berfungsi secara keseluruhan, gunakan tes sistem.

Valentin Despa
sumber
Maaf tapi jawaban ini tidak terlalu relevan. Saya telah menggunakan PHPUnit sebelumnya, dan memahami titik pengujian. Saya hanya berjuang untuk menjalankan tes saya. Tes dalam pertanyaan saya tidak penting, yang penting adalah itu berjalan. Saya telah mengedit pertanyaan saya dengan harapan membuat ini lebih jelas.
uozuAho