Автоматические тесты для расширений


Начиная с версии QS 5, можно создавать автоматические тесты для расширений.

Правила:
– тесты должны лежать в папке tests расширения. Файлов с тестами может быть несколько.
Пример можно найти в AdvOntology

Запуск:
– для расширения, имеющего тесты, в Панели адиминистратора появится кнопка «Запустить тесты (Run tests)". Нажмите её для запуска тестов.

Пример тестов


(основной функцией является testAssertEqual; новый вариант – $this->tstAssertEqual, нужен для последующей интеграции в разные окружения)

Простейший тест
<?php
$res 
implode(",", array("1","2"));
$this->tstAssertEqual("implode1"$res"1,2");
?>


Простейший тест (старый вариант)
<?php
$res 
implode(",", array("1","2"));
echo 
testAssertEqual("implode1"$res"1,2");
?>


Пример тестов для AdvOntologу
с предварительным созданием таблиц

<?php
/* @var $this Wacko */
$srvOnto $this->srvFactory "AdvOntology" ); /* @var $srvOnto Service_AdvOntology */

if(!$srvOnto->typeExists("TestType")) {
    
// making test type first
    
    
echo "Install TestType first - please refresh to run real tests";
    
    
$srvOnto->addType("TestType","varchar(200)");
    
$srvOnto->addTypeField("TestType""fld1""int(11)""0");
    
$srvOnto->addTypeField("TestType""fld2""varchar(200)""");
    
$srvOnto->addTypeField("TestType""fld3""text""");
    
$srvOnto->addTypeField("TestType""fld4""int(11)""0");
    
    
$srvOnto->addConcept("TestType""v10"); // in first id we save version of test environment
    
$srvOnto->addConcept("TestType""text1""", array("fld1" => 1"fld4" => 1));
    
$srvOnto->addConcept("TestType""text2""", array("fld1" => 2"fld4" => 2));
    
$srvOnto->addConcept("TestType""text3""", array("fld1" => 3"fld4" => 1));
    
$srvOnto->addConcept("TestType""text4""", array("fld1" => 4"fld4" => 3));
    
$srvOnto->addConcept("TestType""text5""", array("fld1" => 5"fld4" => 2));
} else {
    
//echo "Tests....";

    
$res $srvOnto->getConcept("TestType"2);
    echo 
testAssertEqual("getConcept1"$res["data"], "text1");
    
    
$res = array( 
            array(
"id" => 1"ab" => 2)
            );
    
$res $srvOnto->utilDBtoIDS($res,"id");
    echo 
testAssertEqual("utilDBtoIDS1"count($res), 1);
    echo 
testAssertEqual("utilDBtoIDS2"$res[0], 1);
    
    
$res $srvOnto->getConceptByData("TestType""text2");
    echo 
testAssertEqual("getConceptByData1", (int)$res["id"], 3);
    
    echo 
"<b>--- Find tests ---</b><br />";
    
$res $srvOnto->getConceptsByFieldIds("TestType", array("fld1" => 1));
    
$res $srvOnto->utilDBtoIDS($res"id");
    echo 
testAssertEqual("getConceptsByFieldIds1"implode(":",$res), "2");
    
    
$res $srvOnto->getConceptsByFieldIds("TestType", array("fld4" => 1), 01000"id""ASC");
    
$res $srvOnto->utilDBtoIDS($res"id");
    echo 
testAssertEqual("getConceptsByFieldIds2"implode(":",$res), "2:4");
    
    
$res $srvOnto->getConceptsByFieldIds("TestType", array("fld4" => 1), 01"id""ASC");
    
$res $srvOnto->utilDBtoIDS($res"id");
    echo 
testAssertEqual("getConceptsByFieldIds3Limit"implode(":",$res), "2");
    
    
$res $srvOnto->getConceptsByFieldIds("TestType", array("fld4" => 1), 11"id""ASC");
    
$res $srvOnto->utilDBtoIDS($res"id");
    echo 
testAssertEqual("getConceptsByFieldIds4Limit"implode(":",$res), "4");
}    
?>

Почему не используется PHPUnit?


Предварительно прочитайте здесь: http://phpprofi.ru/blogs/post/24

Мы считаем, что основным тестированием должно быть интеграционное, а не юнит-тестирование. (в идеале – системное, но это сложно)
(Юнит-тестирование покрывает очень малый объем реальных ситуаций и хорошо подходит для написания библиотек, предназначенных для изолированных окружений – но плохо подходит для написания тестирования систем, работающих в интеграции. Получается много кода для тестирования, и мало толка).

Никто не мешает вам самостоятельно писать PHPUnit-тесты для расширений, но самое интересное – это, то, работает ли расширение в рамках QS-системы. Собственно, это и тестируется (+ автоматически дается доступ к БД и другим сервисам, позволяя делать интеграционное и системное тестирование).

Предварительная интеграция PHPUnit с версии QS 5.2


Для профессионалов
Несмотря на все вышенаписанное, предварительная интеграция есть с версии 5.2.

Пример тестового файла (для сервиса CustomSite):
<?php
include_once(__DIR__.'/../../wakka.testunit.php');
/**
 * CustomSite test case.
 */
class CustomSiteTest extends PHPUnit_Framework_TestCase
{
    
/**
     *
     * @var CustomSite
     */
    
private $customSite;
    
    
/**
     *
     * @var QSMiniKernel
     */
    
private $_kernel;

    
/**
     * Prepares the environment before running a test.
     */
    
protected function setUp()
    {
        
parent::setUp();
        
        
// TODO Auto-generated CustomSiteTest::setUp()
        
        //$this->customSite = new CustomSite(/* parameters */);
        
        //print_r($qs->srvLoadAll());
    
}

    
/**
     * Cleans up the environment after running a test.
     */
    
protected function tearDown()
    {
        
// TODO Auto-generated CustomSiteTest::tearDown()
        //$this->customSite = null;
        
        
parent::tearDown();
    }

    
/**
     * Constructs the test case.
     */
    
public function __construct()
    {
        
// TODO Auto-generated constructor
        
PHPUnit_Framework_Error_Deprecated::$enabled false;
        
        global 
$xcKernel;
        
$this->_kernel $xcKernel;
    }
    
    public function 
testKernelAvailable() {
        
$this->assertEquals("localhost"$this->_kernel->GetConfigValue("mysql_host"));
    }
    
    public function 
testServiceAvailable() {
        
$srv $this->srvFactory("CustomSite");
        
$this->assertNotNull($srv);
    }
    
    public function 
srvFactory($name) {
        return 
$this->_kernel->srvFactory($name);
    }
    
    public function 
tstAssertEqual($name,$a,$b) {
        
$this->assertEquals($b$a$name);
    }
    
    
/* */
    
public function testTest1() {
        
//include(__DIR__.'/tests/Test.php');
        
$srvSite $this->srvFactory("CustomSite"); /* @var $srvSite Service_CustomSite */
        
        
$res $srvSite->runPhpEvent("test""1");
        
$this->tstAssertEqual("Test1"$res"test1");
        
        
$res $srvSite->runLocalVar("testlocalvar");
        
$this->tstAssertEqual("TestLocalVar1"$res"testlocalvar_content");
        
        
$res $srvSite->isPhpEventExists("test");
        
$this->tstAssertEqual("TestExists1"$restrue);
        
        
$res $srvSite->isPhpEventExists("testnoexists");
        
$this->tstAssertEqual("TestExists2"$resfalse);
        
    }  
/* */ 
    
}


Известные баги:
  • глючит работа с базой данных
  • поддерживается пока только инициализация QSMiniKernel, Wacko недоступно
  • внутри класса, как можно видеть, эмулируется только функция srvFactory