Fejn jidħlu testijiet awtomatizzati jew unit tests, fi kwalunkwe lingwa ta’ programmar, hemm żewġ opinjonijiet opposti:
Għalhekk, b'dan l-artikolu se nippruvaw nikkonvinċu lil ta 'l-ewwel, speċjalment billi nuru kemm huwa faċli li tibda bl-ittestjar awtomatizzat f'Laravel.
L-ewwel ejja nitkellmu dwar il-"għaliex", u mbagħad ejja naraw xi eżempji tal-kif.
Testijiet awtomatizzati jmexxu partijiet mill-kodiċi u jirrappurtaw kwalunkwe żball. Dak hu l-aktar mod sempliċi biex tiddeskrivihom. Immaġina li toħroġ karatteristika ġdida f'app, u mbagħad assistent robot personali jmur jittestja manwalment il-karatteristika l-ġdida, filwaqt li jittestja wkoll jekk il-kodiċi l-ġdid ma kisirx xi waħda mill-karatteristiċi qodma.
Dan huwa l-vantaġġ ewlieni: jerġa 'jittestja l-karatteristiċi kollha awtomatikament. Dan jista 'jidher xogħol żejjed, imma jekk ma tgħidx lir-"robot" biex tagħmel dan, għandna alternattivament nagħmluha manwalment, hux?
Jew karatteristiċi ġodda jistgħu jiġu rilaxxati mingħajr ma jiġi ttestjat jekk jaħdmux, bit-tama li l-utenti jirrappurtaw bugs.
Testijiet awtomatizzati jistgħu jagħtuna diversi vantaġġi:
Ipprova immaġina l-applikazzjoni tiegħek f'sena jew tnejn, b'iżviluppaturi ġodda fit-tim li ma jafux il-kodiċi miktub fis-snin preċedenti, jew saħansitra kif tittestjah.
Biex twettaq l-ewwel ittestjar awtomatizzat f'Laravel, m'għandekx bżonn tikteb xi kodiċi. Iva, inti taqra dan id-dritt. Kollox huwa diġà kkonfigurat u ppreparat fil-pre-installazzjonidefinite ta' Laravel, inkluż l-ewwel eżempju bażiku.
Tista' tipprova tinstalla proġett Laravel u tmexxi l-ewwel testijiet immedjatament:
laravel new project
cd project
php artisan test
Dan għandu jkun ir-riżultat fil-console tiegħek:
Jekk nagħtu ħarsa lejn il-predefinit ta' Laravel /tests
, għandna żewġ fajls:
testijiet/Feature/ExampleTest.php :
class ExampleTest extends TestCase
{
public function test_the_application_returns_a_successful_response()
{
$response = $this->get('/');
$response->assertStatus(200);
}
}
M'għandekx bżonn tkun taf l-ebda sintassi biex tifhem x'inhu għaddej hawn: tagħbija l-home page u ċċekkja jekk il-kodiċi tal-istatus HTTP
è "200 OK
".
Magħruf ukoll bħala l-isem tal-metodu test_the_application_returns_a_successful_response()
isir test li jinqara meta tara r-riżultati tat-test, sempliċiment billi tissostitwixxi s-simbolu tas-sottolinja bi spazju.
testijiet/Unità/ExampleTest.php :
class ExampleTest extends TestCase
{
public function test_that_true_is_true()
{
$this->assertTrue(true);
}
}
Jidher daqsxejn inutli, tivverifika biex tara jekk dan hux minnu?
Aħna ser nitkellmu speċifikament dwar it-testijiet tal-unità ftit aktar tard. Għalissa, trid tifhem x'jiġri ġeneralment f'kull test.
/tests
hija klassi PHP li testendi t-TestCase ta' PHPUnitStrutturalment, dak kollu li għandek bżonn tkun taf, kollox jiddependi fuq l-affarijiet eżatti li trid tittestja.
Biex tiġġenera klassi tat-test vojta, sempliċement ħaddem dan il-kmand:
php artisan make:test HomepageTest
Il-fajl huwa ġġenerat tests/Feature/HomepageTest.php
:
class HomepageTest extends TestCase
{
// Replace this method with your own ones
public function test_example()
{
$response = $this->get('/');
$response->assertStatus(200);
}
}
Ejja issa naraw x'jiġri jekk l-asserzjonijiet tat-test ma jagħtux ir-riżultat mistenni.
Ejja nbiddlu l-eżempji tat-testijiet għal dan:
class ExampleTest extends TestCase
{
public function test_the_application_returns_a_successful_response()
{
$response = $this->get('/non-existing-url');
$response->assertStatus(200);
}
}
class ExampleTest extends TestCase
{
public function test_that_true_is_false()
{
$this->assertTrue(false);
}
}
U issa, jekk imexxu l-kmand php artisan test
għal darb'oħra:
FAIL Tests\Unit\ExampleTest
⨯ that true is true
FAIL Tests\Feature\ExampleTest
⨯ the application returns a successful response
---
• Tests\Unit\ExampleTest > that true is true
Failed asserting that false is true.
at tests/Unit/ExampleTest.php:16
12▕ * @return void
13▕ */
14▕ public function test_that_true_is_true()
15▕ {
➜ 16▕ $this->assertTrue(false);
17▕ }
18▕ }
19▕
• Tests\Feature\ExampleTest > the application returns a successful response
Expected response status code [200] but received 404.
Failed asserting that 200 is identical to 404.
at tests/Feature/ExampleTest.php:19
15▕ public function test_the_application_returns_a_successful_response()
16▕ {
17▕ $response = $this->get('/non-existing-url');
18▕
➜ 19▕ $response->assertStatus(200);
20▕ }
21▕ }
22▕
Tests: 2 failed
Time: 0.11s
Hemm żewġ testijiet li fallew, immarkati bħala FAIL, bi spjegazzjonijiet hawn taħt u vleġeġ li jindikaw il-linja eżatta tat-testijiet li fallew. L-iżbalji huma indikati b'dan il-mod.
Ejja ngħidu li għandna formola u għandna bżonn nittestjaw diversi każijiet: aħna niċċekkjaw jekk ifallix b'dejta invalida, niċċekkjaw jekk tirnexxix bl-input korrett, eċċ.
Il-kit tal-bidu uffiċjali minn Laravel Breeze jinkludi i tittestja l-funzjonalità fi ħdanha. Ejja nħarsu lejn xi eżempji minn hemm:
tests/Feature/RegistrationTest.php
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class RegistrationTest extends TestCase
{
use RefreshDatabase;
public function test_registration_screen_can_be_rendered()
{
$response = $this->get('/register');
$response->assertStatus(200);
}
public function test_new_users_can_register()
{
$response = $this->post('/register', [
'name' => 'Test User',
'email' => 'test@example.com',
'password' => 'password',
'password_confirmation' => 'password',
]);
$this->assertAuthenticated();
$response->assertRedirect(RouteServiceProvider::HOME);
}
}
Hawnhekk għandna żewġ testijiet fi klassi waħda, peress li t-tnejn huma relatati mal-formola ta’ reġistrazzjoni: wieħed jiċċekkja jekk il-formola hijiex mgħobbija b’mod korrett u ieħor jiċċekkja jekk is-sottomissjoni taħdem tajjeb.
Ejja nsiru familjari ma 'żewġ metodi oħra biex nivverifikaw ir-riżultat, żewġ affermazzjonijiet oħra: $this->assertAuthenticated()
e $response->assertRedirect()
. Tista 'tiċċekkja l-asserzjonijiet kollha disponibbli fid-dokumentazzjoni uffiċjali ta' PHPUnit e Rispons Laravel . Innota li xi asserzjonijiet ġenerali jseħħu dwar is-suġġett $this
, filwaqt li oħrajn jiċċekkjaw l-ispeċifiċi $response
mis-sejħa tar-rotta.
Ħaġa oħra importanti hija l- use RefreshDatabase;
dikjarazzjoni, bil-puplesija, imdaħħla fuq il-klassi. Huwa meħtieġ meta l-azzjonijiet tat-test jistgħu jaffettwaw id-database, bħal f'dan l-eżempju, l-illoggjar iżid dħul ġdid fil- users
tabella tad-database. Għal dan, għandek toħloq database tat-test separata li tiġi aġġornata magħha php artisan migrate:fresh
kull darba li jsiru t-testijiet.
Għandek żewġ għażliet: toħloq fiżikament database separata jew tuża database SQLite fil-memorja. It-tnejn huma kkonfigurati fil-fajl phpunit.xml
ipprovdut awtomatikamentdefinita ma Laravel. Speċifikament, għandek bżonn din il-parti:
<php>
<env name="APP_ENV" value="testing"/>
<env name="BCRYPT_ROUNDS" value="4"/>
<env name="CACHE_DRIVER" value="array"/>
<!-- <env name="DB_CONNECTION" value="sqlite"/> -->
<!-- <env name="DB_DATABASE" value=":memory:"/> -->
<env name="MAIL_MAILER" value="array"/>
<env name="QUEUE_CONNECTION" value="sync"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="TELESCOPE_ENABLED" value="false"/>
</php>
Ara l- DB_CONNECTION
e DB_DATABASE
liema huma kkummentati? Jekk għandek SQLite fuq is-server tiegħek, l-eħfef azzjoni hija li sempliċement tneħħi l-kumment ta' dawk il-linji u t-testijiet tiegħek jimxu kontra dik id-database fil-memorja.
F'dan it-test ngħidu li l-utent huwa awtentikat b'suċċess u ridirezzjonat lejn il-homepage korretta, iżda nistgħu wkoll nittestjaw id-dejta attwali fid-database.
Minbarra dan il-kodiċi:
$this->assertAuthenticated();
$response->assertRedirect(RouteServiceProvider::HOME);
Nistgħu nużaw ukoll l-affermazzjonijiet tat-test tad-database u agħmel xi ħaġa bħal din:
$this->assertDatabaseCount('users', 1);
// Or...
$this->assertDatabaseHas('users', [
'email' => 'test@example.com',
]);
Ejja issa naraw eżempju ieħor ta 'paġna Login ma' Laravel Breeze
tests/Feature/AuthenticationTest.php:
class AuthenticationTest extends TestCase
{
use RefreshDatabase;
public function test_login_screen_can_be_rendered()
{
$response = $this->get('/login');
$response->assertStatus(200);
}
public function test_users_can_authenticate_using_the_login_screen()
{
$user = User::factory()->create();
$response = $this->post('/login', [
'email' => $user->email,
'password' => 'password',
]);
$this->assertAuthenticated();
$response->assertRedirect(RouteServiceProvider::HOME);
}
public function test_users_can_not_authenticate_with_invalid_password()
{
$user = User::factory()->create();
$this->post('/login', [
'email' => $user->email,
'password' => 'wrong-password',
]);
$this->assertGuest();
}
}
Huwa dwar il-formola tal-login. Il-loġika hija simili għar-reġistrazzjoni, hux? Iżda tliet metodi minflok tnejn, għalhekk dan huwa eżempju ta 'ttestjar ta' xenarji kemm tajbin kif ukoll ħżiena. Għalhekk, il-loġika komuni hija li għandek tittestja ż-żewġ każijiet: meta l-affarijiet imorru tajjeb u meta jfallu.
Ukoll, dak li tara f'dan it-test huwa l-użu ta ' Fabbriki tad-Database : Laravel joħloq utent falz ( għal darb'oħra, fuq id-database tat-test aġġornata tiegħek ) u mbagħad jipprova jidħol, bi kredenzjali korretti jew mhux korretti.
Għal darb'oħra, Laravel jiġġenera l-fabbrika predefinita b'data falza għall- User
mudell, barra l-kaxxa.
database/factories/UserFactory.php:
class UserFactory extends Factory
{
public function definition()
{
return [
'name' => $this->faker->name(),
'email' => $this->faker->unique()->safeEmail(),
'email_verified_at' => now(),
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
'remember_token' => Str::random(10),
];
}
}
Tara, kemm huma ppreparati affarijiet minn Laravel innifsu, allura jkun faċli għalina li nibdew nittestjaw?
Mela jekk inwettqu php artisan test
wara l-installazzjoni ta 'Laravel Breeze, għandna naraw xi ħaġa bħal din:
PASS Tests\Unit\ExampleTest
✓ that true is true
PASS Tests\Feature\Auth\AuthenticationTest
✓ login screen can be rendered
✓ users can authenticate using the login screen
✓ users can not authenticate with invalid password
PASS Tests\Feature\Auth\EmailVerificationTest
✓ email verification screen can be rendered
✓ email can be verified
✓ email is not verified with invalid hash
PASS Tests\Feature\Auth\PasswordConfirmationTest
✓ confirm password screen can be rendered
✓ password can be confirmed
✓ password is not confirmed with invalid password
PASS Tests\Feature\Auth\PasswordResetTest
✓ reset password link screen can be rendered
✓ reset password link can be requested
✓ reset password screen can be rendered
✓ password can be reset with valid token
PASS Tests\Feature\Auth\RegistrationTest
✓ registration screen can be rendered
✓ new users can register
PASS Tests\Feature\ExampleTest
✓ the application returns a successful response
Tests: 17 passed
Time: 0.61s
Rajt is-subfolders tests/Feature
e tests/Unit
?.
X'inhi d-differenza bejniethom?
Globalment, barra mill-ekosistema Laravel/PHP, hemm diversi tipi ta 'ttestjar awtomatizzat. Tista' ssib termini bħal:
Jidher ikkumplikat, u d-differenzi attwali bejn dawn it-tipi ta 'testijiet kultant huma mċajpra. Huwa għalhekk li Laravel issimplifika dawn it-termini konfużi kollha u ġabarhom fi tnejn: unità/karatteristika.
Fi kliem sempliċi, it-testijiet tal-karatteristiċi jippruvaw jesegwixxu l-funzjonalità attwali tal-applikazzjonijiet tiegħek: ikseb il-URL, ċempel l-API, jimita l-imġieba eżatta bħal timla l-formola. It-testijiet tal-karatteristiċi normalment iwettqu l-istess operazzjonijiet jew simili bħal kull utent tal-proġett jagħmel, manwalment, fil-ħajja reali.
It-testijiet unitarji għandhom żewġ tifsiriet. B'mod ġenerali, tista 'ssib li kwalunkwe test awtomatizzat jissejjaħ "ittestjar tal-unità" u l-proċess kollu jista' jissejjaħ "test tal-unità". Iżda fil-kuntest tal-funzjonalità kontra l-unità, dan il-proċess huwa dwar l-ittestjar ta 'unità speċifika ta' kodiċi mhux pubblika, b'mod iżolat. Pereżempju, għandek klassi Laravel b'metodu li jikkalkula xi ħaġa, bħall-prezz totali tal-ordni b'parametri. Għalhekk, it-test tal-unità jiddikjara jekk ir-riżultati korretti jiġux ritornati minn dak il-metodu (unità tal-kodiċi), b'parametri differenti.
Biex tiġġenera test unitarju, trid iżżid bandiera:
php artisan make:test OrderPriceTest --unit
Il-kodiċi ġġenerat huwa l-istess bħat-test ta 'qabel l-unitàdefiSistema Laravel:
class OrderPriceTest extends TestCase
{
public function test_example()
{
$this->assertTrue(true);
}
}
Kif tistgħu taraw, ma teżistix RefreshDatabase
, u dan huwa wieħed minn defil-aktar definizzjonijiet komuni tat-test tal-unità: ma tmissx id-database, taħdem bħala "kaxxa sewda", iżolata mill-applikazzjoni li taħdem.
Nippruvaw nimitaw l-eżempju li semmejt qabel, ejja nimmaġinaw li għandna klassi tas-servizz OrderPrice
.
app/Services/OrderPriceService.php:
class OrderPriceService
{
public function calculatePrice($productId, $quantity, $tax = 0.0)
{
// Some kind of calculation logic
}
}
Imbagħad, it-test unitarju jista' jidher xi ħaġa bħal din:
class OrderPriceTest extends TestCase
{
public function test_single_product_no_taxes()
{
$product = Product::factory()->create(); // generate a fake product
$price = (new OrderPriceService())->calculatePrice($product->id, 1);
$this->assertEquals(1, $price);
}
public function test_single_product_with_taxes()
{
$price = (new OrderPriceService())->calculatePrice($product->id, 1, 20);
$this->assertEquals(1.2, $price);
}
// More cases with more parameters
}
Fl-esperjenza personali tiegħi mal-proġetti Laravel, il-maġġoranza kbira tat-testijiet huma testijiet tal-Karatteristiċi, mhux testijiet tal-Unità. L-ewwel, trid tittestja jekk l-applikazzjoni tiegħek taħdem, il-mod kif in-nies reali jużawha.
Sussegwentement, jekk għandek kalkoli speċjali jew loġika tista ' definire bħala unità, b'parametri, tista 'toħloq testijiet ta' unità speċifikament għal dak.
Xi drabi, il-kitba tat-testijiet teħtieġ li tiġi mmodifikata l-kodiċi innifsu u li ssir rifactoring biex tagħmilha aktar "testabbli": tissepara l-unitajiet fi klassijiet jew metodi speċjali.
X'inhu l-użu attwali ta 'dan php artisan test
, meta għandek tmexxiha?
Hemm approċċi differenti, skont il-fluss tax-xogħol tan-negozju tiegħek, iżda ġeneralment trid tiżgura li t-testijiet kollha huma "ħodor" (jiġifieri mingħajr żbalji) qabel ma timbotta l-bidliet finali tal-kodiċi fir-repożitorju.
Imbagħad, taħdem lokalment fuq il-kompitu tiegħek, u meta taħseb li lest, agħmel xi testijiet biex tiżgura li ma kisret xejn. Ftakar, il-kodiċi tiegħek jista 'jikkawża bugs mhux biss fil-loġika tiegħek iżda wkoll involontarjament jikser xi mġiba oħra fil-kodiċi ta' xi ħadd ieħor miktub twil ilu.
Jekk nieħdu pass 'il quddiem, huwa possibbli li awtomat ħafna affarijiet. B'diversi għodod CI/CD, tista 'tispeċifika t-testijiet biex isiru kull meta xi ħadd jimbotta bidliet għal fergħa Git speċifika jew qabel ma tgħaqqad il-kodiċi fil-fergħa tal-produzzjoni. L-aktar fluss tax-xogħol sempliċi jkun li tuża Github Actions, għandi vidjo separat li jipprova dan.
Hemm opinjonijiet differenti dwar kemm għandha tkun kbira l-hekk imsejħa "kopertura tat-test": ipprova kull operazzjoni u każ possibbli f'kull paġna, jew illimita x-xogħol għall-aktar partijiet importanti.
Fil-fatt, dan huwa fejn naqbel ma 'nies li jakkużaw l-ittestjar awtomatizzat li jieħdu aktar ħin milli jipprovdu benefiċċju attwali. Dan jista' jiġri jekk tikteb testijiet għal kull dettall. Cela dit, jista 'jkun meħtieġ mill-proġett tiegħek: il-mistoqsija ewlenija hija "x'inhu l-prezz ta' żball potenzjali".
Fi kliem ieħor, għandek bżonn tipprijoritizza l-isforzi tal-ittestjar tiegħek billi tistaqsi l-mistoqsija "X'jiġri jekk dan il-kodiċi falla?" Jekk is-sistema tal-ħlas tiegħek għandha bugs, se jkollha impatt dirett fuq in-negozju. Mela jekk il-funzjonalità tar-rwoli/permessi tiegħek tinkiser, din hija kwistjoni ta 'sigurtà enormi.
Jogħġobni kif poġġih Matt Stauffer waqt konferenza: "L-ewwel trid tittestja dawk l-affarijiet li, jekk ifallu, ikeċċek minn xogħolek." Ovvjament dik hija esaġerazzjoni, imma tieħu l-idea: ipprova l-affarijiet importanti l-ewwel. U mbagħad karatteristiċi oħra, jekk ikollok ħin.
L-eżempji kollha ta 'hawn fuq huma bbażati fuq l-għodda ta' ttestjar minn qabel Laraveldefilejla: PHPUnit . Iżda matul is-snin dehru għodod oħra fl-ekosistema u waħda mill-aħħar popolari hija PEST . Maħluq minn impjegat uffiċjali ta 'Laravel Nuno Maduro , timmira li tissimplifika s-sintassi, u tagħmel il-kodiċi tal-kitba għat-testijiet saħansitra aktar mgħaġġel.
Taħt il-barnuża, tiġri su PHPUnit, bħala saff addizzjonali, qed jipprova jimminimizza xi partijiet ripetuti minn qabeldefiaħħar tal-kodiċi PHPUnit.
Ejja nħarsu lejn eżempju. Ftakar il-klassi tat-test ta 'qabel il-karatteristikadefinited f'Laravel? Infakkarkom:
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class ExampleTest extends TestCase
{
public function test_the_application_returns_a_successful_response()
{
$response = $this->get('/');
$response->assertStatus(200);
}
}
Taf kif jidher l-istess test b'PEST?
test('the application returns a successful response')->get('/')->assertStatus(200);
Iva, linja WIEĦED ta 'kodiċi u dak hu. Allura, l-għan ta 'PEST huwa li tneħħi l-overhead ta':
Biex tiġġenera test PEST f'Laravel, trid tispeċifika bandiera addizzjonali:
php artisan make:test HomepageTest --pest
Sa minn din il-kitba, PEST huwa pjuttost popolari fost l-iżviluppaturi ta 'Laravel, iżda hija l-preferenza personali tiegħek jekk tużax din l-għodda addizzjonali u titgħallem is-sintassi tagħha, kif ukoll nota PHPUnit.
BlogInnovazione.it
Coveware minn Veeam se jkompli jipprovdi servizzi ta' rispons għal inċidenti ta' estorsjoni ċibernetika. Coveware se joffri forensiċi u kapaċitajiet ta' rimedju...
Il-manutenzjoni ta’ tbassir qed tirrivoluzzjona s-settur taż-żejt u l-gass, b’approċċ innovattiv u proattiv għall-ġestjoni tal-impjant...
Is-CMA tar-Renju Unit ħarġet twissija dwar l-imġieba ta 'Big Tech fis-suq tal-intelliġenza artifiċjali. Hemm…
Id-Digriet "Case Green", ifformulat mill-Unjoni Ewropea biex itejjeb l-effiċjenza enerġetika tal-bini, ikkonkluda l-proċess leġiżlattiv tiegħu bi...