Joomla 2.5 구성 요소를 테스트하는 방법


12

StackOverflow 에서이 질문을 했으며 여기에서 묻는 것이 좋습니다.

단위 / 시스템 / 통합 테스트에 익숙하며 Joomla 구성 요소를 테스트하고 싶습니다. 이 작업을 수행하는 표준 방법이 있습니까?

테스트를 포함하지 않는 이 joomla mvc 구성 요소 예제를 통해 작업하고 있습니다. Joomla 문서와 다양한 웹 사이트에서 찾을 수있는 것은 테스트 코드 및 bootstrap.php 파일의 조각입니다. 구체적으로 알고 싶은 것은 :

  • 구성 요소 테스트 코드를 넣을 위치
  • 내 자신의 bootstrap.php를 제공해야합니까, 아니면 'joomla를 포함'하고 테스트를 실행하는 방법이 있습니까

이상적으로 누군가 나를 오픈 소스 Joomla 구성 요소로 안내 할 수 있습니다.이 구성 요소를 실행하는 방법에 대한 테스트 및 지침이 있습니다.

내가 찾은 가장 가까운 것은 이것 입니다. 내 더미 테스트를 기반으로했습니다.

내가 지금까지 한 일

구성 요소 디렉토리 구조 :

  • helloworld /
    • 관리자/
      • ...
      • 테스트 /
        • bootstrap.php
        • phpunit.xml
        • modelHelloWorldsTest.php
    • 대지/
      • ...
    • helloworld.xml

첫번째 시도

테스트를 실행하려면 구성 요소를 Joomla 설치에 설치 / 복사합니다. 그런 다음 ~ joomla / administration / components / com_helloworld / tests에서 다음 명령을 실행합니다.

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

내가받는 곳

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

나는 이것이 bootstrap.php가 정확하지 않고 필요한 Joomla 클래스를로드하지 않았다는 것을 의미합니다. 나는 이것을 어느 시점에서 조사 할 것이지만 이것은 테스트를 실행하기위한 많은 설정처럼 보입니다.

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>

두 번째 시도

이 답변 후 , 테스트를 내 joomla 설치에서 테스트 / 단위로 설정하고 phpunit.dist.xml 및 bootstrap.php를 joomla-cms 저장소에서 적절한 위치로 복사했지만 여전히

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

내가 전에받은 오류.

답변:


3

구성 요소 테스트 코드를 넣을 위치

일반적으로 모범 사례는 다음과 같습니다.

/src/
/tests/

그러나 / src를 건너 뛰고 구성 요소 디렉토리 내부의 / tests /를 간단히 건너 뛰었습니다. 프런트 엔드에서 "abc"구성 요소의 경우 다음과 같이 보일 수 있습니다.

/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

내 자신의 bootstrap.php를 제공해야합니까?

나는했다. 일종의. 방금 루트 index.php 파일의 장점을 단위 테스트 스크립트의 맨 위에 복사했습니다. 당신은 내 근처에 있었다. 다음 단계는 필자가 필요로하는 별도의 파일로 캡슐화하는 것입니다.

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

    }
...

이상적으로 누군가 나를 오픈 소스 Joomla 구성 요소로 안내 할 수 있습니다.이 구성 요소를 실행하는 방법에 대한 테스트 및 지침이 있습니다.

나는 내 자신을 굴리는 것이 쉽다는 것을 알았다. phpunit.xml을 설정하지 않아도됩니다.


나는 마침내 이것을 시험해 보았습니다 (오랫 동안 Joomla를 사용하지 않았습니다!). 트릭을 수행하는 것 같습니다!
uozuAho

나는 이것을 얻는다 Error: Call to undefined method JController::getInstance().
Olle Härstedt

6

내 답변으로 문제를 직접 해결하지 못하면 죄송하지만 Joomla에 대해 이야기하고 있는지 여부에 관계없이 단위 테스트의 의미와 사용 방법을 이해하는 것이 중요합니다. 많은 문제를 해결했으며 모든 문제를 다루기가 다소 어렵습니다.

먼저이 문서를 읽는 것이 중요하다 에서 phpunit을을 . 작은 클래스 (Jomla와 독립적으로)를 구축하고 이에 대한 몇 가지 테스트를 작성해보십시오. 이러한 시나리오에서 PHPUnit을 먼저 실행하십시오. 그것이 무엇을 이해합니다. PHPUnit이 개발에 어떻게 도움이되는지 이해하는 대신 PHPUnit을 실행시키는 데 너무 집중하고 있습니다.

Joomla를 실행하려면 다음이 필요합니다.

  • bootstrap.php-Joomla의 인스턴스를 제공합니다.
  • phpunit.xml-PHPUnit 설정 미세 조정 예를 들어 각 구성 요소의 테스트 폴더가있는 전체 프로젝트에 대해 한 번만 지정하면 유용합니다. 일련의 테스트를 실행할 수 있습니다.

당신이 얻는 오류는 가능한 한 분명합니다. Joomla는 'ContentController'를 자동으로로드하지 않습니다. Joomla의 오토로더가 호출되고 클래스를로드하지 못하는 이유는 디버거와 확인하십시오. 최악의 시나리오는 자체 오토로더를 제공하고 부트 스트랩 파일을 사용하여 호출합니다. 빠른 수정은 require_once를 사용하여 필요한 파일을 수동으로로드하는 것입니다.

테스트 할 모형을 결정하고 모형을 사용하십시오.

제공된 예제에서 JModel을 사용하여 데이터베이스에서 데이터를 페치합니다. 이것은 TDD 관점에서 볼 수있는 것이 아닙니다. 데이터베이스에서 데이터를 페치 할 수 있다는 테스트에는 IMHO 값이 없습니다. 정확히 무엇을 테스트하고 있습니까?

데이터베이스의 데이터로 작업해야하는 경우 모형을 사용하여 데이터베이스의 응답을 모델링하십시오. 이런 식으로 테스트는 시간이 지남에 따라 일관된 동작을합니다. 데이터베이스에서 무언가를 변경했기 때문에 테스트에 실패한 것을 원하지 않습니다.

테스트해야 할 무언가 또는 다른 것을 계산하는 방법이 있다면. 이것은 단위 테스트입니다. 복잡한 시스템에서 작은 단위를 가져 와서 가짜 테스트 데이터를 공급하고 동작을 테스트하십시오.

시스템이 전체적으로 작동하는지 확인하고 시스템 테스트를 사용하십시오.


죄송하지만이 답변은 관련이 없습니다. 전에 PHPUnit을 사용해 보았고 테스트 시점을 이해했습니다. 테스트를 실행하기 위해 고심하고 있습니다. 내 질문에 대한 테스트는 중요하지 않으며 중요한 부분은 테스트가 실행된다는 것입니다. 이것을 명확하게하기 위해 내 질문을 편집했습니다.
uozuAho
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.