In onze vorige dit artikel, zagen we de configuraties in Cypress en verschillende opties die kunnen worden geconfigureerd in JSON-bestanden. Dit artikel zal het begrijpen Cypress Belofte en Cypress asynchroon gedrag met hands-on implementatie en voorbeelden in ons project. We zullen ook bespreken hoe we waits kunnen opnemen in onze asynchrone code en enkele essentiële functies zoals: wrap()
en task()
. Laten we beginnen!
Cypress Promise en Cypress Asynchroon:
Cypress Belofte en Cypress asynchroon natuur zijn enkele van de essentiële concepten. Net als elk ander Javascript-framework draait Cypress ook om Asynchronous en Promises. Cypress verwerkt al het asynchrone gedrag intern en is verborgen voor de gebruiker. We zullen gebruiken .then()
om beloften handmatig af te handelen in onze code. Er zijn externe pakketten zoals Cypress-promise in npm waar we het asynchrone gedrag van Cypress kunnen manipuleren. We zullen elk van deze onderwerpen in detail bespreken.
Inhoudsopgave
Cypress asynchroon
Zoals we weten, is Cypress gebaseerd op: Knooppunt JS. Elk framework dat is geschreven vanuit Node.js is asynchrone. Voordat we het asynchrone gedrag van Cypress begrijpen, moeten we het verschil weten tussen synchrone en asynchrone aard.
Synchrone natuur
In een synchroon programma, tijdens het uitvoeren van een code, wordt alleen als de eerste regel met succes wordt uitgevoerd, de tweede regel uitgevoerd. Het wacht tot de eerste regel wordt uitgevoerd. Het loopt opeenvolgend.
Asynchrone aard
De code wordt gelijktijdig uitgevoerd, wacht tot elke stap wordt uitgevoerd zonder de status van de vorige opdracht te storen. Hoewel we onze code achtereenvolgens hebben geschreven, wordt asynchrone code uitgevoerd zonder te wachten op het voltooien van een stap en is deze volledig onafhankelijk van de vorige opdracht/code.
Wat is asynchroon in Cypress?
Alle Cypress-commando's zijn asynchroon van aard. Cypress heeft een wrapper die de sequentiële code die we schrijven begrijpt, deze in de wrapper plaatst en later wordt uitgevoerd wanneer we de code uitvoeren. Cypress doet dus al ons werk dat te maken heeft met asynchrone natuur en beloften!
Laten we er een voorbeeld van begrijpen.
it('klik op de technologie-optie om naar de technologie-URL te navigeren', function () cy.visit('https://techiescience.com/') // Er wordt geen opdracht uitgevoerd //klik op de technologie-optie cy. get('.fl-node-5f05604c3188e > .fl-col-content > .fl-module > .fl-module-content > .fl-photo > .fl-photo-content > a > .fl-photo-img' ) // Hier wordt ook niets uitgevoerd .click() // Er gebeurt nog niets cy.url() // Ook hier worden geen opdrachten uitgevoerd .should('include', '/technology') // Nee, niets. }); // Nu zijn alle testfuncties uitgevoerd // Cypress heeft alle opdrachten in de wachtrij geplaatst en nu worden ze achter elkaar uitgevoerd
Dat was vrij eenvoudig en leuk. We hebben nu begrepen hoe Cypress Asynchronous-opdrachten werken. Laten we dieper ingaan op waar we synchronisatie- en asynchrone code proberen te combineren.
Cypress synchrone en asynchrone opdrachten mengen
Zoals we zagen, zijn Cypress-commando's asynchroon. Bij het injecteren van synchrone code wacht Cypress niet tot de synchronisatiecode wordt uitgevoerd; vandaar dat de synchronisatiecommando's als eerste worden uitgevoerd, zelfs zonder te wachten op eerdere Cypress-commando's. Laten we een kort voorbeeld bekijken om het beter te begrijpen.
it('klik op de technologie-optie om naar de technologie-URL te navigeren', function () cy.visit('https://techiescience.com/') //klik op de technologie-optie cy.get('.fl- node-5f05604c3188e > .fl-col-content > .fl-module > .fl-module-content > .fl-photo > .fl-photo-content > a > .fl-photo-img') .click() cy .url() // Ook hier worden geen opdrachten uitgevoerd .should('include', '/technology') // Nee, niets. console.log("Dit is om het log te controleren") // Logboek om het async-gedrag te controleren }); });
Het logboek wordt toegevoegd aan het einde van de code, wat een synchronisatieopdracht is. Wanneer we de test uitvoeren, kunt u zien dat het logboek al is afgedrukt voordat de pagina is geladen. Op deze manier wacht Cypress niet op het synchrone commando en voert het uit zelfs voordat het zijn commando's uitvoert.
Als we willen dat ze worden uitgevoerd zoals verwacht, moeten we het in de .then()
functie. Laten we het begrijpen met een voorbeeld.
it('klik op de technologie-optie om naar de technologie-URL te navigeren', function () cy.visit('https://techiescience.com/') //klik op de technologie-optie cy.get('.fl- node-5f05604c3188e > .fl-col-content > .fl-module > .fl-module-content > .fl-photo > .fl-photo-content > a > .fl-photo-img') .click() cy .url() // Ook hier worden geen opdrachten uitgevoerd .should('include', '/technology') // Nee, niets. .then(() => { console.log("Dit is om het log te controleren") // Log in om het asynchrone gedrag te controleren }); });
Wat is Cypress Promise?
Zoals we hierboven zagen, plaatst Cypress alle opdrachten in de wachtrij voordat ze worden uitgevoerd. Om het in detail te herformuleren, kunnen we zeggen dat: Cypress voegt beloften (commando's) toe aan een keten van beloften. Cypress somt alle opdrachten op als een belofte in een ketting.
Om Beloften te begrijpen, vergelijk ze met een realistisch scenario. De uitleg definieert de Belofte ook in asynchrone aard. Als iemand je iets belooft, doen ze ofwel verwerpen or vervullen de verklaring die ze hebben afgelegd. Evenzo, in asynchroon, belooft ofwel verwerpen or vervullen de code die we in een belofte inpakken.
Cypress zorgt echter voor alle beloften en het is niet nodig om ze te manipuleren met onze aangepaste code. Als Javascript-programmeurs worden we nieuwsgierig naar het gebruik van wacht in onze bevelen. Cypress API's zijn compleet anders dan we in het algemeen gewend zijn. We zullen hier in een later deel van deze tutorial dieper op ingaan.
Staten van cipresbeloften
Beloften hebben drie verschillende statussen op basis van de Cypress-commando's. Zij zijn
- Vastbesloten – Treedt op wanneer de stap/opdracht met succes wordt uitgevoerd.
- In behandeling – Vermeld waar de executie is begonnen, maar het resultaat is onzeker.
- Afwijzing – Treedt op wanneer de stap is mislukt.
Als Javascript-programmeur hebben we de neiging om beloften in onze code te schrijven en deze terug te sturen. Bijvoorbeeld,
//Deze code is alleen bedoeld ter demonstratie write('Cypress Voorbeeld ', function () { it('klik op de technologie-optie om naar de technologie-URL te navigeren', function () { cy.visit('https://techiescience. com/') //klik op de technologie-optie cy.get('.fl-node-5f05604c3188e > .fl-col-content > .fl-module > .fl-module-content > .fl-photo > .fl- photo-content > a > .fl-photo-img') .then(() => { return cy.click(); }) cy.url() .then(() => { return cy.should(' omvatten', '/technologie') }) }); });
Hier geven we beloften terug aan elk van de commando's. Dit is niet vereist in Cypress. Gelukkig zorgt Cypress intern voor alle beloften en hoeven we niet bij elke stap beloftes toe te voegen. Cypress heeft de herkansbaarheid optie, waar het gedurende een bepaalde tijd opnieuw probeert om de opdracht uit te voeren. We zullen een voorbeeld van een code zien zonder handmatig toezeggingen op te nemen.
it('klik op de technologie-optie om naar de technologie-URL te navigeren', function () cy.visit('https://techiescience.com/') //klik op de technologie-optie cy.get('.fl- node-5f05604c3188e > .fl-col-content > .fl-module > .fl-module-content > .fl-photo > .fl-photo-content > a > .fl-photo-img') .click() cy .url() .should('include', '/technologie') }); });
Bovenstaande code is niet onhandig en gemakkelijk te lezen en te begrijpen. Cypress handelt al het beloofde werk af en is verborgen voor de gebruiker. We hoeven ons dus geen zorgen te maken over het afhandelen of retourneren van de beloften waar dan ook!
Hoe gebruik je wait in Cypress?
Zoals hierboven besproken, heeft Cypress zijn manier om asynchrone code te verwerken door een opdrachtwachtrij te maken en deze in volgorde uit te voeren. Toevoegen awaits
naar de commando's zal niet werken zoals verwacht. Aangezien Cypress alles intern afhandelt, raad ik aan om niet toe te voegen awaits
naar de code.
Als u waits moet toevoegen, kunt u een bibliotheek van derden gebruiken, zoals Cypress-belofte dat verandert hoe Cypress werkt. Met deze bibliotheek kun je Beloften in de commando's, en gebruik wachten in de code
Laten we de manieren begrijpen om wacht te gebruiken en hoe ze niet te gebruiken.
Je moet wachten niet op deze manier gebruiken
//Gebruik niet op deze manier wachten beschrijven('Bezoek de pagina', () => { (async () => cy.visit('https://techiescience.com/') wachten op cy.url(). zou('include', '/technologie'); })() })
In plaats daarvan kun je het zo gebruiken
beschrijven('Bezoek de pagina', () => { cy.visit('https://techiescience.com/').then(async () => wacht op cy.url().should('include', ' /technologie') ()) })
Dit werkt voor alle Cypress-opdrachten.
Cipres Wrap
wrap()
is een functie in Cypress die elk object oplevert dat als argument wordt doorgegeven.
Syntaxis
cy.wrap(subject)
cy.wrap(subject, options)
Laten we eens kijken naar een voorbeeld van hoe toegang te krijgen wrap()
in onze code.
const getName = () => { return 'Horse' } cy.wrap({ name: getName }).invoke('name').should('eq', 'Paard') // true
In het voorbeeld wikkelen we de getName
en roep dan de naam ervoor op.
Cypress Wrap Belofte
We kunnen de beloften die door de code worden geretourneerd, inpakken. Opdrachten wachten tot de belofte is opgelost voordat ze toegang krijgen tot de opgeleverde waarde en. ga dan verder met het volgende commando of de volgende bewering.
const customPromise = new Promise((resolve, reject) => { // we gebruiken de setTimeout() functie om toegang te krijgen tot asynchrone code. setTimeout(() => { resolve({ type: 'success', message: 'Apples and Oranges' , }) }, 2500) }) it('zou moeten wachten tot beloften worden opgelost', () => { cy.wrap(customPromise).its('message').should('eq', 'Apples and Oranges' ) });
Wanneer het argument in cy.wrap()
een belofte is, zal het wachten tot de belofte wordt opgelost. Als de belofte wordt afgewezen, mislukt de test.
Cypress-belofte npm
Als we de beloften van Cypress willen manipuleren, kunnen we bovendien een bibliotheek of pakket gebruiken met de naam Cypress-belofte en neem het op in onze code. Met dit pakket kunt u een Cypress commando in een belofte en stelt u in staat om af te wachten of te asynchroniseren in de code. Deze voorwaarden zullen echter niet werken before
or beforeEach
de blokken. In eerste instantie moeten we het pakket in ons project installeren door de volgende opdracht in de terminal door te geven.
npm i cypress-promise
Na installatie ziet de terminal er ongeveer zo uit.
Na de installatie moeten we de bibliotheek in ons testbestand importeren.
import promisify from 'cypress-promise'
Met deze bibliotheek kunt u de native Cypress-belofte maken en negeren en gebruiken in afwachting en asynchrone code in de code. U moet toegang krijgen tot de belofte met de promisify
trefwoord. Laten we eens kijken naar een voorbeeld voor hetzelfde.
import promisify van 'cypress-promise' it('should tests with async/wait', async () => { const apple = wait promisify(cy.wrap('apple')) const oranges = wait promisify(cy.wrap ('sinaasappels')) expect(appel).to.equal('apple') expect(sinaasappels).to.equal('sinaasappels') });
Dit was heel eenvoudig en leuk om te leren! Op deze manier kunt u asynchrone code toewijzen in Cypress.
Cypress asynchrone taak
task()
is een functie in Cypress die de code uitvoert in Node. Met deze opdracht kunt u van browser naar knooppunt schakelen en opdrachten in het knooppunt uitvoeren voordat het resultaat naar de code wordt geretourneerd.
Syntaxis
cy.task(event)
cy.task(event, arg)
cy.task(event, arg, options)
task()
geeft een waarde of belofte terug. task()
zal mislukken als de belofte wordt geretourneerd als: undefined
. Op deze manier helpt het de gebruiker typefouten vast te leggen waar de gebeurtenis in sommige scenario's niet wordt afgehandeld. Als u geen waarde hoeft te retourneren, geef dan door null
waarde.
Veelgestelde Vragen / FAQ
Is Cypress synchroon of asynchroon?
cipres is Asynchronous door de opdrachten in de wachtrij te retourneren in plaats van te wachten op de voltooiing van de uitvoering van de opdrachten. Hoewel het asynchroon is, voert het nog steeds alle teststappen opeenvolgend uit. Cypress Engine verwerkt al dit gedrag.
Is het mogelijk om de belofteketen in Cypress te vangen?
Cypress is zo ontworpen dat we de beloften niet kunnen waarmaken. Deze opdrachten zijn niet bepaald Beloften, maar het lijkt wel een belofte. Op deze manier kunnen we geen expliciete handlers toevoegen zoals catch
.
Hallo...Ik ben Aishwarya Lakshmi, heb mijn B.Tech afgerond en heb bijna 2+ jaar ervaring in het testdomein. Ik ben een testliefhebber en gepassioneerd door testen. Ik ontdek graag nieuwe dingen in mijn vakgebied en deel deze met mijn collega's. Ik geniet ervan om in mijn vrije tijd blogs te schrijven op de eenvoudigste maar effectieve manier. Als tester houd ik ervan om dingen tot in de perfectie te hebben, dus ik wens dat mijn lezers de technologie perfect begrijpen. Ik houd mezelf op de hoogte van de nieuwe technologieën met betrekking tot testen en besteed tijd aan het begrijpen ervan. Ik help studenten graag de concepten bij het testen te begrijpen.
Hallo medelezer,
We zijn een klein team bij Techiescience, dat hard werkt tussen de grote spelers. Als je het leuk vindt wat je ziet, deel dan onze inhoud op sociale media. Uw steun maakt een groot verschil. Bedankt!