miten paikata Pythonissa?

posted in: Articles | 0

mikä on (apina-)paikkaus Pythonissa?

(monkey -) patching on menetelmä koodikäyttäytymisen muuttamiseksi sen lähdettä muuttamatta. Se tehdään ajallisesti, yleensä olemassa olevien objektien ylivoimaisten attribuuttien avulla. Objekti voi olla jonkinlainen instanssi, luokka tai jopa moduuli. Tekniikkaa käytetään yleisimmin (ab)testeissä, kun emme voi läpäistä pilkkuja yksinkertaisella tavalla.

Toinen vaikuttava esimerkki on gevent kirjasto, joka kääntyy synkroninen koodi asynkroninen käyttämällä apina-kauneuspilkku.,

– Anna on vertailukohtana se käyttää wrk:

Gevent tehty pyytää coroutine-ystävällinen kirjasto ja kiitos samanaikaisuuden, se mahdollisti esimerkissä palvelimen käsitellä yli 13,5 kertaa enemmän pyyntöjä sekunnissa.

lopulta meillä on ohjelma, jossa on coroutine-pohjainen samanaikaisuus (sama periaate kuin asynciossa tai solmussa.js), mutta sen koodi näyttää yhä synkroniselta. Emme tarvitse erityisiä, yhteistoiminnallisia kirjastoja tai Async/odota avainsanoja koodissamme. Se on kuin taikaa.

Patch-testeissä

Python sisältää apuohjelma kauneuspilkku, eli unittest.pilkata.korjaustiedosto., Oletustapa käyttää sitä on koristella testitoimintomme. Oletetaan, että meillä on Djangon näkymä, joka näyttää tältä …

ja haluaisimme testata sitä. Huomaamme, että se on riippuvainen-ApiClient toisesta moduulista. Jos haluamme testata get_stats-näkymää ennustettavalla, luotettavalla tavalla, meidän on käytettävä Testikaksikkoa Apiklientin sijaan. Siihen ei kuitenkaan ole yksinkertaista keinoa. Jos se siirrettäisiin get_stats argumenttina, voisimme yksinkertaisesti siirtää Mock sen sijaan.,

1
2
3
4

def get_stats(pyynnöstä api_client_class):
api_client = api_client_class()
…,

…mutta se ei ole tapauksessa. Voimme silti käyttää patch decorator, vaikka!

Tämä ei ole vielä loppu, mutta jos testiin laitetaan debuggeri, huomaamme, että Apiklientti.get_stats_for on nyt MagicMock:

Se tarkoittaa, että meidän pilkaten oli onnistunut. Korvasimme ongelmallisen riippuvuuden pilkalla. Muuten, jos etsit parhaita käytäntöjä käyttää pilkkuja, tutustu minun (lähes) lopullinen opas pilkkaamista Python tai miksi pilkkaaminen voi olla vaarallista, kun käytetään liikaa.,

nyt testi kuitenkin epäonnistuu, sillä get_stats saa Magicmockin odottaessaan sanakirjaa. Pilkkaa pitää hillitä. Voimme tehdä niin kulkee toinen argumentti @patch:

Patch ilman sisustusarkkitehti

patch voidaan käyttää myös tilanteessa, seimessä. Paluu tulos on Pilkata on asetettu paikka ominaisuus on paikattu:

”Python patch ei toimi!”- miten se tehdään oikein?

joskus kohtaat tilanteen, kun laastarinsisustajan tai kontekstipäällikön läsnäolosta huolimatta riippuvuus näyttää siltä kuin sitä ei olisi paikattu lainkaan., Lyhyesti, se voi johtua siitä, että on olemassa useita olemassa viittauksia asia yrität paikata. Testattavassa koodissa käytetään yhtä, mutta onnistuit paikaamaan toisen. Leikkaus onnistui, mutta potilas kuoli. Mitä tehdä?

lyhyesti sanottuna sinun on varmistettava, että paikkaat saman viitteen kuin testikäytössä oleva koodi.

katso, mihin kohtaan unittest-depotlaastaria tulee kiinnittää.pilkkaa dokumentaatio lisätietoja. Vaihtoehtoisesti voit käyttää näppärää vaihtoehtoa laastarin paikkaamiseen eli laastariin.objekti.

laastari.objekti-yksinkertaisempi saada se oikein

laastari.,objekti on kuollut helppokäyttöinen-voit vain tuoda objektin, jonka ominaisuuden haluat paikata ja kiinnittää patch.kohde:

Jos haluat käyttää laastaria.objekti menetelmää varten, tuot luokan. Jos haluat paikata.objekti toiminto tai koko luokka, tuo moduuli he elävät.

pitäisikö paikata?

(apina -) paikkausta tulee käyttää säästeliäästi. Sen pitäisi olla viimeinen keinosi. Koodissani, minulla ei ole muuta vaihtoehtoa kuin laastari ansiosta huoltosuhde injektio.

pitkän aikavälin hinta tällaisista tempuista on hyvin, hyvin korkea., Paikkaaminen tarkoittaa usein täytäntöönpanon yksityiskohtien koskettelua ja muuttamista tavalla, jota tekijät eivät ennakoineet. Tämä tuo ylimääräisiä kytköksiä asioihin,joita ei pitäisi olla. Se tarkoittaa, että niitä on vaikeampi muuttaa.

Jos todella on pakko, Paikanna vain toisen kirjaston tai moduulin yleinen API koodiisi.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *