[{"data":1,"prerenderedAt":1040},["ShallowReactive",2],{"article-de-common-shopware-testing-pitfalls":3},{"id":4,"title":5,"alt":6,"author":7,"body":10,"canonical":1020,"createdAt":1021,"description":1022,"extension":1023,"img":1024,"meta":1025,"navigation":450,"otherLanguages":1026,"path":1031,"seo":1032,"stem":1033,"tags":1034,"__hash__":1039},"articles_de\u002Farticles\u002Fde\u002Fcommon-shopware-testing-pitfalls.md","Moe's Anmerkungen zu den Fallstricken der Testautomatisierung bei Shopware","common Shopware testing traps",{"name":8,"image":9},"Ramona Schwering","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F29896429?s=120&v=4",{"type":11,"value":12,"toc":998},"minimark",[13,25,33,38,43,51,55,64,113,116,134,137,155,158,162,169,173,177,180,235,240,243,247,250,371,374,377,386,389,393,397,406,409,412,458,462,465,468,471,598,602,605,608,615,736,740,744,747,772,775,788,792,795,798,801,877,880,899,902,925,932,940,944,947,985,994],[14,15,16,17,24],"p",{},"Dieser Artikel sollte Teil spezifischer Hilfsressourcen sein, die Dir zeigen, wie Du fehlerhafte Pipelines überprüfen, debuggen und beheben kannst.\nIn gewisser Weise ist dies eine Art Merkblatt für all die kleinen Probleme, die mir in meiner täglichen Arbeit oder als Fragen in\nStackOverflow oder über ",[18,19,23],"a",{"href":20,"rel":21},"http:\u002F\u002Fshopwarecommunity.slack.com",[22],"nofollow","Shopware's community slack"," helfen. Notizen dienen als Checkpoint für Gedanken, richtig?",[26,27,30],"hint",{"title":28,"type":29},"","info",[14,31,32],{},"Aktualisiert am 28. September 2021\" message=\"Es ist ein lebendiges Dokument, Du kannst also gerne etwas dazu beitragen, Dich bei mir melden und zu einem späteren Zeitpunkt nachsehen, ob neue Fallstricke entdeckt wurden",[34,35,37],"h2",{"id":36},"allgemeine-dinge","Allgemeine Dinge",[39,40,42],"h3",{"id":41},"honorable-mention","Honorable mention",[14,44,45,46,50],{},"Ich habe bereits einen ",[18,47,49],{"href":48},"\u002Fde\u002Fblog\u002Fsmashing-common-pitfall-traps\u002F","Leitfaden",", wie Du Deine Tests auf allgemeine, häufige Fallstricke überprüfen kannst.\nEr könnte für Dich hilfreich sein, wenn Du Dir einen Überblick über alle Informationen zu diesem Thema verschaffen möchtest.",[39,52,54],{"id":53},"gibt-es-bereits-voreinstellungen-tests-oder-andere-testbezogene-inhalte-von-shopware","Gibt es bereits Voreinstellungen, Tests oder andere testbezogene Inhalte von Shopware?",[14,56,57,58,63],{},"Natürlich gibt es das. ",[18,59,62],{"href":60,"rel":61},"https:\u002F\u002Fgithub.com\u002Fshopware\u002Fplatform",[22],"Shopware 6"," ist quelloffen, ebenso wie alle seine Tests.\nDu kannst also alles, was mit unseren Tests zu tun hat, in diesem Repository finden:",[65,66,67,81,95,106],"ul",{},[68,69,70,71,75,76],"li",{},"PHPUnit-Tests findest Du als ",[72,73,74],"code",{},"Test","-Ordner in vielen Verzeichnissen des ",[18,77,80],{"href":78,"rel":79},"https:\u002F\u002Fgithub.com\u002Fshopware\u002Fplatform\u002Ftree\u002Ftrunk\u002Fsrc\u002FCore",[22],"Core-Bundles",[68,82,83,84,89,90],{},"Jest-Tests für ",[18,85,88],{"href":86,"rel":87},"https:\u002F\u002Fgithub.com\u002Fshopware\u002Fplatform\u002Ftree\u002Ftrunk\u002Fsrc\u002FStorefront\u002FResources\u002Fapp\u002Fstorefront\u002Ftest",[22],"Storefront"," und ",[18,91,94],{"href":92,"rel":93},"https:\u002F\u002Fgithub.com\u002Fshopware\u002Fplatform\u002Ftree\u002Ftrunk\u002Fsrc\u002FAdministration\u002FResources\u002Fapp\u002Fadministration\u002Ftest",[22],"Administration",[68,96,97,98,89,102],{},"Cypress-Tests für ",[18,99,88],{"href":100,"rel":101},"https:\u002F\u002Fgithub.com\u002Fshopware\u002Fplatform\u002Ftree\u002Ftrunk\u002Fsrc\u002FStorefront\u002FResources\u002Fapp\u002Fstorefront\u002Ftest\u002Fe2e",[22],[18,103,94],{"href":104,"rel":105},"https:\u002F\u002Fgithub.com\u002Fshopware\u002Fplatform\u002Ftree\u002Ftrunk\u002Fsrc\u002FAdministration\u002FResources\u002Fapp\u002Fadministration\u002Ftest\u002Fe2e",[22],[68,107,108],{},[18,109,112],{"href":110,"rel":111},"https:\u002F\u002Fgithub.com\u002Fshopware\u002Fplatform\u002Fblob\u002Ftrunk\u002F.gitlab-ci.yml",[22],"Pipeline-Konfiguration",[14,114,115],{},"Was die Dokumentation betrifft, so gibt es bereits eine Menge Inhalt zu entdecken:",[65,117,118,126],{},[68,119,120,125],{},[18,121,124],{"href":122,"rel":123},"https:\u002F\u002Fdeveloper.shopware.com\u002Fdocs\u002Fguides\u002Fplugins\u002Fplugins\u002Ftesting",[22],"Testbereich"," in den Shopware-Entwicklerdokumenten",[68,127,128,133],{},[18,129,132],{"href":130,"rel":131},"https:\u002F\u002Fdeveloper.shopware.com\u002Fdocs\u002Fresources\u002Fguidelines\u002Ftesting",[22],"Testing best practises"," im Zusammenhang mit Shopware",[14,135,136],{},"Aber das ist noch nicht alles. Shopware stellt einige voreingestellte Plugins zur Verfügung, um Sie mit Helper und Commands zu versorgen:",[65,138,139,147],{},[68,140,141,146],{},[18,142,145],{"href":143,"rel":144},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@shopware-ag\u002Fe2e-testsuite-platform",[22],"E2E Platform Testsuite"," für Shopware 6",[68,148,149,154],{},[18,150,153],{"href":151,"rel":152},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@shopware-ag\u002Fjest-preset-sw6-admin",[22],"Jest Test preset"," für Shopware 6 Administrationstests",[14,156,157],{},"Du kannst sie gerne ausprobieren. 💙",[39,159,161],{"id":160},"kann-ich-auf-die-psh-skripte-verzichten","Kann ich auf die PSH-Skripte verzichten?",[14,163,164,165,168],{},"Ja, sicher! Das sollte einfach sein, denn Du kannst einfach die normalen Befehle verwenden. So zum Beispiel mit Cypress:\nVerwende einfach den Pfad zum Stammverzeichnis Deines Tests (oder navigiere dorthin) und dann ",[72,166,167],{},".\u002Fnode_modules\u002F.bin\u002Fcypress open",".\nMit Jest und natürlich PHPUnit sollte es das Gleiche sein. Die PSH-Skripte dienen als Wrapper um die Standardbefehle, also kannst Du Dir auch diese Skripte ansehen, um zu sehen, wie Du die Tests selbst starten kannst.",[34,170,172],{"id":171},"php-unit-tests","PHP Unit Tests",[39,174,176],{"id":175},"wieder-einmal-aktualisierungen-von-abhängigkeiten","Wieder einmal Aktualisierungen von Abhängigkeiten ...",[14,178,179],{},"Manchmal ist es sinnvoll, Versionsnummern von Abhängigkeiten nicht zu fixieren, um Fehler aufgrund von\nInkompatibilitäten oder ähnlichem zu entdecken. Nehmen wir Symfony Updates als Beispiel: Es könnte der Fall eintreten,\ndass sie ein Update veröffentlichen, das unsere Pipelines fehlschlagen lässt. Untersuchen wir einen plötzlichen Fehler in\nVerbindung mit Symfony, z.B.:",[181,182,186],"pre",{"className":183,"code":184,"language":185,"meta":28,"style":28},"language-bash shiki shiki-themes github-light github-dark","\"Parameter #5 $default of method Symfony\\\\Component\\\\Console\\\\Command\\\\Command::addOption()\n expects array\u003Cstring>|bool|string|null, int given.\",\n","bash",[72,187,188,226],{"__ignoreMap":28},[189,190,193,197,201,204,208,211,213,216,218,221,223],"span",{"class":191,"line":192},"line",1,[189,194,196],{"class":195},"sScJk","\"Parameter #5 ",[189,198,200],{"class":199},"sVt8B","$default",[189,202,203],{"class":195}," of method Symfony",[189,205,207],{"class":206},"sj4cs","\\\\",[189,209,210],{"class":195},"Component",[189,212,207],{"class":206},[189,214,215],{"class":195},"Console",[189,217,207],{"class":206},[189,219,220],{"class":195},"Command",[189,222,207],{"class":206},[189,224,225],{"class":195},"Command::addOption()\n",[189,227,229,232],{"class":191,"line":228},2,[189,230,231],{"class":195}," expects array\u003Cstring>|bool|string|null, int given.\"",[189,233,234],{"class":195},",\n",[236,237,239],"h4",{"id":238},"lösung","Lösung",[14,241,242],{},"Sicher, wir wollen auf dem neuesten Stand bleiben, aber das ist die Kehrseite der Medaille. Wenn Du also einen\nFehler in Verbindung mit Symfony siehst, stelle sicher, dass Du deren Releases überprüfst.",[39,244,246],{"id":245},"migration-schlägt-fehl","Migration schlägt fehl",[14,248,249],{},"Es kann vorkommen, dass unsere PHPUnit-Pipelines aufgrund von neuen oder geänderten Migrationen fehlschlagen. Hier\nist ein repräsentativer Fehler:",[181,251,253],{"className":183,"code":252,"language":185,"meta":28,"style":28},"In AbstractMySQLDriver.php Zeile 61:\n  Während der Ausführung von 'SELECT * FROM migration WHERE class = ?' ist eine Ausnahme aufgetreten \n  with params [\"Shopware\\\\Core\\\\Migration\\\\Migration1536232600Language\"]:\n  SQLSTATE[42S02]: Basistabelle oder Ansicht nicht gefunden: 1146 Tabelle 'sw6.migration' existiert nicht\n",[72,254,255,270,302,335],{"__ignoreMap":28},[189,256,257,260,264,267],{"class":191,"line":192},[189,258,259],{"class":195},"In",[189,261,263],{"class":262},"sZZnC"," AbstractMySQLDriver.php",[189,265,266],{"class":262}," Zeile",[189,268,269],{"class":262}," 61:\n",[189,271,272,275,278,281,284,287,290,293,296,299],{"class":191,"line":228},[189,273,274],{"class":195},"  Während",[189,276,277],{"class":262}," der",[189,279,280],{"class":262}," Ausführung",[189,282,283],{"class":262}," von",[189,285,286],{"class":262}," 'SELECT * FROM migration WHERE class = ?'",[189,288,289],{"class":262}," ist",[189,291,292],{"class":262}," eine",[189,294,295],{"class":262}," Ausnahme",[189,297,298],{"class":262}," aufgetreten",[189,300,301],{"class":199}," \n",[189,303,305,308,311,314,317,319,322,324,327,329,332],{"class":191,"line":304},3,[189,306,307],{"class":195},"  with",[189,309,310],{"class":262}," params",[189,312,313],{"class":199}," [",[189,315,316],{"class":262},"\"Shopware",[189,318,207],{"class":206},[189,320,321],{"class":262},"Core",[189,323,207],{"class":206},[189,325,326],{"class":262},"Migration",[189,328,207],{"class":206},[189,330,331],{"class":262},"Migration1536232600Language\"",[189,333,334],{"class":199},"]:\n",[189,336,338,341,344,347,350,353,356,359,362,365,368],{"class":191,"line":337},4,[189,339,340],{"class":195},"  SQLSTATE[42S02]:",[189,342,343],{"class":262}," Basistabelle",[189,345,346],{"class":262}," oder",[189,348,349],{"class":262}," Ansicht",[189,351,352],{"class":262}," nicht",[189,354,355],{"class":262}," gefunden:",[189,357,358],{"class":206}," 1146",[189,360,361],{"class":262}," Tabelle",[189,363,364],{"class":262}," 'sw6.migration'",[189,366,367],{"class":262}," existiert",[189,369,370],{"class":262}," nicht\n",[14,372,373],{},"Manchmal schlagen die Migrationstests auch direkt fehl. Was ist nun zu tun?",[236,375,239],{"id":376},"lösung-1",[14,378,379,380,385],{},"Wenn Du Migrationen schreibst, behalte immer unsere\n",[18,381,384],{"href":382,"rel":383},"https:\u002F\u002Fdeveloper.shopware.com\u002Fdocs\u002Fguides\u002Fplugins\u002Fplugins\u002Fplugin-fundamentals\u002Fdatabase-migrations",[22],"docs"," im Hinterkopf.\nWenn Du eine fehlgeschlagene Pipeline debuggen musst, kann es der erste Schritt sein, zu überprüfen, ob alle Migrationen korrekt angewendet werden.",[14,387,388],{},"Ein häufiger Fehler ist die falsche Verwendung von Sprachen. Bitte denke dran, dass obwohl Deutsch und Englisch die\nStandardsprachen sind, das nicht bedeutet, dass diese beiden Sprachen auch immer verfügbar sind!",[34,390,392],{"id":391},"jest-unit-tests","Jest Unit Tests",[39,394,396],{"id":395},"jestspyon-funktioniert-nicht-wie-erwartet","jest.spyOn() funktioniert nicht wie erwartet",[14,398,399,400,405],{},"Die jest.spyOn-Methode funktioniert nicht wie erwartet, wenn die Methode als Callback aufgerufen wird (z.B. aus der Vorlage).\nLösungen aus\n",[18,401,404],{"href":402,"rel":403},"https:\u002F\u002Fstackoverflow.com\u002Fquestions\u002F61859423\u002Fwhy-doesnt-jest-spyon-sometimes-work-on-a-vue-components-method",[22],"stackoverflow","\nusw. können die Leute verwirren, weil wir keine benannten Importe der Komponenten verwenden.",[236,407,239],{"id":408},"lösung-2",[14,410,411],{},"Die Komponente wird in einer Variablen gespeichert und das Spionieren muss vorher durchgeführt werden. Siehe hier:",[181,413,417],{"className":414,"code":415,"language":416,"meta":28,"style":28},"language-javascript shiki shiki-themes github-light github-dark","const swMeteorSingleSelect = Shopware.Component.build('sw-meteor-single-select');\n\n\u002F\u002F Fahre dann mit Deinem Test fort\n","javascript",[72,418,419,446,452],{"__ignoreMap":28},[189,420,421,425,428,431,434,437,440,443],{"class":191,"line":192},[189,422,424],{"class":423},"szBVR","const",[189,426,427],{"class":206}," swMeteorSingleSelect",[189,429,430],{"class":423}," =",[189,432,433],{"class":199}," Shopware.Component.",[189,435,436],{"class":195},"build",[189,438,439],{"class":199},"(",[189,441,442],{"class":262},"'sw-meteor-single-select'",[189,444,445],{"class":199},");\n",[189,447,448],{"class":191,"line":228},[189,449,451],{"emptyLinePlaceholder":450},true,"\n",[189,453,454],{"class":191,"line":304},[189,455,457],{"class":456},"sJ8bj","\u002F\u002F Fahre dann mit Deinem Test fort\n",[39,459,461],{"id":460},"warten-auf-das-auslösen-von-ereignissen","Warten auf das Auslösen von Ereignissen",[14,463,464],{},"Manchmal ist es notwendig, auf das Auslösen eines Ereignisses zu warten, bevor man mit dem Test fortfährt, z.B. wenn man mit einem zusammenklappbaren Panel in der Storefront arbeitet.",[236,466,239],{"id":467},"lösung-3",[14,469,470],{},"Einen Ereignis-Listener in ein Versprechen verpacken:",[181,472,474],{"className":414,"code":473,"language":416,"meta":28,"style":28},"const isEventTriggered = new Promise((resolve) => {\n   $(collapse).on('shown.bs.collapse', () => {\n      resolve();\n   });\n});\n\n\u002F\u002F Aufruf einer Methode, die das Ereignis auslöst\n$(collapse).collapse('show');\n\n\u002F\u002F Warten, bis der Event-Handler ausgelöst wurde\nawait isEventTriggered;\n",[72,475,476,507,530,538,543,549,554,560,578,583,589],{"__ignoreMap":28},[189,477,478,480,483,485,488,491,494,498,501,504],{"class":191,"line":192},[189,479,424],{"class":423},[189,481,482],{"class":206}," isEventTriggered",[189,484,430],{"class":423},[189,486,487],{"class":423}," new",[189,489,490],{"class":206}," Promise",[189,492,493],{"class":199},"((",[189,495,497],{"class":496},"s4XuR","resolve",[189,499,500],{"class":199},") ",[189,502,503],{"class":423},"=>",[189,505,506],{"class":199}," {\n",[189,508,509,512,515,518,520,523,526,528],{"class":191,"line":228},[189,510,511],{"class":195},"   $",[189,513,514],{"class":199},"(collapse).",[189,516,517],{"class":195},"on",[189,519,439],{"class":199},[189,521,522],{"class":262},"'shown.bs.collapse'",[189,524,525],{"class":199},", () ",[189,527,503],{"class":423},[189,529,506],{"class":199},[189,531,532,535],{"class":191,"line":304},[189,533,534],{"class":195},"      resolve",[189,536,537],{"class":199},"();\n",[189,539,540],{"class":191,"line":337},[189,541,542],{"class":199},"   });\n",[189,544,546],{"class":191,"line":545},5,[189,547,548],{"class":199},"});\n",[189,550,552],{"class":191,"line":551},6,[189,553,451],{"emptyLinePlaceholder":450},[189,555,557],{"class":191,"line":556},7,[189,558,559],{"class":456},"\u002F\u002F Aufruf einer Methode, die das Ereignis auslöst\n",[189,561,563,566,568,571,573,576],{"class":191,"line":562},8,[189,564,565],{"class":195},"$",[189,567,514],{"class":199},[189,569,570],{"class":195},"collapse",[189,572,439],{"class":199},[189,574,575],{"class":262},"'show'",[189,577,445],{"class":199},[189,579,581],{"class":191,"line":580},9,[189,582,451],{"emptyLinePlaceholder":450},[189,584,586],{"class":191,"line":585},10,[189,587,588],{"class":456},"\u002F\u002F Warten, bis der Event-Handler ausgelöst wurde\n",[189,590,592,595],{"class":191,"line":591},11,[189,593,594],{"class":423},"await",[189,596,597],{"class":199}," isEventTriggered;\n",[39,599,601],{"id":600},"wie-man-ein-event-auslöst","Wie man ein Event auslöst",[14,603,604],{},"Um eine bestimmte Funktionalität zu testen, ist es notwendig, ein Event programmatisch auszulösen.",[236,606,239],{"id":607},"lösung-4",[14,609,610,611,614],{},"Durch die Verwendung der ",[72,612,613],{},"jsdom","-Umgebung in Ihrer spec-Datei kannst Du auf die gesamte DOM-API zugreifen, was uns erlaubt, ein\nStandard-Ereignis oder sogar benutzerdefinierte Ereignisse zu feuern.",[181,616,618],{"className":414,"code":617,"language":416,"meta":28,"style":28},"\u002F**\n * @jest-environment jsdom\n *\u002F\ndescribe('some spec file', () => {\n    it('should react to a click event', () => {\n        const element = document.querySelector('.my-selector');\n        const clickEvent = new Event('click');\n\n        element.dispatchEvent(clickEvent);\n    });\n})\n",[72,619,620,625,630,635,651,667,690,711,715,726,731],{"__ignoreMap":28},[189,621,622],{"class":191,"line":192},[189,623,624],{"class":456},"\u002F**\n",[189,626,627],{"class":191,"line":228},[189,628,629],{"class":456}," * @jest-environment jsdom\n",[189,631,632],{"class":191,"line":304},[189,633,634],{"class":456}," *\u002F\n",[189,636,637,640,642,645,647,649],{"class":191,"line":337},[189,638,639],{"class":195},"describe",[189,641,439],{"class":199},[189,643,644],{"class":262},"'some spec file'",[189,646,525],{"class":199},[189,648,503],{"class":423},[189,650,506],{"class":199},[189,652,653,656,658,661,663,665],{"class":191,"line":545},[189,654,655],{"class":195},"    it",[189,657,439],{"class":199},[189,659,660],{"class":262},"'should react to a click event'",[189,662,525],{"class":199},[189,664,503],{"class":423},[189,666,506],{"class":199},[189,668,669,672,675,677,680,683,685,688],{"class":191,"line":551},[189,670,671],{"class":423},"        const",[189,673,674],{"class":206}," element",[189,676,430],{"class":423},[189,678,679],{"class":199}," document.",[189,681,682],{"class":195},"querySelector",[189,684,439],{"class":199},[189,686,687],{"class":262},"'.my-selector'",[189,689,445],{"class":199},[189,691,692,694,697,699,701,704,706,709],{"class":191,"line":556},[189,693,671],{"class":423},[189,695,696],{"class":206}," clickEvent",[189,698,430],{"class":423},[189,700,487],{"class":423},[189,702,703],{"class":195}," Event",[189,705,439],{"class":199},[189,707,708],{"class":262},"'click'",[189,710,445],{"class":199},[189,712,713],{"class":191,"line":562},[189,714,451],{"emptyLinePlaceholder":450},[189,716,717,720,723],{"class":191,"line":580},[189,718,719],{"class":199},"        element.",[189,721,722],{"class":195},"dispatchEvent",[189,724,725],{"class":199},"(clickEvent);\n",[189,727,728],{"class":191,"line":585},[189,729,730],{"class":199},"    });\n",[189,732,733],{"class":191,"line":591},[189,734,735],{"class":199},"})\n",[34,737,739],{"id":738},"end-to-end-tests-mit-cypress","End-to-End Tests mit Cypress",[39,741,743],{"id":742},"lokaler-fehler-beim-starten-von-cypress-in-einer-docker-umgebung","Lokaler Fehler beim Starten von Cypress in einer Docker-Umgebung",[14,745,746],{},"Wenn Du mit dem Standard-Docker-Setup von Shopware arbeitest, könntest Du über die folgende Fehlermeldung stolpern:",[181,748,750],{"className":183,"code":749,"language":185,"meta":28,"style":28},"No protocol specified (Cypress:92): Gtk-WARNING \\*\\*: 09:39:50.737: cannot open display: :0 \n",[72,751,752],{"__ignoreMap":28},[189,753,754,757,760,763,766,769],{"class":191,"line":192},[189,755,756],{"class":195},"No",[189,758,759],{"class":262}," protocol",[189,761,762],{"class":262}," specified",[189,764,765],{"class":199}," (Cypress:92): Gtk-WARNING ",[189,767,768],{"class":206},"\\*\\*",[189,770,771],{"class":199},": 09:39:50.737: cannot open display: :0\n",[236,773,239],{"id":774},"lösung-5",[14,776,777,778,783,784,787],{},"Basierend auf dieser ",[18,779,782],{"href":780,"rel":781},"https:\u002F\u002Fwww.cypress.io\u002Fblog\u002F2019\u002F05\u002F02\u002Frun-cypress-with-a-single-docker-command\u002F#Interactive-mode",[22],"Anleitung","\nmusst Du die XVFB-Nachrichten von Cypress aus dem Docker-Container heraus an einen X11-Server weiterleiten, der auf dem Host-Rechner läuft. Die erwähnte Anleitung zeigt ein Beispiel für Mac; andere Betriebssysteme erfordern möglicherweise\nandere Befehle. Ein erster Ansatzpunkt ist das Ausprobieren einer für Dich passenden xhost-Konfiguration. Ein möglicher Befehl\nkönnte ",[72,785,786],{},"xhost +local"," sein:",[34,789,791],{"id":790},"meine-tests-schlagen-nur-manchmal-fehl","Meine Tests schlagen nur manchmal fehl",[14,793,794],{},"In CI sehe ich, dass ein Test auf nicht-deterministische Weise fehlschlägt: Manchmal geht er durch, manchmal schlägt er fehl.",[236,796,239],{"id":797},"lösung-6",[14,799,800],{},"Um dieses Verhalten reproduzierbar zu machen, setze ihn bitte in eine Schleife und führe ihn ca. 20-30 Mal aus.\nIch empfehle, das in CI auszuführen, aber es ist auch möglich, das lokal zu tun.",[181,802,804],{"className":414,"code":803,"language":416,"meta":28,"style":28},"\u002F\u002F Verwende im Build Lodash, um den Test 100 Mal zu wiederholen\nCypress._.times(100, (k) => {\n   it(`typing hello ${k + 1} \u002F 100`, () => {\n       \u002F\u002F Schreibe hier Deine Testschritte rein\n   })\n})\n",[72,805,806,811,836,863,868,873],{"__ignoreMap":28},[189,807,808],{"class":191,"line":192},[189,809,810],{"class":456},"\u002F\u002F Verwende im Build Lodash, um den Test 100 Mal zu wiederholen\n",[189,812,813,816,819,821,824,827,830,832,834],{"class":191,"line":228},[189,814,815],{"class":199},"Cypress._.",[189,817,818],{"class":195},"times",[189,820,439],{"class":199},[189,822,823],{"class":206},"100",[189,825,826],{"class":199},", (",[189,828,829],{"class":496},"k",[189,831,500],{"class":199},[189,833,503],{"class":423},[189,835,506],{"class":199},[189,837,838,841,843,846,848,851,854,857,859,861],{"class":191,"line":304},[189,839,840],{"class":195},"   it",[189,842,439],{"class":199},[189,844,845],{"class":262},"`typing hello ${",[189,847,829],{"class":199},[189,849,850],{"class":423}," +",[189,852,853],{"class":206}," 1",[189,855,856],{"class":262},"} \u002F 100`",[189,858,525],{"class":199},[189,860,503],{"class":423},[189,862,506],{"class":199},[189,864,865],{"class":191,"line":337},[189,866,867],{"class":456},"       \u002F\u002F Schreibe hier Deine Testschritte rein\n",[189,869,870],{"class":191,"line":545},[189,871,872],{"class":199},"   })\n",[189,874,875],{"class":191,"line":551},[189,876,735],{"class":199},[14,878,879],{},"Wenn Du feststellst, dass es tatsächlich einige Ausfälle gibt, könntest Du damit beginnen, den Zeitplan zu überprüfen. Wenn Du lokal arbeitest, kannst Du mit dem\nfolgenden Befehl verwenden, um die Ausführung des Cypress-Tests anzuhalten und fortzusetzen:",[181,881,883],{"className":414,"code":882,"language":416,"meta":28,"style":28},"cy.pause(); \u002F\u002F Dadurch wird der Test unterbrochen, bis Du ihn manuell fortsetzt\n",[72,884,885],{"__ignoreMap":28},[189,886,887,890,893,896],{"class":191,"line":192},[189,888,889],{"class":199},"cy.",[189,891,892],{"class":195},"pause",[189,894,895],{"class":199},"(); ",[189,897,898],{"class":456},"\u002F\u002F Dadurch wird der Test unterbrochen, bis Du ihn manuell fortsetzt\n",[14,900,901],{},"When working in CI, use a temporary wait to check the timing:",[181,903,905],{"className":414,"code":904,"language":416,"meta":28,"style":28},"cy.wait(500); \u002F\u002F Zeit in ms, d.h. es wird eine halbe Sekunde lang gewartet\n",[72,906,907],{"__ignoreMap":28},[189,908,909,911,914,916,919,922],{"class":191,"line":192},[189,910,889],{"class":199},[189,912,913],{"class":195},"wait",[189,915,439],{"class":199},[189,917,918],{"class":206},"500",[189,920,921],{"class":199},"); ",[189,923,924],{"class":456},"\u002F\u002F Zeit in ms, d.h. es wird eine halbe Sekunde lang gewartet\n",[26,926,929],{"title":927,"type":928},"Vorsicht!","error",[14,930,931],{},"Verwende feste Wartezeiten nur vorübergehend, um zu debuggen. Ersetz diese Wartezeit durch eine dynamische Behauptung, wenn die\nFlakiness durch Timing-Probleme verursacht wird. Weitere Informationen findest Du in unseren Best Practices und den Cypress Best Practices.\nNatürlich solltest Du auch die Schleife entfernen, sobald Du mit dem Debuggen fertig bist.",[14,933,934,935,939],{},"Wenn Du mehr über dieses Thema erfahren willst, gibt es einen ",[18,936,938],{"href":937},"\u002Fde\u002Fblog\u002Fsmashing-flaky-tests\u002F","Artikel von mir",".",[39,941,943],{"id":942},"das-element-mit-dem-ich-interagieren-möchte-ist-nicht-mehr-verfügbar","Das Element, mit dem ich interagieren möchte, ist nicht mehr verfügbar",[14,945,946],{},"Manchmal wird ein Element neu gerendert oder verwendet eine Animation, die dazu führt, dass es für einen kurzen Moment verschwindet oder nicht\nnicht mehr zur Interaktion bereit ist. Der folgende Fehler ist der bekannteste:",[181,948,950],{"className":183,"code":949,"language":185,"meta":28,"style":28},"cy.click failed because the element has been detached from the DOM\n",[72,951,952],{"__ignoreMap":28},[189,953,954,957,960,963,966,968,971,974,977,980,982],{"class":191,"line":192},[189,955,956],{"class":195},"cy.click",[189,958,959],{"class":262}," failed",[189,961,962],{"class":262}," because",[189,964,965],{"class":262}," the",[189,967,674],{"class":262},[189,969,970],{"class":262}," has",[189,972,973],{"class":262}," been",[189,975,976],{"class":262}," detached",[189,978,979],{"class":262}," from",[189,981,965],{"class":262},[189,983,984],{"class":262}," DOM\n",[14,986,987,988,993],{},"Eigentlich gibt es viele mögliche Lösungen oder Workarounds, das wäre eine wunderbare Idee für einen eigenen Artikel, denke ich.\nIn der Zwischenzeit hat Cypress selbst eine ",[18,989,992],{"href":990,"rel":991},"https:\u002F\u002Fcypress.io\u002Fblog\u002Ftag\u002Fflake\u002F",[22],"Blog-Serie"," über viele dieser Probleme geschrieben.",[995,996,997],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":28,"searchDepth":228,"depth":228,"links":999},[1000,1005,1009,1014,1017],{"id":36,"depth":228,"text":37,"children":1001},[1002,1003,1004],{"id":41,"depth":304,"text":42},{"id":53,"depth":304,"text":54},{"id":160,"depth":304,"text":161},{"id":171,"depth":228,"text":172,"children":1006},[1007,1008],{"id":175,"depth":304,"text":176},{"id":245,"depth":304,"text":246},{"id":391,"depth":228,"text":392,"children":1010},[1011,1012,1013],{"id":395,"depth":304,"text":396},{"id":460,"depth":304,"text":461},{"id":600,"depth":304,"text":601},{"id":738,"depth":228,"text":739,"children":1015},[1016],{"id":742,"depth":304,"text":743},{"id":790,"depth":228,"text":791,"children":1018},[1019],{"id":942,"depth":304,"text":943},null,"2021-09-28T00:00:00.724Z","Manchmal schlagen unsere Pipelines fehl. Wenn das bei unseren eigenen Merge-Requests passiert, müssen wir es beheben - ich kann mir vorstellen, dass es Dir genauso geht, wenn Du mit den Tests von Shopware arbeitest. Dies sind meine Anmerkungen zu häufigen Fallen bei der Testautomatisierung im Zusammenhang mit Shopware.","md","shopware-testing-bugs\u002Fbingo.jpg",{},[1027],{"locale":1028,"name":1029,"path":1030},"en","english","\u002Fcommon-shopware-testing-pitfalls","\u002Farticles\u002Fde\u002Fcommon-shopware-testing-pitfalls",{"title":5,"description":1022},"articles\u002Fde\u002Fcommon-shopware-testing-pitfalls",[1035,1036,1037,1038],"Shopware","Unit Tests","End-To-End Tests","Testing pitfalls","EuHMp81zjiV-vU8gks3_mVqwzwoOYgSQWvBG2tKqhhE",1786914706567]