Эхний 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