Articles

Dzidza maitiro ekuita bvunzo muLaravel nemienzaniso yakapusa, uchishandisa PHPUnit uye PEST

Kana zvasvika kune otomatiki bvunzo kana yeyuniti bvunzo, mune chero mutauro wechirongwa, pane maviri anopikisana maonero:

  • Kutambisa nguva
  • Iwe haugone kuita pasina iyo

Saka, nechinyorwa ichi tichaedza kunyengerera iyo yekutanga, kunyanya nekuratidza kuti zviri nyore sei kutanga ne otomatiki kuyedzwa muLaravel.

Kutanga ngatitaure nezve "nei", uye tozoona mimwe mienzaniso yekuti sei.

Nei tichida otomatiki kuyedzwa

Maedzo otomatiki anomhanyisa zvikamu zvekodhi uye anoshuma chero kukanganisa. Ndiyo nzira yakareruka yekuvatsanangura. Fungidzira uchiburitsa chinhu chitsva muapp, uyezve robhoti mubatsiri aienda oedza nemaoko chinhu chitsva, ukuwo achiyedza kana iyo kodhi nyowani haina kutyora chero chekare maficha.

Iyi ndiyo mukana mukuru: kudzokorora zvese maficha otomatiki. Izvi zvingaita sebasa rekuwedzera, asi kana ukasaudza "robhoti" kuti riite, isu tinofanira kuzviita nemaoko, handiti? 

Kana kuti maficha matsva anogona kuburitswa pasina kuyedza kuti anoshanda here, achitarisira kuti vashandisi vachataura tsikidzi.

Otomatiki bvunzo dzinogona kutipa akati wandei mabhenefiti:

  • Chengetedza nguva yekuedza yemanyorero;
  • Ivo vanokutendera iwe kuchengetedza nguva zvese pane idzva basa rakaitwa uye pane akabatanidza mabasa nekudzivisa kudzoreredza;
  • Wedzera bhenefiti iyi neayo ese maficha uye ese maficha atoitwa;
  • Mapoinzi matatu apfuura anoshanda kune yega yega shanduro;
  • ...

Edza kufungidzira chikumbiro chako mugore kana maviri, nevagadziri vatsva muchikwata vasingazive kodhi yakanyorwa mumakore apfuura, kana kunyange maitiro ekuiedza. 

Yedu yekutanga otomatiki bvunzo

Kuita yekutanga otomatiki kuyedza muLaravel, haufanire kunyora chero kodhi. Hongu, unoverenga zvakanaka. Zvese zvakatogadziriswa uye zvakagadzirirwa mu-pre-installationdefiNite yeLaravel, kusanganisira yekutanga yekutanga muenzaniso.

Unogona kuedza kuisa Laravel purojekiti uye womhanyisa bvunzo dzekutanga nekukurumidza:

laravel new project
cd project
php artisan test

Izvi zvinofanirwa kuve mhedzisiro mune yako console:

Kana tikatarisa kumberidefizuva reLaravel /tests, tine mafaira maviri:

tests/Feature/ExampleTest.php :

class ExampleTest extends TestCase
{
    public function test_the_application_returns_a_successful_response()
    {
        $response = $this->get('/');
 
        $response->assertStatus(200);
    }
}

Iwe haufanirwe kuziva chero syntax kuti unzwisise zviri kuitika pano: rodha peji reimba uye tarisa kana iyo mamiriro kodhi. HTTP è "200 OK".

Iyo inozivikanwawo sezita renzira test_the_application_returns_a_successful_response() inova mavara anoverengwa kana uchiona mhinduro dzebvunzo, nekungotsiva chiratidzo chepasi nenzvimbo.

tests/Unit/ExampleTest.php :

class ExampleTest extends TestCase
{
    public function test_that_true_is_true()
    {
        $this->assertTrue(true);
    }
}

Zvinoita sezvisina maturo, kutarisa kuona kana ichi chiri chokwadi? 

Tichazonyatso taura nezve bvunzo dzeyuniti pave paya. Parizvino, iwe unofanirwa kunzwisisa izvo zvinowanzoitika muyedzo yega yega.

  • Imwe neimwe faira yekuyedza muforodha /tests ikirasi yePP inotambanudza TestCase ye PHPUnit
  • Mukati mekirasi yega yega, unogona kugadzira nzira dzakawanda, kazhinji imwe nzira yekuyedza mamiriro
  • Mukati menzira yega yega mune zviito zvitatu: gadziriro yemamiriro ezvinhu, wozoita wozosimbisa (simbisa) kana mhedzisiro yacho sezvaitarisirwa.

Zvimiro, ndizvo chete zvaunofanira kuziva, zvimwe zvese zvinoenderana nezvinhu chaizvo zvaunoda kuyedza.

Kuti ugadzire kirasi yekuyedza isina chinhu, ingomhanya uyu murairo:

php artisan make:test HomepageTest

Iyo faira inogadzirwa 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);
    }
}

Zvino ngatione kuti chii chinoitika kana kodhi kodhi ikakundikana muLaravel

Ngationei zvino kuti chii chinoitika kana bvunzo dzekuti dzikasadzosera mhedzisiro inotarisirwa.

Ngatichinjei mienzaniso miyedzo kune iyi:

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);
    }
}

Uye zvino, kana tikamhanya murairo php artisan test zvakare:

 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

Pane miyedzo miviri yakakundikana, yakanyorwa seFAIL, ine tsananguro pazasi uye miseve inonongedza kumutsara chaiwo webvunzo wakatadza. Kukanganisa kunoratidzwa nenzira iyi.

Muenzaniso: Kuedza kunyoresa fomu kodhi muLaravel

Ngatitii isu tine fomu uye isu tinoda kuyedza akasiyana kesi: isu tinotarisa kana yakundikana neiyo isiriyo data, isu tinotarisa kana ichibudirira neiyo chaiyo yekuisa, nezvimwe.

The official starter kit naLaravel Breeze inosanganisira i kuedza kushanda mukati maro. Ngatitarisei mimwe mienzaniso kubva ipapo:

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);
    }
}

Pano tine bvunzo mbiri mukirasi imwe, sezvo ese ari maviri ane hukama nefomu rekunyoresa: imwe inotarisa kana fomu racho rakatakurwa nemazvo uye imwe inotarisa kana kutumira kunoshanda zvakanaka.

Ngatizivei dzimwe nzira mbiri dzekusimbisa mhedzisiro, zvimwe zviviri zvinoti: $this->assertAuthenticated()$response->assertRedirect(). Unogona kutarisa zvirevo zvese zviripo mune zviri pamutemo zvinyorwa zve PHPUnit e Laravel Mhinduro . Ziva kuti zvimwe zvirevo zvinowanzoitika panhau iyi $this, nepo vamwe vachitarisa chaiyo $responsekubva munzira yekufona.

Chimwe chinhu chakakosha ndeche use RefreshDatabase;chirevo, nekurohwa, chakaiswa pamusoro pekirasi. Izvo zvinodikanwa kana zviito zvekuyedza zvinogona kukanganisa dhatabhesi, semumuenzaniso uyu, kutema miti kunowedzera nyowani yekupinda mu userstafura yedatabase. Kune izvi, iwe unofanirwa kugadzira yakaparadzana bvunzo dhatabhesi iyo inozogadziridzwa nayo php artisan migrate:freshpese panoitwa bvunzo.

Une sarudzo mbiri: kugadzira dhatabhesi yakaparadzana kana kushandisa in-memory SQLite dhatabhesi. Ose ari maviri akagadziridzwa mufaira phpunit.xmlzvinopihwa nedefaultdefinita with Laravel. Kunyanya, iwe unoda chikamu ichi:

<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>

Onai DB_CONNECTIONDB_DATABASEndedzipi dzinotaurwa nezvadzo? Kana iwe uine SQLite pane yako sevha, chiito chakareruka ndechekungosunungura iwo mitsara uye bvunzo dzako dzinomhanya dzichipesana neiyo mu-memory dhatabhesi.

Muyedzo iyi tinoti mushandisi akatenderwa zvinobudirira uye anotungamirwa kune chaiyo peji remba, asi isu tinogona zvakare kuyedza iyo chaiyo data mudhatabhesi.

Mukuwedzera kune iyi kodhi:

$this->assertAuthenticated();
$response->assertRedirect(RouteServiceProvider::HOME);

Tinogonawo kushandisa iyo database test zvirevo uye ita chimwe chinhu chakadai:

$this->assertDatabaseCount('users', 1);
 
// Or...
$this->assertDatabaseHas('users', [
    'email' => 'test@example.com',
]);

Muenzaniso weLogin peji

Ngationei mumwe muenzaniso weLogin peji neLaravel 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();
    }
}

Ndezve fomu rekupinda. Iyo pfungwa yakafanana nekunyoresa, handiti? Asi nzira nhatu panzvimbo mbiri, saka uyu muenzaniso wekuyedza zvese zvakanaka uye zvakaipa mamiriro. Saka, iyo yakajairika pfungwa ndeyekuti iwe unofanirwa kuyedza ese maviri kesi: kana zvinhu zvikafamba zvakanaka uye kana zvakundikana.

Innovation newsletter
Usarasikirwa nenhau dzakanyanya kukosha dzekuvandudza. Nyora kuti uvagamuchire neemail.

Zvakare, izvo zvaunoona muyedzo iyi kushandiswa kwe Database Factories : Laravel inogadzira mushandisi wenhema ( zvakare, pane yako yakagadziridzwa test database ) uye woedza kupinda, uine magwaro chaiwo kana asiriwo.

Zvekare, Laravel inogadzira fekitori predefinita with false data for the Usermuenzaniso, kunze kwebhokisi.

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),
        ];
    }
}

Munoona, zvingani zvinhu zvakagadzirirwa naLaravel pachayo, saka zvingave nyore here kuti isu titange kuyedza?

Saka kana tikaita php artisan testmushure mekuisa Laravel Breeze, tinofanira kuona chimwe chinhu chakadai:

 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

Miedzo inoshanda kana ichienzaniswa neyeyuniti bvunzo uye nezvimwe

Iwe wakaona ma subfolders tests/Feature e tests/Unit ?. 

Ndeupi musiyano uripo pakati pavo? 

Pasi rose, kunze kweLaravel/PHP ecosystem, kune akati wandei emhando dzekuedza otomatiki. Unogona kuwana mazwi akadai:

  • Unit tests
  • Feature test
  • Kubatanidza miedzo
  • Miedzo inoshanda
  • Kupera-kumagumo kuyedzwa
  • Kubvuma miedzo
  • Miyedzo yefodya
  • etc.

Zvinonzwika zvakaoma, uye misiyano chaiyo pakati pemhando idzi dzebvunzo dzimwe nguva inodzima. Ndosaka Laravel akarerutsa aya mazwi anovhiringa uye akaaisa muzvikamu zviviri: unit/chinhu.

Zvichitaurwa zviri nyore, maficha ebvunzo anoedza kuita iko chaiko kushanda kwezvikumbiro zvako: tora URL, fonera API, tevedzera maitiro chaiwo sekuzadza fomu. Feature bvunzo dzinowanzo kuita zvakafanana kana zvakafanana mashandiro aizoita chero mushandisi weprojekiti, pamaoko, muhupenyu chaihwo.

Miyedzo yeyuniti ine zvirevo zviviri. Kazhinji, unogona kuona kuti chero bvunzo dzeotomatiki dzinodaidzwa kuti "unit test" uye maitiro ese anogona kunzi "unit test". Asi mumamiriro ekushanda maringe neyuniti, maitiro aya ndeekuyedza imwe isiri yeruzhinji yuniti yekodhi, mukuzviparadzanisa nevamwe. Semuenzaniso, une kirasi yeLaravel ine nzira inoverengera chimwe chinhu, senge mutengo weodha yakazara nemaparamita. Naizvozvo, bvunzo yeyuniti yaizotaura kana mhinduro dzakaringana dzichidzoserwa kubva kune iyo nzira (code unit), ine akasiyana paramita.

Kuti ugadzire bvunzo yeyuniti, unofanirwa kuwedzera mureza:

php artisan make:test OrderPriceTest --unit

Kodhi yakagadzirwa yakafanana neye pre unit testdefiLaravel system:

class OrderPriceTest extends TestCase
{
    public function test_example()
    {
        $this->assertTrue(true);
    }
}

Sezvauri kuona, haipo RefreshDatabase, uye iyi ndeimwe ye defiyakajairika unit test tsananguro: haina kubata dhatabhesi, inoshanda se "black box", yakasarudzika kubva kune inomhanya application.

Tichiedza kutevedzera muenzaniso wandambotaura, ngatimbofungidzira tine kirasi yebasa OrderPrice.

app/Services/OrderPriceService.php:

class OrderPriceService
{
    public function calculatePrice($productId, $quantity, $tax = 0.0)
    {
        // Some kind of calculation logic
    }
}

Zvadaro, iyo unit test inogona kutaridzika seizvi:

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
}

Muchiitiko changu pachedu nemapurojekiti eLaravel, iyo yakawanda yebvunzo ndeye Feature bvunzo, kwete Unit bvunzo. Kutanga, iwe unofanirwa kuyedza kana application yako inoshanda, nzira iyo vanhu chaivo vangaishandisa.

Tevere, kana uine yakakosha kuverenga kana logic iwe unogona definire seyuniti, ine paramita, unogona kugadzira bvunzo dzeyuniti zvakanangana nazvo.

Dzimwe nguva, kunyora bvunzo kunoda kugadzirisa kodhi pachayo uye kuigadzirisa kuti iite "yeedzo": kupatsanura mayunitsi kuita makirasi akasarudzika kana nzira.

Nguva / sei kuita bvunzo?

Chii chiri kushandiswa chaiko kweizvi php artisan test, unofanira kuimhanyisa rinhi?

Kune nzira dzakasiyana, zvichienderana nebhizinesi rako mafambiro, asi kazhinji iwe unofanirwa kuve nechokwadi chekuti bvunzo dzese dziri "girinhi" (kureva-isina kukanganisa) usati wasundidzira ichangoburwa kodhi shanduko kune repository.

Zvadaro, iwe unoshanda munharaunda yako pabasa rako, uye kana iwe uchifunga kuti wapedza, shandisa mimwe miedzo kuti uone kuti hauna kutyora chero chinhu. Rangarira, kodhi yako inogona kukonzera tsikidzi kwete chete mukufunga kwako asiwo nekusaziva kutyora imwe maitiro mukodhi yemumwe munhu yakanyorwa kare.

Kana tikaitora imwe nhanho mberi, zvinokwanisika kuita otomatiki vakawanda zvinhu. Nematurusi akasiyana siyana eCI/CD, unogona kudoma bvunzo dzekumhanya pese apo mumwe munhu anosundidzira shanduko kune chaiyo Git bazi kana asati abatanidza kodhi mubazi rekugadzira. Iyo yakapfava yekufambisa ingave yekushandisa Github Zviito, ndine vhidhiyo yakasiyana zvinozvipupurira.

Chii chaunofanira kuedza?

Kune maonero akasiyana-siyana pamusoro pekuti iyo inonzi "test coverage" inofanira kuva yakakura sei: edza zvose zvingaita kushanda uye kesi pamapeji ose, kana kuderedza basa kune zvikamu zvakakosha.

Muchokwadi, apa ndipo pandinobvumirana nevanhu vanopomera otomatiki kuyedza kutora nguva yakawanda pane kupa rubatsiro chairwo. Izvi zvinogona kuitika kana iwe ukanyora bvunzo kune yega yega yega. Izvozvo zvakati, zvinogona kudiwa neprojekti yako: mubvunzo mukuru ndewe "chii chiri mutengo wekukanganisa kunogona".

Mune mamwe mazwi, iwe unofanirwa kukoshesa kuedza kwako nekubvunza mubvunzo "Chii chingaitika kana kodhi iyi ikatadza?" Kana yako yekubhadhara system iine mabugs, inobata zvakananga bhizinesi. Saka kana kushanda kwemabasa ako / mvumo kwakaputswa, iyi inyaya hombe yekuchengetedza.

Ini ndinofarira matauriro akaitwa naMatt Stauffer pamusangano: "Unofanira kutanga waedza zvinhu izvo, kana zvikatadza, zvinokudzinga pabasa rako." Hongu iko kuwedzeredza, asi unowana zano: edza zvakakosha zvinhu kutanga. Uye zvimwe zvinhu, kana uine nguva.

PEST: imwe nzira itsva kune PHPUnit

Mienzaniso yese iri pamusoro yakavakirwa paLaravel pre test tooldefimanheru: PHPUnit . Asi nekufamba kwemakore mamwe maturusi akaonekwa mune ecosystem uye imwe yeazvino yakakurumbira ndeye PEST . Yakagadzirwa nemukuru Laravel mushandi Nuno Maduro , ine chinangwa chekurerutsa syntax, kugadzira kodhi yekunyora yebvunzo nekukurumidza.

Pasi pehodhi, inomhanya su PHPUnit, sechimwe chikamu, kungoyedza kuderedza zvimwe zvikamu zvakafanodzokororwadefinguva yeiyo PHPUnit kodhi.

Ngatitarisei muenzaniso. Rangarira pre feature test classdefiwakagara muLaravel? Ndichakuyeuchidza:

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);
    }
}

Unoziva here kuti bvunzo imwe chete ingataridzika sei nePEST?

test('the application returns a successful response')->get('/')->assertStatus(200);

Hongu, MUMWE mutsara wekodhi uye ndizvozvo. Saka, chinangwa chePEST ndechekubvisa pamusoro pe:

  • Kugadzira makirasi uye nzira dzezvese;
  • Kuwedzera nyaya yekuedza;
  • Nekuisa zviito pamitsetse yakasiyana: muPEST unogona kuzvibatanidza pamwechete.

Kugadzira PEST bvunzo muLaravel, unofanirwa kutsanangura imwe mureza:

php artisan make:test HomepageTest --pest

Nezvekunyora uku, PEST inonyanya kufarirwa pakati pevagadziri veLaravel, asi ndizvo zvako zvaunoda kuti ushandise ichi chekuwedzera chishandiso uye kudzidza syntax yayo, pamwe neiyo PHPUnit noti.

BlogInnovazione.it

Innovation newsletter
Usarasikirwa nenhau dzakanyanya kukosha dzekuvandudza. Nyora kuti uvagamuchire neemail.

Zvinyorwa zvekare

Veeam inoratidzira yakanyatso tsigiro yerudzikinuro, kubva padziviriro kusvika pakupindura uye kupora

Coveware neVeeam icharamba ichipa cyber kubira chiitiko mhinduro masevhisi. Coveware ichapa forensics uye kugadzirisa kugona…

23 April 2024

Green uye Digital Revolution: Sei Predictive Maintenance iri Kushandura Oiri & Gasi Indasitiri

Kufanofungidzira kugadzirisa kuri kushandura chikamu cheoiri & gasi, nemaitiro matsva uye akasimba ekutarisira zvidyarwa.…

22 April 2024

UK antitrust regulator inosimudza BigTech alarm pamusoro peGenAI

Iyo UK CMA yakapa yambiro nezvemaitiro eBig Tech mumusika wehungwaru hwekugadzira. Ikoko…

18 April 2024

Casa Green: shanduko yesimba kune ramangwana rakagadzikana muItari

Chirevo che "Case Green", chakagadzirwa neEuropean Union kuti chiwedzere kushanda nesimba kwezvivakwa, chapedza hurongwa hwayo hwemutemo ne…

18 April 2024