Автоматические тесты для расширений
Начиная с версии 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), 0, 1000, "id", "ASC");
$res = $srvOnto->utilDBtoIDS($res, "id");
echo testAssertEqual("getConceptsByFieldIds2", implode(":",$res), "2:4");
$res = $srvOnto->getConceptsByFieldIds("TestType", array("fld4" => 1), 0, 1, "id", "ASC");
$res = $srvOnto->utilDBtoIDS($res, "id");
echo testAssertEqual("getConceptsByFieldIds3Limit", implode(":",$res), "2");
$res = $srvOnto->getConceptsByFieldIds("TestType", array("fld4" => 1), 1, 1, "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", $res, true);
$res = $srvSite->isPhpEventExists("testnoexists");
$this->tstAssertEqual("TestExists2", $res, false);
} /* */
}
Известные баги:
- глючит работа с базой данных
- поддерживается пока только инициализация QSMiniKernel, Wacko недоступно
- внутри класса, как можно видеть, эмулируется только функция srvFactory