जूमला 2.5 घटक का परीक्षण कैसे करें


12

मैंने StackOverflow पर यह प्रश्न पूछा है , और यह सुझाव दिया गया था कि मैं इसे यहाँ पूछता हूँ।

मैं इकाई / प्रणाली / एकीकरण परीक्षण से परिचित हूं, और अपने जूमला घटक का परीक्षण करने में सक्षम होना चाहूंगा। क्या ऐसा करने का एक मानक तरीका है?

मैं इस जूमला पीवीसी घटक उदाहरण के माध्यम से काम कर रहा हूं , जिसमें परीक्षण शामिल नहीं हैं। सभी मुझे जूमला प्रलेखन में और विभिन्न वेबसाइटों पर परीक्षण कोड और बूटस्ट्रैप.php फ़ाइलों के टुकड़े मिल सकते हैं। विशेष रूप से मैं जो जानना चाहता हूं वह है:

  • घटक परीक्षण कोड कहां रखा जाए
  • क्या मुझे अपना स्वयं का बूटस्ट्रैप देने की जरूरत है। एफपी, या सिर्फ 'जूमला शामिल करें' और अपने परीक्षण चलाने का कोई तरीका है

आदर्श रूप से कोई मुझे एक ओपन सोर्स जूमला घटक के लिए निर्देशित कर सकता है जिसमें उन्हें चलाने के लिए परीक्षण और निर्देश हैं (एक त्वरित नज़र, पहले 5 या तो परीक्षण नहीं थे)।

निकटतम मैंने पाया जाता है यह , जो मैं पर मेरे डमी परीक्षण आधारित है।

मैंने अब तक क्या किया है

घटक निर्देशिका संरचना:

  • नमस्ते दुनिया/
    • व्यवस्थापक/
      • ...
      • परीक्षण /
        • bootstrap.php
        • phpunit.xml
        • modelHelloWorldsTest.php
    • साइट /
      • ...
    • helloworld.xml

पहला प्रयास

परीक्षण चलाने के लिए, मैं अपने जूमला इंस्टॉलेशन के घटक को स्थापित / कॉपी करता हूं। फिर मैं ~ joomla / प्रशासन / घटकों / com_helloworld / परीक्षणों से निम्नलिखित कमांड चलाता हूं:

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

मेरा यह मतलब है कि मेरा बूटस्ट्रैप.php सही नहीं है और आवश्यक जूमला कक्षाओं को लोड नहीं किया है। मैं कुछ बिंदु पर इसकी जांच करूँगा, लेकिन यह बहुत सेटअप की तरह लगता है कि बस चलाने के लिए कुछ परीक्षण प्राप्त करने के लिए।

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>

दूसरा प्रयास

इस उत्तर को देखने के बाद , मैंने अपने परीक्षण को अपने जूमला इंस्टालेशन के तहत टेस्ट / यूनिट में रखा, कॉपी की गई 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 को छोड़ दिया और बस लेकिन / परीक्षण / घटक निर्देशिका के अंदर। सामने के छोर पर, "एबीसी" घटक के लिए, यह कुछ इस तरह दिख सकता है:

/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

क्या मुझे अपना स्वयं का बूटस्ट्रैप प्रदान करने की आवश्यकता है

मैंने किया। की तरह। मैंने बस अपने यूनिट परीक्षण स्क्रिप्ट के शीर्ष पर रूट 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"));

    }
...

आदर्श रूप से कोई मुझे एक ओपन सोर्स जूमला घटक के लिए निर्देशित कर सकता है जिसमें उन्हें चलाने के लिए परीक्षण और निर्देश हैं (एक त्वरित नज़र, पहले 5 या तो परीक्षण नहीं थे)।

मुझे अपना रोल करना काफी आसान लगा। मैंने phpunit.xml स्थापित करने की भी जहमत नहीं उठाई।


मैं आखिरकार इसे आज़माने के लिए तैयार हो गया (अब लंबे समय में जुमला का इस्तेमाल नहीं किया है!)। चालबाजी करने लगता है!
uozuAho

मैं इसके लिए मिलता हूं Error: Call to undefined method JController::getInstance()
ओलले हर्स्टेड

6

क्षमा करें यदि मेरा उत्तर सीधे आपके मुद्दे को संबोधित नहीं करता है, लेकिन यह समझना महत्वपूर्ण है कि इकाई परीक्षण क्या है और इसका उपयोग कैसे करना है, इससे कोई फर्क नहीं पड़ता कि हम जूमला के बारे में बात कर रहे हैं या नहीं। आपने बहुत सारे मुद्दों को संबोधित किया है और उन सभी से निपटना कठिन है।

सबसे पहले PHPUnit पर प्रलेखन पढ़ना महत्वपूर्ण है । अपने आप को एक छोटा वर्ग बनाएं (स्वतंत्र रूप से जूमला) और इसके लिए कुछ परीक्षण लिखने का प्रयास करें। PHPUnit को पहले ऐसे परिदृश्य में चलाएं। समझें कि यह क्या करता है। मुझे डर है कि आप PHPUnit को समझने के बजाय चलाने के लिए बहुत अधिक ध्यान केंद्रित कर रहे हैं कि यह आपके विकास में कैसे मदद करता है।

जूमला को चलाने के लिए , आपको आवश्यकता होगी:

  • bootstrap.php - जो आपको जूमला का एक उदाहरण देगा।
  • phpunit.xml - ठीक ट्यूनिंग PHPUnit सेटिंग्स। एक पूरे प्रोजेक्ट के लिए एक बार निर्दिष्ट करने के उदाहरण के लिए उपयोगी जहां प्रत्येक घटक में परीक्षण फ़ोल्डर हैं। ताकि आप परीक्षणों का एक सूट चला सकें।

आपको जो त्रुटि हो रही है वह यथासंभव स्पष्ट है। 'ContentController' स्पष्ट रूप से जूमला द्वारा ऑटोलॉइड नहीं है। एक डिबगर से जांचें कि क्या जूमला में ऑटोलैडर को बुलाया गया है और यह कक्षा को लोड करने में विफल क्यों है। सबसे खराब स्थिति में अपना स्वयं का ऑटोलैडर प्रदान करें और इसे कॉल करने के लिए बूटस्ट्रैप फ़ाइल का उपयोग करें। एक त्वरित फिक्स मैन्युअल रूप से आवश्यक फ़ाइल को जरूरी_ऑन के साथ लोड कर रहा है।

तय करें कि आप मॉकअप का परीक्षण और उपयोग क्या करना चाहते हैं

उदाहरण में, आप डेटाबेस से डेटा लाने के लिए JModel का उपयोग कर रहे हैं। यह TDD के दृष्टिकोण से एक नो-गो है। परीक्षण है कि आप डेटाबेस से डेटा प्राप्त कर सकते हैं कोई मूल्य IMHO है। आप वास्तव में वहां क्या परीक्षण कर रहे हैं?

यदि आपको डेटाबेस से डेटा के साथ काम करने की आवश्यकता है, तो डेटाबेस से प्रतिक्रिया के लिए मॉडल का उपयोग करें। इस तरह आपके परीक्षणों में समय के साथ एक सुसंगत व्यवहार होगा। आप केवल परीक्षण में असफल होना नहीं चाहते हैं क्योंकि आपने डेटाबेस में कुछ बदल दिया है।

यदि आपके पास एक ऐसी विधि है जो किसी चीज़ या अन्य चीज़ों की गणना करती है जिसमें परीक्षण करने की भावना है। यह इकाई परीक्षण है: आप अपने जटिल सिस्टम से एक छोटी इकाई लेते हैं, इसे नकली परीक्षण डेटा के साथ खिलाते हैं और यह व्यवहार का परीक्षण करते हैं।

यह देखने की जरूरत है कि आपका सिस्टम पूरी तरह से काम करता है, सिस्टम परीक्षणों का उपयोग करें।


क्षमा करें, लेकिन यह उत्तर बहुत प्रासंगिक नहीं है। मैंने पहले PHPUnit का उपयोग किया है, और परीक्षण के बिंदु को समझता हूं। मैं सिर्फ अपनी परीक्षा देने के लिए संघर्ष कर रहा हूं। मेरे प्रश्न में परीक्षा महत्वपूर्ण नहीं है, महत्वपूर्ण बात यह है कि यह चलता है। मैंने इस प्रश्न को स्पष्ट करने की आशा में अपना प्रश्न संपादित किया है।
uozuAho
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.