วิธีทดสอบส่วนประกอบ Joomla 2.5


12

ฉันได้ถามคำถามนี้กับStackOverflowและมีข้อเสนอแนะให้ฉันถามที่นี่

ฉันคุ้นเคยกับการทดสอบหน่วย / ระบบ / บูรณาการและต้องการที่จะสามารถทดสอบองค์ประกอบ Joomla ของฉัน มีวิธีมาตรฐานในการทำเช่นนี้หรือไม่?

ฉันกำลังทำงานผ่านตัวอย่างส่วนประกอบ joomla mvcซึ่งไม่รวมการทดสอบ ทั้งหมดที่ฉันสามารถพบได้ในเอกสารประกอบ Joomla และในเว็บไซต์ต่าง ๆ คือส่วนของรหัสทดสอบและไฟล์ bootstrap.php โดยเฉพาะสิ่งที่ฉันอยากรู้คือ:

  • รหัสการทดสอบส่วนประกอบจะอยู่ที่ไหน
  • ฉันต้องให้ bootstrap.php ของตัวเองหรือมีวิธีการเพียงแค่รวม 'joomla' และทำการทดสอบของฉัน

นึกคิดใครบางคนสามารถพาฉันไปยังส่วนประกอบ Joomla ที่มาเปิดที่มีการทดสอบ & คำแนะนำเกี่ยวกับวิธีการเรียกใช้พวกเขา (มีลักษณะอย่างรวดเร็ว, 5 คนแรกหรือดังนั้นจึงไม่มีการทดสอบ)

สิ่งที่ฉันพบมากที่สุดคือสิ่งนี้ซึ่งฉันได้ทำการทดสอบแบบหลอก ๆ

สิ่งที่ฉันทำไปแล้ว

โครงสร้างไดเรกทอรีส่วนประกอบ:

  • สวัสดีชาวโลก/
    • admin /
      • ...
      • การทดสอบ /
        • 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 repo ไปยังตำแหน่งที่เหมาะสมและยังคงได้

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 และเพียงแค่ / ทดสอบ / ภายในไดเรกทอรีองค์ประกอบ ที่ส่วนหน้าสำหรับองค์ประกอบ "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 ของตัวเอง

ฉันทำ. เรียงจาก ฉันเพิ่งคัดลอกสารพัดในไฟล์ root index.php ไปที่ด้านบนของสคริปต์ทดสอบหน่วยของฉัน คุณอยู่ใกล้กับฉัน ขั้นตอนต่อไปของฉันคือการห่อหุ้มเป็นไฟล์แยกต่างหากที่ฉันต้องการ require_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"));

    }
...

นึกคิดใครบางคนสามารถพาฉันไปยังส่วนประกอบ Joomla ที่มาเปิดที่มีการทดสอบ & คำแนะนำเกี่ยวกับวิธีการเรียกใช้พวกเขา (มีลักษณะอย่างรวดเร็ว, 5 คนแรกหรือดังนั้นจึงไม่มีการทดสอบ)

ฉันพบว่ามันง่ายพอที่จะม้วนตัวเอง ฉันไม่ได้รำคาญที่จะตั้งค่า phpunit.xml


ในที่สุดฉันก็ลองทำสิ่งนี้ (ไม่ได้ใช้ Joomla มานานแล้ว!) ดูเหมือนว่าจะทำเคล็ดลับ!
uozuAho

ฉันได้รับError: Call to undefined method JController::getInstance()สิ่งนี้
Olle Härstedt

6

ขออภัยถ้าคำตอบของฉันไม่ตรงกับปัญหาของคุณ แต่สิ่งสำคัญคือต้องเข้าใจว่าการทดสอบหน่วยคืออะไรและจะใช้อย่างไรไม่ว่าเราจะพูดถึง Joomla หรือไม่ คุณได้แก้ไขปัญหามากมายแล้วและค่อนข้างยากที่จะจัดการกับปัญหาทั้งหมด

ครั้งแรกของทั้งหมดมันเป็นสิ่งสำคัญที่จะอ่านเอกสารที่PHPUnit สร้างชั้นเรียนเล็ก ๆ (เป็นอิสระจาก Joomla) และลองเขียนแบบทดสอบ รับ PHPUnit ก่อนทำงานในสถานการณ์ดังกล่าว ทำความเข้าใจกับสิ่งที่มันทำ ฉันเกรงว่าคุณจะให้ความสำคัญกับการเรียกใช้ PHPUnit แทนที่จะเข้าใจว่ามันช่วยการพัฒนาของคุณอย่างไร

ในการทำให้ Joomla ทำงานคุณจะต้อง:

  • bootstrap.php - ซึ่งจะให้ตัวอย่างของ Joomla
  • phpunit.xml - ปรับการตั้งค่า PHPUnit อย่างละเอียด มีประโยชน์สำหรับตัวอย่างของการระบุหนึ่งครั้งสำหรับโครงการทั้งหมดที่มีโฟลเดอร์ทดสอบในแต่ละองค์ประกอบ เพื่อให้คุณสามารถรันชุดการทดสอบ

ข้อผิดพลาดที่คุณได้รับนั้นชัดเจนที่สุด 'ContentController' ไม่ถูกโหลดอัตโนมัติโดย Joomla ตรวจสอบกับผู้ดีบั๊กว่ามีการเรียกใช้โหลดอัตโนมัติใน Joomla หรือไม่และทำไมจึงไม่สามารถโหลดคลาสได้ สถานการณ์กรณีที่เลวร้ายที่สุดให้ autoloader ของคุณเองและใช้ไฟล์ bootstrap เพื่อเรียกมัน การแก้ไขอย่างรวดเร็วยังทำการโหลดไฟล์ที่ต้องการด้วย require_once ด้วยตนเอง

ตัดสินใจเลือกสิ่งที่คุณต้องการทดสอบและใช้งานจำลอง

ในตัวอย่างที่ให้มาคุณกำลังใช้ JModel เพื่อดึงข้อมูลจากฐานข้อมูล นี่คือไม่ต้องไปจากมุมมองของ TDD การทดสอบที่คุณสามารถดึงข้อมูลจากฐานข้อมูลนั้นไม่มีค่า IMHO คุณกำลังทดสอบอะไรอยู่ที่นั่น

หากคุณต้องการทำงานกับข้อมูลจากฐานข้อมูลให้ใช้ mocks เพื่อสร้างแบบจำลองการตอบสนองจากฐานข้อมูล วิธีนี้การทดสอบของคุณจะมีพฤติกรรมที่สอดคล้องกันตลอดเวลา คุณไม่ต้องการล้มเหลวในการทดสอบเพียงเพราะคุณเปลี่ยนแปลงบางสิ่งในฐานข้อมูล

หากคุณมีวิธีการคำนวณอะไรสักอย่างหรืออย่างอื่นที่มีเหตุผลในการทดสอบ นี่คือการทดสอบหน่วย: คุณใช้หน่วยเล็ก ๆ จากระบบที่ซับซ้อนของคุณป้อนด้วยข้อมูลทดสอบปลอมและทดสอบพฤติกรรมของมัน

ต้องดูว่าระบบของคุณทำงานโดยรวมใช้การทดสอบระบบ


ขออภัยคำตอบนี้ไม่เกี่ยวข้องมาก ฉันเคยใช้ PHPUnit มาก่อนและเข้าใจจุดทดสอบ ฉันแค่พยายามดิ้นรนเพื่อให้การทดสอบของฉันทำงานได้ การทดสอบในคำถามของฉันไม่สำคัญส่วนสำคัญคือการทดสอบ ฉันได้แก้ไขคำถามของฉันโดยหวังว่าจะทำให้ชัดเจนขึ้น
uozuAho
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.