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
- admin /
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.
sumber
Error: Call to undefined method JController::getInstance()
.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:
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.
sumber