Cách kiểm tra thành phần Joomla 2.5


12

Tôi đã hỏi câu hỏi này trên StackOverflow và được gợi ý rằng tôi hỏi nó ở đây.

Tôi quen thuộc với thử nghiệm đơn vị / hệ thống / tích hợp và muốn có thể kiểm tra thành phần Joomla của tôi. Có một cách tiêu chuẩn để làm điều này?

Tôi đang làm việc thông qua ví dụ thành phần mvc j Joomla này , không bao gồm các bài kiểm tra. Tất cả những gì tôi có thể tìm thấy trong tài liệu Joomla và trên các trang web khác nhau là các đoạn mã kiểm tra & tệp bootstrap.php. Cụ thể những gì tôi muốn biết là:

  • Nơi đặt mã kiểm tra thành phần
  • Tôi có cần phải cung cấp bootstrap.php của riêng mình không, hoặc có một số cách để chỉ 'bao gồm j Joomla' và chạy thử nghiệm của tôi

Lý tưởng nhất là ai đó có thể hướng tôi đến một thành phần Joomla nguồn mở có các bài kiểm tra & hướng dẫn về cách chạy chúng (có một cái nhìn nhanh, 5 hoặc trước đó không có các bài kiểm tra).

Gần nhất tôi đã tìm thấy là cái này , mà tôi đã dựa trên bài kiểm tra giả của tôi.

Những gì tôi đã làm cho đến nay

Cấu trúc thư mục thành phần:

  • Chào thế giới/
    • quản trị viên/
      • ...
      • kiểm tra /
        • bootstrap.php
        • phpunit.xml
        • modelHelloWorldsTest.php
    • Địa điểm/
      • ...
    • hellowworld.xml

Lần thử đầu tiên

Để chạy thử nghiệm, tôi cài đặt / sao chép thành phần vào bản cài đặt Joomla của mình. Sau đó tôi chạy lệnh sau từ ~ j Joomla / quản trị / thành phần / com_helloworld / tests:

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

từ đó tôi nhận được

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

Tôi thu thập điều này có nghĩa là bootstrap.php của tôi không đúng và chưa tải các lớp Joomla cần thiết. Tôi sẽ điều tra điều này tại một số điểm, nhưng có vẻ như rất nhiều thiết lập chỉ để chạy một số thử nghiệm.

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';

mô hìnhHelloWorldsTest.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>

Lần thử thứ hai

Sau khi thấy câu trả lời này , tôi đặt các bài kiểm tra của mình dưới bài kiểm tra / đơn vị trong phần cài đặt j Joomla của tôi, sao chép phpunit.dist.xml và bootstrap.php từ repo j Joomla-cms đến các vị trí thích hợp của chúng và vẫn nhận được

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

lỗi tôi đã nhận được trước đây.

Câu trả lời:


3

Nơi đặt mã kiểm tra thành phần

Thông thường thực hành tốt nhất nói:

/src/
/tests/

Nhưng tôi đã bỏ qua / src và chỉ đơn giản là / tests / bên trong thư mục thành phần. Ở mặt trước, đối với thành phần "abc", nó có thể trông giống như:

/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

Tôi có cần cung cấp bootstrap.php của riêng mình không

Tôi đã làm. Sắp xếp Tôi chỉ sao chép các goodies trong tập tin index.php gốc vào đầu tập lệnh kiểm tra đơn vị của tôi. Bạn đã gần gũi với tôi. Bước tiếp theo của tôi sẽ là gói gọn vào một tệp riêng mà tôi sẽ yêu cầu_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"));

    }
...

Lý tưởng nhất là ai đó có thể hướng tôi đến một thành phần Joomla nguồn mở có các bài kiểm tra & hướng dẫn về cách chạy chúng (có một cái nhìn nhanh, 5 hoặc trước đó không có các bài kiểm tra).

Tôi thấy nó đủ dễ dàng để cuộn của riêng tôi. Tôi thậm chí không bận tâm đến việc thiết lập phpunit.xml.


Cuối cùng tôi cũng đã thử dùng nó (đã không sử dụng Joomla trong một thời gian dài rồi!). Có vẻ để làm các mẹo!
uozuAho

Tôi nhận được Error: Call to undefined method JController::getInstance()cho điều này.
Olle Härstedt

6

Xin lỗi nếu câu trả lời của tôi không trực tiếp giải quyết vấn đề của bạn, nhưng điều quan trọng là phải hiểu thử nghiệm đơn vị là gì và làm thế nào để sử dụng nó, bất kể chúng ta có nói về Joomla hay không. Bạn đã giải quyết rất nhiều vấn đề và thật khó để giải quyết tất cả chúng.

Trước hết, điều quan trọng là phải đọc tài liệu tại PHPUnit . Xây dựng cho mình một lớp nhỏ (độc lập với Joomla) và cố gắng viết một số bài kiểm tra cho nó. Nhận PHPUnit đầu tiên chạy trong một kịch bản như vậy. Hiểu những gì nó làm. Tôi e rằng bạn đang tập trung quá nhiều vào việc khiến PHPUnit chạy thay vì hiểu nó giúp ích cho sự phát triển của bạn như thế nào.

Để chạy Joomla , bạn sẽ cần:

  • bootstrap.php - sẽ cung cấp cho bạn một phiên bản của Joomla.
  • phpunit.xml - tinh chỉnh cài đặt PHPUnit. Hữu ích ví dụ về việc chỉ định một lần cho toàn bộ dự án trong đó các thư mục thử nghiệm trong mỗi thành phần. Vì vậy, bạn có thể chạy một bộ các bài kiểm tra.

Lỗi mà bạn đang nhận được càng rõ ràng càng tốt. 'ContentContoder' rõ ràng không được tải tự động bởi Joomla. Kiểm tra với trình gỡ lỗi nếu trình tải tự động trong Joomla được gọi và tại sao nó không tải được lớp. Trường hợp xấu nhất cung cấp trình tải tự động của riêng bạn và sử dụng tệp bootstrap để gọi nó. Một bản sửa lỗi nhanh cũng đang tải thủ công tệp yêu cầu với allow_once.

Quyết định những gì bạn muốn kiểm tra và sử dụng mockup

Trong ví dụ với điều kiện bạn đang sử dụng JModel để lấy dữ liệu từ cơ sở dữ liệu. Đây là điều không nên từ quan điểm TDD. Kiểm tra rằng bạn có thể tìm nạp dữ liệu từ cơ sở dữ liệu không có giá trị IMHO. Chính xác những gì bạn đang thử nghiệm ở đó?

Nếu bạn cần làm việc với dữ liệu từ cơ sở dữ liệu, hãy sử dụng giả để mô hình hóa phản hồi từ cơ sở dữ liệu. Bằng cách này, bài kiểm tra của bạn sẽ có một hành vi nhất quán theo thời gian. Bạn không muốn thử nghiệm thất bại chỉ vì bạn đã thay đổi một cái gì đó trong cơ sở dữ liệu.

Nếu bạn có một phương pháp tính toán đôi khi hoặc bất cứ điều gì có ý nghĩa để kiểm tra. Đây là thử nghiệm đơn vị: bạn lấy một đơn vị nhỏ từ hệ thống phức tạp của mình, cung cấp cho nó dữ liệu thử nghiệm giả và kiểm tra hành vi của nó.

Cần phải thấy rằng hệ thống của bạn hoạt động như một toàn thể, sử dụng các bài kiểm tra hệ thống.


Xin lỗi nhưng câu trả lời này không liên quan lắm. Tôi đã sử dụng PHPUnit trước đây và hiểu điểm kiểm tra. Tôi chỉ đang vật lộn để có được bài kiểm tra của mình để chạy. Bài kiểm tra trong câu hỏi của tôi không quan trọng, phần quan trọng là nó chạy. Tôi đã chỉnh sửa câu hỏi của mình với hy vọng làm cho điều này rõ ràng hơn.
uozuAho
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.