Joomla 2.5 bileşeni nasıl test edilir


12

StackOverflow bu soruyu sordum ve burada sormak önerildi.

Birim / sistem / entegrasyon testine aşinayım ve Joomla bileşenimi test edebilmek istiyorum. Bunu yapmanın standart bir yolu var mı?

Testleri içermeyen bu joomla mvc bileşen örneği üzerinde çalışıyorum . Joomla belgelerinde ve çeşitli web sitelerinde bulabildiğim tek şey test kodu ve bootstrap.php dosyalarının parçaları. Özellikle bilmek istiyorum:

  • Bileşen test kodu nereye yerleştirilir
  • Kendi bootstrap.php dosyasını sağlamalı mıyım yoksa sadece 'joomla'yı dahil etmenin ve testlerimi çalıştırmanın bir yolu var mı?

İdeal olarak birisi beni nasıl çalıştıracağına dair test ve talimatlara sahip bir açık kaynak Joomla bileşenine yönlendirebilir (hızlı bir bakışa sahipti, ilk 5 ya da öylesine test yoktu).

En yakın bulduğum, bu benim kukla testime dayanıyorum.

Şimdiye kadar ne yaptım

Bileşen dizin yapısı:

  • Selam Dünya/
    • admin /
      • ...
      • testler /
        • bootstrap.php
        • phpunit.xml
        • modelHelloWorldsTest.php
    • Site /
      • ...
    • helloworld.xml

İlk girişim

Testleri çalıştırmak için bileşeni Joomla kurulumuma yüklerim / kopyalarım. Sonra ~ joomla / administration / components / com_helloworld / testing'den aşağıdaki komutu çalıştırıyorum:

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

ondan aldığım

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

Bu, bootstrap.php'nin doğru olmadığı ve gerekli Joomla sınıflarını yüklemediği anlamına gelir. Bunu bir noktada araştıracağım, ancak bu sadece bazı testlerin yapılması için bir sürü kurulum gibi görünüyor.

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>

İkinci deneme

Bu cevabı gördükten sonra testlerimi joomla kurulumumun altında test / birim altına koydum, joomla-cms deposundan phpunit.dist.xml ve bootstrap.php'yi uygun yerlerine kopyaladım ve hala

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

daha önce aldığım hata.

Yanıtlar:


3

Bileşen test kodu nereye yerleştirilir

Genellikle en iyi uygulamalar şunları söyler:

/src/
/tests/

Ama / src'yi atladım ve basitçe ama / testing / bileşen dizini içinde atladım. Ön uçta, "abc" bileşeni için şuna benzeyebilir:

/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

Kendi bootstrap.php dosyasını sağlamam gerekiyor mu

Yaptım. Bir çeşit. Kök index.php dosyasındaki güzellikleri birim test betiğimin en üstüne kopyaladım. Seninki benimkine yakındı. Bir sonraki adım, requir_once () olacak ayrı bir dosya içine kapsüllemek olacaktır.

<?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"));

    }
...

İdeal olarak birisi beni nasıl çalıştıracağına dair test ve talimatlara sahip bir açık kaynak Joomla bileşenine yönlendirebilir (hızlı bir bakışa sahipti, ilk 5 ya da öylesine test yoktu).

Kendi başıma yuvarlanmayı kolay buldum. Phpunit.xml dosyasını ayarlamak için bile uğraşmadım.


Sonunda bunu denemeye başladım (Joomla'yı uzun zamandır kullanmadım!). Hile yapıyor gibi görünüyor!
uozuAho

Bunu anladım Error: Call to undefined method JController::getInstance().
Olle Härstedt

6

Cevabım sorununuzu doğrudan ele almıyorsa özür dileriz, ancak Joomla hakkında konuşuyor olsak da olmasak da birim testinin ne olduğunu ve nasıl kullanılacağını anlamak önemlidir. Birçok konuyu ele aldınız ve hepsiyle başa çıkmak oldukça zor.

Her şeyden önce belgeleri okumak için önemlidir at PHPUnit . Kendinize küçük bir sınıf oluşturun (Joomla'dan bağımsız olarak) ve bunun için bazı testler yazmaya çalışın. PHPUnit'i ilk önce böyle bir senaryoda çalıştırın. Ne yaptığını anlayın. Korkarım ki gelişiminize nasıl yardımcı olduğunu anlamak yerine PHPUnit'i çalıştırmaya odaklanıyorsunuz.

Joomla'nın çalışmasını sağlamak için ihtiyacınız olacak:

  • bootstrap.php - size bir Joomla örneği verir.
  • phpunit.xml - PHPUnit ayarlarında ince ayar yapma. Örneğin, her bir bileşendeki test klasörlerinin olduğu bir projenin tamamı için bir kez belirtmek yararlıdır. Böylece bir dizi test yapabilirsiniz.

Aldığınız hata olabildiğince açık. 'ContentController' açıkça Joomla tarafından otomatik olarak yüklenmiyor. Bir hata ayıklayıcı ile Joomla'daki otomatik yükleyicinin çağrılıp çağrılmadığını ve sınıfın neden yüklenemediğini kontrol edin. En kötü senaryo, kendi otomatik yükleyicinizi sağlar ve çağırmak için bootstrap dosyasını kullanır. Hızlı bir düzeltme ayrıca gerekli dosyayı requir_once ile manuel olarak yüklüyor.

Neyi test etmek istediğinize karar verin ve maketler kullanın

Sağlanan örnekte, veritabanından veri almak için JModel kullanıyorsunuz. Bu, TDD açısından bir hareket etmiyor. Veritabanından veri alabileceğinizi sınamanın IMHO değeri yoktur. Orada tam olarak neyi test ediyorsunuz?

Veritabanındaki verilerle çalışmanız gerekiyorsa, veritabanından bir yanıt modellemek için alayları kullanın. Bu şekilde testleriniz zaman içinde tutarlı bir davranışa sahip olacaktır. Veritabanındaki bir şeyi değiştirdiğiniz için testlerin başarısız olmasını istemezsiniz.

Bir şeyi veya test etmek için mantıklı başka bir şeyi hesaplayan bir yönteminiz varsa. Bu birim testtir: karmaşık sisteminizden küçük bir birim alırsınız, sahte test verileriyle beslersiniz ve davranışını test edersiniz.

Sisteminizin bir bütün olarak çalıştığını görmeniz gerekir, sistem testlerini kullanın.


Üzgünüz ama bu cevap çok alakalı değil. Daha önce PHPUnit kullandım ve testin amacını anladım. Sadece testlerimi bile yürütmek için mücadele ediyorum. Sorumdaki test önemli değil, önemli kısmı çalıştığı. Sorumu daha net hale getirme umuduyla düzenledim.
uozuAho
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.