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
Is-settur navali huwa qawwa ekonomika globali vera, li navigat lejn suq ta’ 150 biljun...
It-Tnejn li għadda, il-Financial Times ħabbret ftehim mal-OpenAI. FT tagħti liċenzja għall-ġurnaliżmu ta’ klassi dinjija tagħha...
Miljuni ta 'nies iħallsu għal servizzi ta' streaming, iħallsu miżati ta 'abbonament ta' kull xahar. Hija opinjoni komuni li inti...
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...