Миний дэлхий нэт

Миний.Дэлхий.нэтийн блог

  •  

    1 сар 2012
    Д М Л П Б Б Н
    « 1 сар    
     1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031  

Хүнийх болсон чамдаа

Бичсэн АриунСүлД , 1 сарын 6, 2011

Харж дурлаж явсан бүх бүсгүйчүүддээ зориулсан шүлэг бичив хөөрхий. Гэнэт харин өчигдөр санаад гаргаж ирлээ.

Хөөрхөн байсныг чинь мэдсэнгүй ээ
Хүнийх болсон хойно чинь л сая анзаарав
Сайхан байсныг чинь мэдсэнгүй ээ
Сэтгэлээ илчлэлгүй алджээ

Аз жаргалыг та хоёрт хүсээд
Алсаас чимээгүйхэн гуниглан харж сууя
Андын журам, амьдралыг чинь хүндлээд
Ахиж би энэ талаар ярихгүй ээ

Өрх толгойлж айл авч явах найз чамдаа
Үрстэйгээ жаргасан эцэг болохыг ерөөе
Чимээгүйхэн харж явсан бүсгүй чамд
Жаргалдаа бялуурсан ээж болохыг ерөөе

Найзууд минь бүгд хуримлачихаагүйгээс хойш
Надад харах боломж хэвээрээ л байгаа юм байна
Хэрэв цаг хугацааг буцаах аятайхан шалтаг гарвал
Харин ч түүнийг ашиглахдаа харамгүй зориг гаргана аа.

Бүлэг Шүлэг | 1 Сэтгэгдэл »

Practical Symfony Day8: Unit Test

Бичсэн АриунСүлД , 10 сарын 1, 2010

Эхний 5 өдрийн турш үзсэн Jobeet feature-үүдийг өөрчлөх (customize) болон шинийг үүсгэх хичээлүүдээ сүүлийн хоёр өдрийн турш дахин үзэж дүгнэв.
Өнөөдөр бид өөр зүйл: авто тест (automated tests) үзнэ. Энэ сэдэв их том учир 2 өдрийн турш үзэх болно.
Tests in symfony
Symfoy-д хоёр төрлийн автомат тестийн арга байдаг: unit tests|Unit Testing болон functional tests.
Unit tests нь ажиллагаанд шаардлагатай method функц тус бүрийг шалгадаг (verify). Тест бүр нь бие даасан бусдаасаа ангид байна.
Нөгөө талаас, функциональ тест нь програмын үр дүнг зөв байхыг шаарддаг.
Symfony-ийн тестүүд нь төслийн test/ хавтсанд хадгалагддаг бөгөөд дотроо unit test (test/unit/) болон functional test (test/functional/) гэсэн 2 дэд хавтстай.
Өнөөдрийн хичээлээр unit test-ийн талаар үзэх ба маргаашийн хичээлээр functional test-ийн талаар үзнэ.
Unit Tests
Unit test-ийг бичих нь вэб хөгжүүлэлтийн хамгийн хүнд даалгаваруудын нэг юм. Вэб хөгжүүлэгчид тест хэрэглэдэггүйгээс олон асуудал үүсдэг: Бид вэбийн бүтцийг (feature) тодорхойлохоосоо өмнө тест хийх ёстой юу? Бид юуг нь тестлэх вэ? Бидний тест single edge case/Edge Case бүрт зориулагдсан байх ёстой юу? Бид яаж бүгдийг нарийн сайн тестлэх вэ? Гэвч ихэвчлэн тулгардаг асуулт бол Хаанаас нь хэлэх вэ?
Хэдийгээр тестэд ихээр анхаарч байгаа ч symfony-ийн хандлага прагматик: Огт тест хийхгүй байснаас зарим нэг тест хийх нь дээр. Та ихээхэн кодыг тестгүйгээр биччихсэн? Асуудалгүй. Танд бүрэн тестлэснээс ахисан төвшний тест нь илүү үр ашигтай. Тестээ bug илрүүлэхээс эхэлье. Дээрхи хугацаанд таны код сайжран, code coverage-тэй болон тэр нь хөгжсөн гэж найдаж байна. Таны кодонд энэ хугацаанд прагматик хандлагаар хэд хэдэн боломжит тест хийгдсэн. Дараагийн алхам бол шинэ feature үүсгэхэд тест хийх. Таньд ойлгуулахад их хугацаа шаардлагагүй.
Ихэнхи тестийн сангууд програмын судалгааны хэсэгт байдаг нь асуудалтай. Тэгвэл Symfony яаж үүнийг хялбархан шийдсэн бэ? Тестийг хялбархан хийх lime сантай.
Хэдийгээр энэ сурах бичиг нь lime-аар өргөтгөсөн тестийн санг ашиглаж байгаа боловч та хүсвэл PHPUnit сан гэх мэт дурын тестийн санг ашиглаж болно.
The lime Testing Framework
Lime framework-оор бичигдсэн unit test-үүд нь ижилхэн кодоор эхэлдэг:
require_once dirname(__FILE__).’/../bootstrap/unit.php’;
$t = new lime_test(1);
Эхлээд unit.php файлын кодонд багахан зүйл нэмж өгье. Ингэснээр төлөвлөсөн тестийг тоог агуулсан lime_test объект үүслээ.
Plan нь lime-ийг цөөхөн тестээр алдааны мэдээлэл харуулах боломжийг олгоно (Заавал PHP fatal error заалгаж байх харахаас өмнө).
Тест нь method, функц дуудсанаар урьдчилан тодорхойлсон оролтуудын гаралтыг төлөвлөсөн үр дүнтэй жишнэ. Энэ жишилт нь тестийн үр дүнг зөв эсэхийг тодорхойлно.
lime_test объектын хэд хэдэн method нь энэ ажиллагааг хөнгөвчилдөг:
Method тайлбар
ok($test) Хэрэв тест алдаагүй бол true.
is($value1, $value2) 2 аргумент тэнцүү(==) бол true.
isnt($value1, $value2) 2 аргумент тэнцүү биш бол true.
like($string, $regexp) Тэмдэгт мөр regular expression бол true.
unlike($string, $regexp) Тэмдэгт мөр regular expression биш бол true.
is_deeply($array1, $array2) 2 массив ижил утгатай бол true.

Магадгүй та lime-ийн ok() аргаар бүгдийг хийж болохоор байтал ийм олон тестийн аргууд байгааг хараад гайхаж байгаа байх. Эдгээр нь тестийг элдвийн алдаагүй найдвартай байлгахын тулд ашиглагддаг.

Үүнээс гадна lime_test объект нь тохиромжтой тестийн аргуудыг ашигладаг:
Method тайлбар
fail() Always fails— Онцгой тестэд хэрэглэдэг
pass() Always passes— Онцгой тестэд хэрэглэдэг
skip($msg, $nb_test) Counts as $nb_tests tests— Нөхцөлт тестэд хэрэглэдэг
todo() Counts as a test— Бичигдээгүй кодонд хэрэглэдэг.
Эцэст нь хэлэхэд comment($msg) арга comment харуулах боловч тест хийдэггүй.
Running Unit Tests
Unit test-үүд нь test/unit/ хавтсанд хадгалагдана. Ер нь тестүүдийн нэр test гэж төгссөн байдаг. Гэвч та өөрийн хүссэнээр test/unit/ хавтас дахь файлуудыг өөрчлөх боломжтой ба lib/ хавтас дахь хавтас, файлуудыг хувилж авахыг зөвлөх байна.
Jobeet класс дээр жишээ болгон үзүүлье.
test/JobeetTest.php файл үүсгэж дараахи кодыг хуулъя:
// test/unit/JobeetTest.php
require_once dirname(__FILE__).’/../bootstrap/unit.php’;
$t = new lime_test(1);
$t->pass(’This test always passes.’);
Дараахи командаар тестийг ажиллуулна:
$ php test/unit/JobeetTest.php
Эсвэл test:unit хүсэлтээр:
$ php symfony test:unit Jobeet

Харамсалтай нь Windows-ийн command line (cmd) улаан, ногооноор highlight хийж чаддаггүй. Гэвч Cygwin ашигласнаар symfony-ийн –color тохиргоог task-д ашиглах боломжтой болно.
Testing slugify
Jobeet::slugify() хэмээх гайхалтай аргачлалтай танилцъя:
Бид ~slug/Slug~ify() аргыг ашигласан бол 5 өдрийн турш URL гэх мэт тэмдэгт мөрүүдийг цэвэрлэж чадах байлаа. Энэ хөрвүүлэлт нь non-ASCII –аас dash (-), эсвэл бүх тэмдэгтийг жижиг үсэг рүү хөрвүүлэх гэх мэт суурь хөрвүүлэлтүүдтэй төстэй:
Оролт Гаралт
Sensio Labs sensio-labs
Paris, France paris-france
Тест файлыг доорхи кодоор өөрчил:
// test/unit/JobeetTest.php
require_once dirname(__FILE__).’/../bootstrap/unit.php’;

$t = new lime_test(6);

$t->is(Jobeet::slugify(’Sensio’), ’sensio’);
$t->is(Jobeet::slugify(’sensio labs’), ’sensio-labs’);
$t->is(Jobeet::slugify(’sensio labs’), ’sensio-labs’);
$t->is(Jobeet::slugify(’paris,france’), ‘paris-france’);
$t->is(Jobeet::slugify(’ sensio’), ’sensio’);
$t->is(Jobeet::slugify(’sensio ‘), ’sensio’);
Хэрэв та бидний бичсэн тестийг ойлгосон бол энэ бүх мөр нь зөвхөн ганц ижил утгатай болохыг харах болно. Энэ тест нь unit test-ийн зарчмыг ойлгуулахыг зорьсон болно.
Одоо тест файлыг ажиллуулж сурлаа. Хэрэв бүх тест алдааны мэдээлэл өгөхгүй бол та “green bar” (ногоон мөр) харуулах ба эсрэг тохиолдолд “red bar” (улаан мөр) харуулах ба үүнийг засах шаардлагатай.

Хэрэв тест алдаа заавал яагаад алдаа гарсан талаар алдааны мэдээлэл гарна. Гэвч хэрэв та олон арван тест файлтай ажиллаж байвал энэ нилээн хүндэрнэ.
Lime test-үүд нь тэдний сүүлийн аргумент гэх мэт тэмдэгт мөр буцаадаг. Энэ нь таньд ямар хэсэгт тест явагдаж байгааг нь мэдэхэд тусална. Үүнээс гадна хүлээгдэж буй behavior-ийг тодорхойлох документийн форм нь бас тусална. Slygify тестийн файлд дараахи текстийг бичиж өгье.
require_once dirname(__FILE__).’/../bootstrap/unit.php’;

$t = new lime_test(6);

$t->comment(’::slugify()’);
$t->is(Jobeet::slugify(’Sensio’), ’sensio’,
‘::slugify() converts all characters to lower case’);
$t->is(Jobeet::slugify(’sensio labs’), ’sensio-labs’,
‘::slugify() replaces a white space by a -’);
$t->is(Jobeet::slugify(’sensio labs’), ’sensio-labs’,
‘::slugify() replaces several white spaces by a single -’);
$t->is(Jobeet::slugify(’ sensio’), ’sensio’,
‘::slugify() removes - at the beginning of a string’);
$t->is(Jobeet::slugify(’sensio ‘), ’sensio’,
‘::slugify() removes - at the end of a string’);
$t->is(Jobeet::slugify(’paris,france’), ‘paris-france’,
‘::slugify() replaces non-ASCII characters by a -’);

Тестийн тайлбарын бас нэгэн давуу тал нь тестийг ойлгоход хялбараар бичихэд туслана. Мөн тухайн тест юу хийхийг тодорхойлсон байдаг.
Code coverage
Тест бичихдээ ямар нэгэн хэсгийг мартагдах нь тохиолддог.
Бүх кодыг сайн шалгахад тань туслахаар symfony нь test:coverage task-ийг гаргаж ирсэн. Энэ task нь таны төслийн бүхий л фолдер, файл, аргументүүдийн тухай мэдээллийг харуулна:
$ php symfony test:coverage test/unit/JobeetTest.php lib/Jobeet.class.php
Тест аль мөрөнд ажиллаж байгааг мэдэхийг хүсвэл –detailed тохиргоогоор харж болно:
$ php symfony test:coverage –detailed test/unit/JobeetTest.php lib/Jobeet.class.php
Үүнийг ажиллуулснаар unit test бүрэн ажиллана гэдэгт итгэж болно.
test:coverage нь мэдээлэл цуглуулах XDebug-ийг ашиглах тул үүнийг суулгаж, идэвхижүүлсэн (enable) байх шаардлагатай.
Adding Tests for new Features
slug нь хоосон тэмдэгт мөрөнд зориулсан тэмдэгт морь юм.Үүний ажиллагааг тестлэх боломжтой. Гэхдээ URL-д хоосон тэмдэгт байх нь зохистой биш. Тиймээс slugify() method –д хоосон тэмдэгт мөр буцаахын оронд “n-a” буцаахаар өөрчилье.
Тестийг ажиллуулчихаад method-уудыг өөрчлөх замаар тестийг сайжруулж болно. Ингэж бичих нь тестийг бүрэн дүүрэн танин мэдэх тустай боловч анхнаас нь сайн төлөвлөж бичих хэрэгтэй.
$t->is(Jobeet::slugify(”), ‘n-a’, ‘::slugify() converts the empty string to n-a’);
Хөгжүүлэлтийн энэ аргачлалыг хэрэглэхээс өмнө Test Driven Development (TDD) зарчмыг судлах хэрэгтэй (TDD) .
Тестийг ажиллуулахад улаанаар тодотгосон мөр харагдана. Feature ажилласан болон таны тест бүрэн ажиллахгүй байвал энэ төр гарахгүй.
Одоо Jobeet класст дараахи өөрчлөлт хийж хоосон тэмдэгт мөр буцаахгүй болгоё.
// lib/Jobeet.class.php
static public function slugify($text)
{
if (empty($text))
{
return ‘n-a’;
}
// …
}
Ногоон фоноор тестийн эерэг үр дүнг харуулах боловч үүнийг цаашид сайжруулах шаардлагатайг мартаж болохгүй. Үгүй бол Долоо хэмжиж нэг огтлох “You planned six tests and ran one extra” хэрэгтэй. Тестийг төлөвлөгөөтэй сайжруулснаар илүү сайн ойлгож төгөлдөржүүлэх боломжтой.
Adding Tests because of a Bug
Зарим job link-үүд нь 404 error page дууддаг сонирхолтой багг (weird bug) тохиолддог гэж ярьдаг: Үүнийг шалгахад ихэнхдээ л company, position, location slug-ууд хоосон байснаас үүдсэн байдаг.
Яагаад ийм нөхцөл үүсдэг вэ?
Өгөгдлийн сан дахь бичлэгүүд нь хоосон биш байгааг харсан байх. Шалтгааны нь олохгүй таах биз. Тэмдэгт мөрүүд нь non-ASCII (Unicode гэх мэт ASCII биш) фонт ашигласан үед slugify() method нь хоосон тэмдэгт буцаана. Иймээс Jobeet классыг нээн үүнийг засах хэрэгтэй. Энэ нь болхи боловч эхлээд тест хийж үзье:
$t->is(Jobeet::slugify(’ - ‘), ‘n-a’,
‘::slugify() converts a string that only contains non-ASCII characters
to n-a’);

Тест ажиллахгүй алдаа заах ба Jobeet классыг засварлан хоосон мөр шалгахыг method-ийн төгсгөл рүү зөөвөл:
static public function slugify($text)
{
// …
if (empty($text))
{
return ‘n-a’;
}
return $text;
}
Одоо slugify() нь bug despite байгаагаас үл хамааран 100% ажиллана.
Тест нь хаана ажиллаж байгааг ойлгоход хүндрэлтэй боловч энэ нь зүгээр. Ямар нэгэн санаа олсон бол үүнийгээ кодын түвшинд засахаас өмнө тестлэх хэрэгтэй. Ингэснээр код чинь алдаагүй сайн ажиллах болно.
Towards a better slugify Method
Symfony-ийг францчууд бичсэн тул тестэд франц үг хэллэг ашигласныг харах байх:
$t->is(Jobeet::slugify(’Développeur Web’), ‘developpeur-web’, ‘::slugify() removes accents’);
Ихэнхи алдаанууд e -ийн оронд é -г тавих гэх мэт алдаанууд байгаа тул үүнийг slugify() method-оор ( - ) тэмдэгтээр даръя. Энэ алдааг transliteration буюу үсэг хөрвүүлэлт гэдэг. “iconv”-ийг суулгаснаар үүнийг хийх боломжтой болно. slugify method-ийг дараахи хэлбэртэй болгоё:
// code derived from http://php.vrana.cz/vytvoreni-pratelskeho-url.php
static public function slugify($text)
{
// replace non letter or digits by -
$text = preg_replace(’#[^\\pL\d]+#u’, ‘-’, $text);

// trim
$text = trim($text, ‘-’);

// transliterate
if (function_exists(’iconv’))
{
$text = iconv(’utf-8′, ‘us-ascii//TRANSLIT’, $text);
}

// lowercase
$text = strtolower($text);

// remove unwanted characters
$text = preg_replace(’#[^-\w]+#’, ”, $text);

if (empty($text))
{
return ‘n-a’;
}
return $text;
}

PHP файлуудаа UTF-8 форматтай хадгалснаар symfony “iconv”-ийг ашиглан үсгийн хөрвүүлэлт хийх болно.
Мөн тестийг ажиллуулахдаа “iconv”-ээр ажиллуулах шаардлагатай:

if (function_exists(’iconv’))
{
$t->is(Jobeet::slugify(’Développeur Web’), ‘developpeur-web’,
‘::slugify() removes accents’);
}

else
{
$t->skip(’::slugify() removes accents - iconv not installed’);
}
Doctrine Unit Tests
Database Configuration
Doctrine model класст Unit test хийхэд өгөгдлийн сангийн холболтыг нэхдэг нь жаахан төвөгтэй болгодог. Урьд нь хөгжүүлэлтийн үед зааж өгч байсан боловч энэ нь тестэд тусгайлан зориулсан бааз тодорхойлдог давуу талтай.
Энэ номын эхэнд application-ий хэд хэдэн орчинг танилцуулсан. Default (анхдагч)-аараа symfony-ийн бүх тестүүд test орчинд ажилладаг ба энэ орчинд зориулсан өөр өгөгдлийн сан тохируулъя.
$ php symfony configure:database –name=doctrine
–class=sfDoctrineDatabase –env=test
“mysql:host=localhost;dbname=jobeet_test” root mYsEcret
env тохиргоогоор энэ өгөгдлийн санг зөвхөн test орчинд ашиглахыг зааж өгч байна. Бид энэ тохиргоог 3 дахь өдөр ашигласан боловч env тохиргоог ашиглаагүй тул бүх орчинд ашиглагдахаар сантай болсон.
config/database.yml тохиргооны файлаас symfony тохиргооны орчнуудыг хэрхэн хялбархан өөрчилж байгааг харж болно.
Өгөгдлийн санг нэгэнт тохируулсан болохоор нэмэлтгүйгээр doctrine:insert-sql task-ийн тусламжтайгаар ашиглах боломжтой боллоо:
$ mysqladmin -uroot -pmYsEcret create jobeet_test
$ php symfony doctrine:insert-sql –env=test
Configuration Principles in symfony
4 дэх өдрийн хичээлээр тохиргооны файлуудад өөр түвшин тодорхойлохыг үзсэн билээ.
Эдгээрт орчинг давхар тодорхойлох боломжтой. Үүнийг бидний одоо хүртэл ашигласаар байгаа databases.yml, app.yml, view.yml, болон settings.yml гэх мэт түгээмэл файлуудад ашигласаар байна. all үг нь бүх орчинд ажиллах тохиргоог зааж байна:

# config/databases.yml
dev:
doctrine:
class: sfDoctrineDatabase

test:
doctrine:
class: sfDoctrineDatabase
param:
dsn: ‘mysql:host=localhost;dbname=jobeet_test’

all:
doctrine:
class: sfDoctrineDatabase
param:
dsn: ‘mysql:host=localhost;dbname=jobeet’
username: root
password: null
Test Data
Тестэд тусгайлан бэлдсэн өгөгдлийн сантай болсон тул бидэнд тестийн өгөгдөл хэрэгтэй. Гуравдахь өдөр бид doctrine:data-load task-ийн тухай үзсэн бөгөөд үүнийг тестийн өгөгдлийг өгөгдлийг сан руу хийхэд ашиглая.
doctrine:data-load task нь өгөгдөл ачаалахдаа Doctrine_Core::loadData() method-ийг ашиглана:
Doctrine_Core::loadData(sfConfig::get(’sf_test_dir’).’/fixtures’);
sfConfig объект нь төслийн дэд фолдерүүдийн замыг бүрэн авдаг бөгөөд үүнийг анхдагч фолдерийн бүтцийг өөрчлөхөд ашиглаж болно.
loadData() method нь анхдагч аргументдээ файл буюу фолдер авах ба үүндээ фолдер, файлын массив агуулж чадна.
Бид анхны зарим нэг өгөдлүүдийг data/fixtures/ хавтсанд үүсгэсэн. Үүнтэй адилаар тестийн fixture-уудыг test/fixtures/ хавтсанд хийе. Эдгээр fixture-үүд нь Doctrine-ийн unit болон functional тестэд ашиглагдана.
Эхний ээлжинд data/fixture/ хавтсанд байгаа файлуудыг test/fixtures/ хавтас руу хуулан ашиглая.
Testing JobeetJob
JobeetJob model class-ын зарим unit тестүүдийг үүсгэе.
Бидний жишээний хувьд Doctrine unit test-үүд нь бүгд ижил кодоор эхлэх тул bootsrap/ тест хавтсанд байрлах Doctrine.php файл үүсгэе:
// test/bootstrap/Doctrine.php
include(dirname(__FILE__).’/unit.php’);

$configuration =
ProjectConfiguration::getApplicationConfiguration(
‘frontend’, ‘test’, true);

new sfDatabaseManager($configuration);

Doctrine_Core::loadData(sfConfig::get(’sf_test_dir’).’/fixtures’);
Энэ скрипт файл нь эмх цэгцтэй бичигдсэн байна:
• Front controllers-д test-ийн орчны объектыг зааж өглөө:
$configuration =
ProjectConfiguration::getApplicationConfiguration(
‘frontend’, ‘test’, true);
• Өгөгдлийн сангийн менежерийг үүсгэснээр Doctrine-ы холболтыг databases.yml тохиргооны файлд тодорхойлох боломжтой болно.
new sfDatabaseManager($configuration);
• Тестийн өгөгдлүүдийг Doctrine_Core::loadData() ашиглан ачаална:
Doctrine_Core::loadData(sfConfig::get(’sf_test_dir’).’/fixtures’);
Doctrine-ы өгөгдлийн сангийн холболт нь хэдхэн SQL илэрхийллээр гүйцэтгэгэнэ.
Бүгдийг бэлдсэн тул JobeetJob классын тестийг эхлүүлье.
Эхлээд test/unit/model хавтсанд JobeetTest.php файл үүсгэе:
// test/unit/model/JobeetJobTest.php
include(dirname(__FILE__).’/../../bootstrap/Doctrine.php’);

$t = new lime_test(1);
getCompanySlug() method-ийг тест файлдаа нэмж өгье:
$t->comment(’->getCompanySlug()’);
$job = Doctrine_Core::getTable(’JobeetJob’)->createQuery()->fetchOne();
$t->is($job->getCompanySlug(), Jobeet::slugify($job->getCompany()),
‘->getCompanySlug() return the slug for the company’);
Зөвхөн тестэнд зориулагдсан getCompanySlug() method-ийг тодорхойлсноор slug-ийн алдаатай үгүйгээс үл шалтгаалан бидний тест ажиллах боломжтой болно.
save() method-д тест бичих нь үл ялиг комплекс болдог:
$t->comment(’->save()’);
$job = create_job();
$job->save();
$expiresAt = date(’Y-m-d’, time() + 86400
* sfConfig::get(’app_active_days’));
$t->is($job->getDateTimeObject(’expires_at’)->format(’Y-m-d’), $expiresAt,
‘->save() updates expires_at if not set’);

$job = create_job(array(’expires_at’ => ‘2008-08-08′));
$job->save();
$t->is($job->getDateTimeObject(’expires_at’)->format(’Y-m-d’),
‘2008-08-08′, ‘->save() does not update expires_at if set’);

function create_job($defaults = array())
{
static $category = null;
if (is_null($category))
{
$category = Doctrine_Core::getTable(’JobeetCategory’)
->createQuery()
->limit(1)
->fetchOne();
}

$job = new JobeetJob();
$job->fromArray(array_merge(array(
‘category_id’ => $category->getId(),
‘company’ => ‘Sensio Labs’,
‘position’ => ‘Senior Tester’,
‘location’ => ‘Paris, France’,
‘description’ => ‘Testing is fun’,
‘how_to_apply’ => ‘Send e-Mail’,
‘email’ => ‘job@example.com’,
‘token’ => rand(1111, 9999),
‘is_activated’ => true,
), $defaults));

return $job;
}
Тестийг өргөтгөх бүртээ lime_test байгуулагч дахь дараагийн ажиллах тест (plan)-ийг мартаж болохгүй. JobeetJobTest файлын хувьд 1-ийг 3 болгон өөрчлөх хэрэгтэй.
Test other Doctrine Classes
Инсгэснээр бүх Doctrine классуудыг тестлэх боломжтой болно. Одоо unit test-ийг хялбарханаар дуудан ашиглаж болно.
Unit Tests Harness
test:unit task нь мөн төсөл (project) –ийн бүх unit test-ийг ажиллуулдаг:
$ php symfony test:unit
Task бүх алдаатай, алдаагүй файлууд харуулна.

Хэрэв test:unit task нь файлын “тодорхойгүй төлөв” буюу “dubious status” тохиолдвол скриптийг бүрэн ажиллуулалгүй тасална. Тест файл нь зөвхөн алдааны мэдээллийг харуулна.
Final Thoughts
Тест нь application-ы хувьд нэн чухал боловч өнөөдрийн хичээлд зарим зүйл орхигдсон.
Мэдээж symfony нь фрэймворкуудын дундаа сайн боловч үүний чадварыг зөвхөн хөгжүүлэгчийн ухамсар болон сайн дадлагын хүчээр л эзэмших боломжтой. Эдгээрийн нэг нь тест юм. Unit test-үүд таны хожмын ажлыг хөнгөвчилнө. Энэ нь таны кодын найдвартай байдлыг бататгах бөгөөд үүнийг айх зүйлгүйгээр дураараа хөгжүүлэх боломжийг олгоно. Unit test-үүд таныг ямар нэгэн зүйлийг алдахаас хамгаалн найдвартай мэдээлж байна. Symfony фрэймворк нь өөртөө 9000 гаруй тесттэй.
Маргааш бид зарим job, category модулиудад зориулсан functional test (функциональ тест)-үүд бичнэ. Тэр болтол Jobeet модель класст зориулсан unit тест-үүд бичээрэй.

Татаж авах холбоос: http://www.4shared.com/document/Q3lJo4X9/PracticalSymfonyDay8.html

Бүлэг Symfony | Сэтгэгдэлгүй »

Хүүхэд хөөрхөн #8

Бичсэн АриунСүлД , 9 сарын 24, 2010

Б.Алтантуяа:

Ээж бид 2г загнаж байнаа.. Би залуудаа байхдаа ийм залхуу байгаагүй. та 2 арай дэндүү нтр гээл.. Бид 2 ч дув дуугай л байлаа.Миний хажууд ирээл чихэнд Ээж бид 2-г хоюуланг нь загнаад байх шиг байнаа гээл шивнэж байна. Тэгснээ манай хүн ээжид Та залуу байхдаа 23-тай байсан тэ гэж авдын. / Аминдаа өөрөө мултрах гээд.. Тэгэнгүүт нь ээж уурлахаа больчиж байгаа юм чинь… хэхэ/

Эх сурвалж: http://biznetwork.mn/topic/show?id=2035&page=14#comment_372194

Бүлэг Хүүхэд хөөрхөн | Сэтгэгдэлгүй »

Хүүхэд хөөрхөн #7

Бичсэн АриунСүлД , 9 сарын 24, 2010

Б.Алтантуяа:

Надаас эмээгийн нэрийг асууж байна.
- Өвөөгийн эхнэрийн нэрийг хэн гэдэг билээ аниа?

Эх сурвалж: http://biznetwork.mn/topic/show?id=2035&page=14#comment_372194

Бүлэг Хүүхэд хөөрхөн | Сэтгэгдэлгүй »

Хүүхэд хөөрхөн #6

Бичсэн АриунСүлД , 9 сарын 24, 2010

Биз дээр Алтантуяагийн оруулснаас туучихав.

Манай дүү саяхан сургуулийнхаа гуанзанд хоол идэх гэж орсон гэнэ л дээ. Ганцаараа.Ээжээсээ мөнгө аваал том агаа болоол орсон гэнэ. Очоол
- Пүнтүүзтэй хуурга хэд вэ? .
- Тогооч нь: Таваг нь 2000 гэж.. Манай хүн жаахан бодож зогссоноо:
- Эгчээ тэгүүл таваггүй нь хэд вэ? гэсэн гэж байгаан.. Хэ хэ. / Хөөрхөн золиг шүү..Саначлаа байна/
Цааш унших »

Бүлэг Хүүхэд хөөрхөн | 1 Сэтгэгдэл »

Магистрын диплом бичих зөвлөгөө

Бичсэн АриунСүлД , 8 сарын 30, 2010

Оюутан болохоор шийдээд ухаж төнхөж явтал ийм юм байна. Ер нь хэрэгтэй эд байна. Үүнийг бичсэн Сарны хүнд баярлалаа. Эрдэм мэдлэг дэлгэрэг.

Нэг үеэ бодвол Монголын залуус боловсролдоо их анхаардаг болсоор удаж байна. Хүн бүр нэг ч гэсэн хэл сурах гэж оролддог, яаж ийж байгаад нэг бакалаврын боловсрол эзэмшихийг цаашилбал магистр хийхээр мэрийдэг болжээ. Үнэхээр ч Монголд бакалавр байтугай магистргүй бол “ЯВАХАА БАЙЧИХСАН” гэж улс амьтан ярих юм билээ. Хэрвээ ийм болчихсон бол нэг төрлийн “ГАЖИГ” үүсчээ л гэж би ойлгоно. Угтаа хүн бүр номын мөр хөөх албагүй, нийгэмд тийм хэрэгцээ ч байхгүй гэж би боддог.

Гэхдээ энэ удаад номын мөр хөөж яваа эрхэм дүү нар, үе тэнгийн залуустаа өөрийн багахан туршлага, үзсэн, уншсан зүйлээсээ хуваалцъя гэлээ.

Мэдээж доорхи зөвлөгөөг заавал магистрын дипломын ажил гэж явцууруулалгүйгээр бакалавр, докторын түвшний болон аливаа судалгааны ажилд тустай /хамаатай/ гэж хүлээж авах нь зохимжтой. Мөн нийгмийн ухааны салбарыг төсөөлж зөвлөсөн тул зарим нэг талаараа байгалийн ухааны судалгаатай нийцэхгүй байж болох юм. Хэт нуршихгүй байх үүднээс нарийн ширийн /detail/-ээс боломжоороо зайлхийнэ ээ.

Эхлээд, - Надад магистр хийх хэрэгцээ шаардлага үнэхээр байгаа бил үү? гэж өөрөөсөө асуух хэрэгтэй байх. “ЯАГААД ГЭВЭЛ ОДООХОНДОО МАНАЙД ХУДАЛДАГЧ БОЛОХОД БАКАЛАВРЫН БОЛОВСРОЛ ХАНГАЛТТАЙ БАЙГАА ШҮҮ ДЭЭ”. Юу гэх гээд байна вэ гэвэл эзэмшсэн мэргэжил, эрхэлж байгаа ажил чинь чамаас магистрын зэрэг “нэхэж” байгаа эсэхийг ойлгох хэрэгтэй. Үнэндээ 10 ч төгсөөгүй мөртлөө амжилтанд хүрсэн хүмүүс байж л байдаг. Бас эзэмшсэн мэргэжлээрээ ажиллаж ч үзээгүй байж магистр, цаашилбал доктор хийнээ гээд явж байгаа хүн таарч л байдаг. /Хэлэх гэсэн санааг минь ойлгосон биз дээ/

Нэгэнт магистр хийхээр шийдсэн бол аль сургуульд, ямар чиглэлээр хийхээ ч бас тодорхой хэмжээгээр бодчихжээ гэсэн үг. Нийгмийн ухаанаар магистрын сургалт явуулдаг цөөнгүй сургууль байдаг ч нэр хүнд, гол нь чанарын хувьд харилцан адилгүй байдгийг сонголтоо хийхдээ бодоорой.

Магистрын сургалтыг бакалаврын боловсролын үргэлжлэл гэж би боддог. Тиймээс ч /жишээ/ эрх зүйн боловсрол эзэмшчихээд эдийн засгаар магистр, анагаахаар доктор хийнээ гээд явах нь учир дутагдалтай гэж би хувьдаа боддог.

Магистрын диплом бичих үйл явцыг сэдэв сонгох, эх сурвалж цуглуулах, эх сурвалжаа боловсруулах, дипломын бичилтийг хийх, хамгаалах гэх мэт үе шатуудад хувааж болох хэдий ч дээрх үйл ажиллагаа нь ихэвчлэн зэрэг хийгдэж явдаг юм.

1… СЭДЭВ СОНГОХ: Хэн хэлснийг нь мартжээ нэг номын хүн надад ингэж хэлсэн юм. “-СЭДВЭЭ СОНГОХ НЬ ДИПЛОМЫН АЖЛЫН 50%-ТАЙ ТЭНЦЭНЭ”. Их үнэн тодорхойлолт гэж би ойлгодог. Үнэхээр судалгааны ажлын сэдвээ зөв, оновчтой тодорхойлж, томъёолох нь цаашид туулах бүдэг бадаг судалгааны замыг гэрэлтүүлэх шидтэй байдаг. /Энэ өгүүлбэрийг би хэллээ гэж үү хэхэ/ Иймд сэдвээ сонгохдоо дараахь зүйлсийг бодолцвол зохино.

*** СЭДВИЙН СУДЛАГДСАН БАЙДАЛ: Хэн нэгний судалчихсан юмыг давтаад суух нь утгагүй. Тэгээд ч аливаа судалгааг хийхдээ урьд нь тэр талаар хэн, юу гэж “ДОНГОДСОН” болохыг заавал дурьдах бичигдээгүй хууль байдаг. Ингэж байж юу нь орхигдсон, дутуу үлдсэнийг олж тогтоох, түүнийг нөхөх нь чиний судалгааны шинэлэг байдлыг харуулна.

Үүний зэрэгцээ огт судлагдаагүй болон сайн судлагдсан сэдвүүдийн “давуу болон сул” талууд байдаг. Огт судлагдаагүй сэдвээр юм хийхэд эх сурвалж олдохгүй түвэгтэй байдаг ч энэ талаар “ТҮРҮҮЛЖ ДУУГАРСАН ХӨХӨӨ” нь чи байх тул чамайг үгүйсгэх хүн цөөрөөд л явчихна. Харин сайтар судлагдсан сэдвээр юм хийхэд эх сурвалж арвин ч тэр бүгдийг “СӨХӨЖ ХАРАХ” багагүй цагийг чинь авна. Бас олон хүн чиний хийх гээд байгаа зүйлийг хальт мульт гадарладаг тул тал талаас чинь “ЦЭЦЭРХЭЭД” эхэлнэ. Гэхдээ чи бүх л эх сурвалжуудыг чамбай ашиглаж чадвал айх зүйлгүй ээ.

Хамгаалалт дээр нэг нөхөр чамаас “-Тэр нөгөө хэн чиний сэдэвтэй холбоотой тийм юм бичсэн байналээ. Түүнийг олж уншсан уу?” гэж асуухад нь хариулах үггүй зогсож байв аа!

*** СЭДВИЙН АЧ ХОЛБОГДОЛ: Зарим нэг нөхдүүдийн магистрын сэдвийг харахад, “-Ёстой магистр болох л гэснээс биш мань хүний судалгаа ч хоосон цаас юм даа” гэж бодоход хүргэдэг. Мэдээж ганц магистрын ажлаар чи дэлхийг өөрчлөхгүй ч хийсэн юм чинь бага ч гэсэн бусдад /чамд бас нийгэмд/ хэрэг болохуйц байгаасай. Онолын эсвэл практикийн олигтойхон ач холбогдол тээгээгүй цагт чиний хөдөлмөр үнэгүйдэж, зарим нэгний нь “ТОХУУ” болохвий.

*** СЭДВИЙН ЦАР ХҮРЭЭ: Магистрын түвшинд дэндүү ахадсан сэдвүүд явж л байдаг. Би чадна гэж байгаа бол өөр хэрэг. Гэхдээ хамрах хүрээ өргөсөхийн хирээр судалгааны ажлын үндсэн санаа алдагдаж, хаашаа хийсэх гээд байгаа нь ойлгомжгүй /тал талруу үсчсэн/ хамхуул шиг болж орхидог. Иймд судалгааныхаа обьектыг зохих хэмжээнд нь барих нь чухал.

*** СУДАЛГААНЫ АЖЛЫН ЗОРИЛГО: Зорилгогүй хүн ойд төөрсөн /юутай ч билээ дээ/ адилхан гэж үг байдаг. Хэн ч “-Чихэнд их эвтэйхэн эсвэл доргио, саак сонсогдож байгаа болохоор энэ сэдвээр дипломоо бичнэ ээ” гэж хэлдэггүй байх. Чи сэдвээ сонгохдоо их бага хэмжээгээр судалгааныхаа ажлын үр дүнг таамаглах шаардлагатай болдог. Харин ингэж чадахгүй байвал эрсдэл авмааргүй бол эртхэн өөр сэдэв сонгох хэрэгтэй шүү.

2… ДИПЛОМЫН АЖЛЫН БҮТЭЦ: Судалгааны ажлын чинь араг яс, тулгуур багана гэсэн үг. Хэдий чинээ зөв томъёолно төдий чинээ эрдмийн ажил чинь хялбаршина. хэдийгээр дипломын ажлын бүтэц гарч ирсний дараа дотрохыг нь дүүргэх замаар ажил хийгддэг ч явцын дунд энэ бүтэц өөрчлөгдөж болдог.

3… ЭХ СУРВАЛЖ ЦУГЛУУЛАХ: Нүүдэлчин соёл иргэншлээсээ болсон ч юм уу манайд аль ч салбарт бичмэл эх сурвалж хүн айж сүрдмээр их биш байдаг болов уу гэж би боддог. Өөрөөр хэлбэл эх сурвалжийг цуглуулах нь “ЗОВООД” байх зүйл биш. Харин ямар нэг гадаад хэл /түгээмэл/ мэддэг хүнд гадны эх сурвалжийг ашиглах асар том боломж байдаг. Бас интернэт. Жаахан учрыг нь олдог болчихвол интернэтээс юу хүссэнээ олж болно.

Үнэндээ алхам тутамдаа судалгааныхаа ажилтай холбоотой материалуудыг их бага гэлгүй цуглуулаад явтал нэг харахад уул овоо шиг их юм болчихсон байхвий. Тиймээс ч нэг багш маань “-Эх сурвалжаа тухай бүрд нь боловсруулаад, хэрэгтэйгээ аваад хэрэггүйгээ хаях нь чухал” гэж зөвлөж билээ. Үгүй бол олон материал дундаас аль нь гол, аль нь ач холбогдол багатай болохыг хожим нь зааглах түвэгтэй болно. /эл байдлыг би хоолны бүх материал нь бэлэн ч хоолоо хийж чадахгүй байгаатай адилтгалаа/

4… ЭХ СУРВАЛЖАА БОЛОВСРУУЛАХ: Ер нь бол эх сурвалжаа цуглуулахтайгаа зэрэгцээд түүнийгээ боловсруулж явах нь илүү амар болох талаар дээр өгүүлсэн. Гагцхүү “БҮГДИЙГ БУС ЧУХЛЫГ” нь судалгаандаа ашиглах нь ажлын чинь чанарыг өөд нь татах болно.

5… ДИПЛОМЫН АЖЛАА БИЧИХ: Эх сурвалжаа боловсруулах явцад дипломын ажлын бичилт ямар нэг хэмжээгээр хийгдчихсэн байдаг. Мэдээж эрдмийн ажлын үг хэллэг энд миний зөвлөж байгаа шиг “дэл сул” биш илүү дутуу үггүй байдгийг сануулах нь илүүц биз.

Техник шаардлагын талаар ярьвал дэндүү их зүйл болох тул маш товч нэг зөвлөгөө байна. Хамгаалалтан дээр ч, хожим хойно ч тэр дипломын чинь ажлыг гартаа авсан хүний нүдэнд хамгийн түрүүнд техник алдаанууд тусдаг. Хэлбэр нь гологдож байвал “За даа”, “Энэ ч дээ” гэж бодсон хүмүүс ажлын чинь агуулгыг харахдаа “цензур”-тай хандаж болох талтай.

6… ХАМГААЛАЛТ: /Өглөөнөөс хойш энэ сэдвийг бодож бичиж байгаа болохоор “залхах” талруугаа орж байна. Товч бичнээ./ Хамгаалалт дээр -Би, би гээд цээжээ дэлдээд байж болохгүй. гэхдээ бас үхээнц царайлаад ч байж болохгүй. Үзэл бодлоо харилцан хүндлэлийн хүрээнд тууштай хамгаалах хэрэгтэй.

Хамгаалалт дээр “БӨӨРӨНХИЙ” байх хэрэгтэй. Өөрөөр хэлбэл -Яг ийм. Гарцаагүй тийм гэж хэлэхээсээ илүүтэй -Ийм байж болох талтай. Тэгэж болзошгүй. Ингэх магадлалтай гэх мэтээр бөөрөнхийлж байх нь эргээд чамд гарц болно. Гэхдээ “БӨВ БӨӨРӨНХИЙ” бай гэсэн үг биш шүү.

Бас их ярьж болохгүй. Учир нь олон үгэнд олон алдаа гардаг. Гэхдээ дуугүй байж болохгүй. Чамд хандсан шүүмж, саналуудад, -Цаашдын ажилдаа анхааръя, богино хугацаанд судалж ажилдаа тусгая гэх мэт хариу “ИДЕАЛ”.

Дипломын ажлын чинь удиртгал хэсэг /би нийт ажлын 80% нь гэж боддог/ чинь сайн бол хамгаалалтаас айх зүйлгүй ээ. Бас удирдагчтайгаа ойр бай! Учир нь эрдэм судлалын тал дээр тэд биднээс илүү туршлагатай байдаг. Нөгөө талаас чамайг хамгаалах ганц бамбай удирдагч байдаг.

Мэдээж олны мэдэх эрдэмтэн, докторууд эрдмийн ажлын талаар маш ихийг зөвлөх байх л даа. Магадгүй энд бичсэнээс тэс хөндлөн юм ч зөвлөх биз. Миний зүгээс ийм л байна. /Жаахан нарийвчилбал ярьж бичих юм зөндөө л байлаа./

Амжилт!

Сарны хүн http://biznetwork.mn/topic/show/18382/1#comment_body_354395

Бүлэг Миний амьдрал | Сэтгэгдэлгүй »

Цогтын хадны бичиг (Алтернатив)

Бичсэн АриунСүлД , 7 сарын 23, 2010

Цогт тайжийн бичсэн хадны бичээс хийгээд
Цадиггүй Сүлдийн гуйвуулсан гуйвуулга хоёрын
Адилтгаж зүйрлэсэн нь ангид боловч
Анхааруулж бичсэн нь агаар нэгэн буй

Сүлдийн мэссэнжэрийн бичиг

Мэнд мэдэлцэн гар барих залуус хийгээд
Мэссэнжэрт тааралдах найзуудын хооронд
Харах, хүртэхүйн ялгаа буй боловч
Харилцан ойлголцохын агаар нэгэн буй.
Цааш унших »

Бүлэг Гуйвуулга | 5 Сэтгэгдэл »

Амлалт

Бичсэн АриунСүлД , 7 сарын 9, 2010

Хүн амьтанд би амласан
Хирээ мэдэхгүй дэндүү их амласан
Хичээж заримыг нь биелүүлж явна
Хэлсэндээ хүрэх гэж зүтгэж л явна

Уудам хорвоод зөндөө л хэлдэг
Угтаа тэд минь бүгд л амлалт болдог
Хүрсэн амлалтаа хэлж бардамнахгүй ээ
Бүтээгүй хэдээ хэлж учраа тайлбарлая

Айлын ууган сайн хүү болно гэж
Анх би эцэг эхдээ амласан
Ах болж сайхан амьдраад
Ах нь дүү нартаа дууриалал болно гэж

Охин чамд анх дурлахдаа
Одооных шиг бодож байгаагүй ээ
Чамд л бүхнээ зориулна
Чамаараа л хайрлуулахад бүгд болно гэж

Маргаашнаас эхлээд сайн хүн болно гэж
Магадгүй алдах болгондоо л би хэлдэг
Энэ л амлалт намайг алдаг
Энэ чигээрээ алдахыг хүсдэггүй

Ар гэр найз нөхөддөө
Ашдын нэгэн түшиг байх гэж

Хүний дайтай сайн явна гэж
Хирэндээ би хөдөлмөрлөж явна
Айлын дайтай айл болно гэж
Амьхандаа би бодож явна

Хэлсэн бүгдээ гүйцээж чадаагүй ч
Хугацаа товлож цаг тогтоогүй ч
Хэлсэн би байгаа л болохоор
Хэзээд түүнээ биелүүлэхээр л хичээнэ

Бүлэг Шүлэг | Сэтгэгдэлгүй »

С.Жавхлан - Зүүдэнд уяатай аав (алтернатив)

Бичсэн АриунСүлД , 5 сарын 25, 2010

Хэнэггүй өссөн балчир наснаас минь
Хэтрүүлж загнасан үглээ аавынхаа
Яншсан бүхнийг сонсож
Ягштал биелүүлж явсан ч бил үү дээ

Дахилт:
Согтуу агсамнаж нойр хулжаасан
Сээтэгнүүр ааваа өрөвдөөд байх юм
Өнийн явдлыг нь ойлгож чадаагүй
Өөрийгөө би голмоор болох юм

Утсаа кармалаад ажилдаа гарахдаа
Учиргүй уддаг хөдөлмөрч аавынхаа
Уруулын будагтай цамцнаас нь
Ухаарч өөртөө өвлөсөн ч бил үү дээ

Дахилт:
Согтуу агсамнаж нойр хулжаасан
Сээтэгнүүр ааваа өрөвдөөд байх юм
Өнийн явдлыг нь ойлгож чадаагүй
Өөрийгөө би голмоор болох юм

Хоймрын буйдангаа дүүргэн шалхайсан
Хүрлийж барайсан данхар аавынхаа
Хэзээ ч дуугардаггүй сайхан чанарыг нь
Хэрүүлч авгайдаа сургасан ч бил үү дээ

Дахилт:
Согтуу агсамнаж нойр хулжаасан
Сээтэгнүүр ааваа өрөвдөөд байх юм
Өнийн явдлыг нь ойлгож чадаагүй
Өөрийгөө би голмоор болох юм

Бүлэг Гуйвуулга | 3 Сэтгэгдэл »

Туулай тэжээ - Эрүүл мэндэд сайн (Амьдрал өөрөө онигооны цуглуулга)

Бичсэн АриунСүлД , 5 сарын 17, 2010

Өчигдөр нэг иймэрхүү яриа боллоо. Орой хоол идэнгээ тэжээвэр амьтдын тухай яриа өрнөв.
Догмаа: - Туулай их хөөрхөн
Би: - Хамгийн онцгүй амьтан. Түүний оронд нохой, муур бол боломжийн
Аав: - Туулай тэжээхээр амьсгалын замын өвчин тусдаггүй гэсэн. Ялангуяа нялх хүүхэдтэй айлууд нилээн тэжээдэг юм билээ…
Батбаяр: - Аргагүй. Туулай чинь хурдан амьтан. Багаасаа туулай хөөж гүйгээд байвал амьсгал задралгүй яахав …

Бүлэг Амьдрал өөрөө онигоо | 2 Сэтгэгдэл »