ไม้โปรแทรกเตอร์และกรรมใช้ร่วมกันได้หรือไม่?


104

ถ้าProtractorกำลังแทนที่ Angular Scenario Runner สำหรับการทดสอบ E2E นั่นหมายความว่าฉันจะยังสามารถใช้กับKarmaเป็นกรอบการทดสอบ E2E ของฉันได้หรือไม่


IMO คุณควรจะทำได้ กรรมเป็นเพียงผู้ทดสอบวิ่ง เมื่อคุณเขียน / สร้างกรณีทดสอบของคุณในไม้โปรแทรกเตอร์ .... กรรมควรจะสามารถรันได้เมื่อถูกถาม เช่นเดียวกับที่คุณสามารถขอให้ Karma ทำการทดสอบ E2E ในปัจจุบัน
skeep

1
@skeep Webdriver วางไข่และเชื่อมต่อกับเบราว์เซอร์ผ่านโปรโตคอล WebDriver - บางสิ่งบางอย่าง Karma ไม่รองรับ (ใช้ WebSockets และหน้าเว็บแทน) พวกเขาทำงานที่คล้ายกันในรูปแบบที่แตกต่างกันมาก การทดสอบ Karma E2E ที่เลิกใช้แล้วในขณะนี้ไม่ได้ใช้ WebDriver และต้องทนทุกข์ทรมาน - ต้องรักษาสถานะภายในเบราว์เซอร์ (สถานะ WebDriver อยู่นอกกระบวนการเบราว์เซอร์ทั้งหมด)
Andy

คำตอบ:


102

ไม่แนะนำโดยผู้ดูแลปัจจุบันของไม้โปรแทรกเตอร์:

https://github.com/angular/protractor/issues/9#issuecomment-19927049

ไม่ควรใช้ไม้โปรแทรกเตอร์และกรรมร่วมกัน แทนที่จะจัดเตรียมระบบแยกต่างหากสำหรับการทดสอบ ไม้โปรแทรกเตอร์และกรรมครอบคลุมแง่มุมต่าง ๆ ของการทดสอบ - Karma มีไว้สำหรับการทดสอบหน่วยเป็นส่วนใหญ่ในขณะที่ไม้โปรแทรกเตอร์ควรใช้สำหรับการทดสอบตั้งแต่ต้นจนจบ

ไม้โปรแทรกเตอร์สร้างขึ้นบน WebDriverJS ซึ่งใช้เซิร์ฟเวอร์ Selenium / WebDriver เพื่อจัดเตรียมเบราว์เซอร์และขับเคลื่อนการทดสอบ ตัวอย่างของ WebDriverJS แท้สามารถพบได้ที่นี่: http://code.google.com/p/selenium/wiki/WebDriverJs

และ

https://github.com/angular/protractor/issues/9#issuecomment-19931154

Georgios - ฉันคิดว่ามันสมเหตุสมผลแล้วที่จะแยก Protractor และ Karma ออกจากกัน - สำหรับการทดสอบแบบ end to end คุณต้องการการขับเคลื่อนเหตุการณ์แบบเนทีฟและความยืดหยุ่นของ webdriver ในขณะที่สำหรับการทดสอบหน่วยคุณต้องการการดำเนินการที่รวดเร็วและการจับคู่ไฟล์อัตโนมัติ


นี่ยังคงเป็นความจริงที่เราไม่ควรเรียกใช้ Protractor จาก Karma?
ErikAGriffin

@theLateWizard จริงอย่างแน่นอนไม่เพียง แต่คุณไม่ควรทำไม่ได้ :)
Dmitri Zaitsev

74

อัปเดต นี่คือแพคเกจที่ง่ายฉันได้สร้างเพื่อเพิ่มการติดตั้งกรรมน้อยที่สุดเพื่อโครงการใด ๆ npm install min-karmaที่มีคำสั่งเดียว


ผมอยากจะชี้แจงความเข้าใจผิดไปได้บางอย่างเกี่ยวกับกรรมและไม้โปรแทรกเตอร์ คำถามที่พบบ่อยเกี่ยวกับ KarmaหมายถึงAdapter สำหรับ Angular's Scenario Runnerซึ่งดูเหมือนว่าจะถูกละทิ้งโดยแนะนำให้ใช้Protractorแทน


กรรม

กรรมคือการวิ่งทดสอบที่จะเรียกใช้งาน JavaScriptไฟล์ที่ระบุไว้ในคุณแฟ้มการกำหนดค่าอย่างชัดเจนหรือใช้โหนด globs (สำหรับผู้ที่ไม่ JavaScript แม่แบบภายนอก , เชิงมุมคู่มือหน่วยทดสอบแนะนำให้ใช้พลังน้ำใจ HTML preprocessorเพื่อรวบรวมไว้ใน JavaScript แรก.)

เหล่านี้สามารถเป็นทุกไฟล์ที่มาของคุณบางส่วนของพวกเขาบางส่วนของพวกเขาบวกบางเพิ่มเติมไฟล์หรือไฟล์ที่ไม่เกี่ยวข้องกับโครงการของคุณให้เพียงบางส่วนกำหนดค่าพิเศษ - คุณชื่อมัน! คุณสามารถมีไฟล์กำหนดค่ากรรมหลายไฟล์สำหรับวัตถุประสงค์ที่แตกต่างกันซึ่งคุณสามารถเรียกใช้แบบขนานหรือทีละไฟล์ กระบวนการกรรมแต่ละเปิดตัวชุดของตัวเองของเบราว์เซอร์(เหล่านี้มีอยู่ในปัจจุบัน)

คุณลักษณะนี้ของKarma ที่จะเรียกใช้ไฟล์เพียงชุดเดียวคือสิ่งที่ทำให้เหมาะสำหรับการทดสอบอย่างรวดเร็วที่ทำงานในพื้นหลังในการแก้ไขไฟล์ต้นฉบับแต่ละครั้งและรับข้อเสนอแนะทันทีซึ่งยอดเยี่ยมมาก! ข้อเสียอย่างเดียวคือการรายงานข้อผิดพลาด "มีเสียงดัง" ซึ่งหวังว่าจะดีขึ้น!


กรรมไม่ได้มีไว้สำหรับการทดสอบหน่วยเท่านั้น

การทดสอบหน่วยใช้สำหรับซอร์สโค้ดหน่วยเดียวของคุณ ในกรณีของ Angular หน่วยทั่วไปคือ Angular Component ( Service, Factory, Provider, Controller, Filter, Directiveฯลฯ ) จำเพื่อให้คุณControllersบางการทดสอบหน่วยดังนั้นหลายเกินไปสำหรับ latters เป็นธงสีแดง

ในการทดสอบหน่วยหน่วยรหัสอื่น ๆ ทุกหน่วยที่หน่วยนี้ขึ้นอยู่ (ที่เรียกว่าการอ้างอิงของหน่วย) ไม่ควรทดสอบในเวลาเดียวกัน แต่ควรถูก "ล้อเลียน" เช่นแทนที่ด้วยสิ่งที่เรียบง่ายเช่นอินสแตนซ์หลอก เชิงมุมให้การสนับสนุนสภาพแวดล้อมที่ดีเยาะเย้ย ตามหลักการแล้วคุณต้องการเห็นการเยาะเย้ยเหล่านั้นทั้งหมดโดยตรงในการทดสอบของคุณดังนั้นคุณไม่จำเป็นต้องสงสัยว่าการอ้างอิงทั้งหมดมาจากไหน

Karmaมีประโยชน์เช่นเดียวกับการทดสอบการผสานรวมซึ่งมีการทดสอบกลุ่มของหน่วยซอร์สโค้ดร่วมกันโดยมีการเยาะเย้ยการอ้างอิงเพียงบางส่วนเท่านั้น สิ่งสำคัญคือต้องจำไว้ว่าการพึ่งพาใด ๆ เป็นค่าเริ่มต้นที่มาจากโมดูลซอร์สโค้ดของคุณ (ตราบใดที่โมดูลเหล่านั้นฉีดเข้าไปในการทดสอบของคุณโดยตรงหรือเป็นการอ้างอิงของโมดูลอื่น ๆ ที่ฉีดเข้าไป (ซึ่งในกรณีนี้คุณไม่จำเป็นต้องฉีดเข้าไป แต่ไม่เป็นอันตรายต่อการทำเช่นนั้น) การอ้างอิงที่เยาะเย้ยจะแทนที่สิ่งที่ระบุไว้

ทำงานได้อย่างรวดเร็วและบ่อยครั้งเป็นคุณสมบัติหลักของกรรม ซึ่งหมายความว่าคุณต้องการหลีกเลี่ยงการร้องขอของเซิร์ฟเวอร์แบบสอบถามฐานข้อมูลใด ๆ ที่อาจใช้เวลานานกว่าเศษเสี้ยววินาที ( มิฉะนั้นมันจะไม่เป็นอย่างรวดเร็ว! ) ผู้กระบวนการที่มีความยาวคนที่คุณต้องการที่จะเยาะเย้ย นอกจากนี้ยังอธิบายว่าเหตุใดจึงเป็นแนวทางปฏิบัติที่ไม่ดีในการนำบริการระดับต่ำเช่น$httpภายในคอนโทรลเลอร์ของคุณโดยตรงหรือหน่วยตรรกะทางธุรกิจที่ซับซ้อน ด้วยการรวมบริการการสื่อสารภายนอกระดับต่ำเหล่านั้นไว้ในบริการเฉพาะที่มีขนาดเล็กคุณจะทำให้ "เยาะเย้ยออกไป" ได้ง่ายขึ้นมาก

สิ่งที่Karma ไม่ทำคือการเรียกใช้ไซต์ของคุณอย่างที่เป็นอยู่ซึ่งเป็นการทดสอบแบบ End-to-End (E2E) โดยหลักการแล้วคุณสามารถใช้วิธีการภายในของ Angular เพื่อสร้างไซต์หรือชิ้นส่วนของไซต์ขึ้นมาใหม่ ซึ่งสำหรับชิ้นเล็ก ๆ จะมีประโยชน์และเป็นวิธีที่รวดเร็วเช่นการทดสอบคำสั่ง

อย่างไรก็ตามไม่แนะนำวิธีการโยนรหัสที่ซับซ้อนในการทดสอบของคุณ ยิ่งคุณทำมากเท่าไหร่โอกาสที่คุณจะเกิดข้อผิดพลาดในโค้ดนั้นก็มีมากขึ้นแทนที่จะเป็นสิ่งที่คุณกำลังทดสอบจริงๆ

$httpนั่นคือเหตุผลที่ผมเองไม่ชอบวิธีที่ซับซ้อนมักจะกล่าวถึงวิธีการทดสอบโดยใช้วิธีการในระดับต่ำเช่น มันทำงานได้ดีกว่าในการแยกการอ้างอิงถึงวิธีการระดับต่ำออกเป็นวิธีการเฉพาะของคุณเองซึ่งมีหน้าที่รับผิดชอบเพียงอย่างเดียวคือการร้องขอ http วิธีการเฉพาะเหล่านี้น่าจะใช้ได้กับแบ็กเอนด์จริงไม่ใช่ของปลอม! ซึ่งคุณสามารถทดสอบได้อย่างง่ายดาย - ด้วยตนเองหรือแม้กระทั่งอย่างสมบูรณ์แบบด้วยKarma ที่ทำงานร่วมกับconfig พิเศษอื่นตราบใดที่คุณไม่ผสม config นั้นกับที่มักจะใช้ในการรันKarmaสม่ำเสมอและรวดเร็ว ขณะนี้การทดสอบบริการขนาดเล็กโดยเฉพาะของคุณคุณสามารถเยาะเย้ยได้อย่างปลอดภัยและง่ายดายเพื่อทดสอบตรรกะอื่น ๆ ของคุณและนำการทดสอบเหล่านี้ไปใช้ในการตั้งค่าKarmaตามปกติของคุณ


เพื่อสรุป ใช้Karmaเพื่อเรียกใช้ไฟล์ JavaScript ชุดใดก็ได้ มัน (ควรจะ) เร็ว คุณไม่เห็นแอปที่สมบูรณ์จึงไม่สามารถทดสอบผลลัพธ์สุดท้ายได้อย่างมีประสิทธิภาพและเชื่อถือได้ ฉันจะเรียกใช้ด้วยไม้โปรแทรกเตอร์หรือไม่? ทำไมฉัน? เล่นProtractorจะชะลอตัวลงทดสอบของฉันชนะวัตถุประสงค์ของกรรม ง่ายต่อการเรียกใช้ไม้โปรแทรกเตอร์แยกกัน


ไม้โปรแทรกเตอร์

ไม้โปรแทรกเตอร์คือ:

กรอบการทดสอบ end-to-end สำหรับแอปพลิเคชัน AngularJS ไม้โปรแทรกเตอร์จะทำการทดสอบกับแอปพลิเคชันของคุณที่ทำงานในเบราว์เซอร์จริงโดยโต้ตอบกับแอปพลิเคชันในแบบเดียวกับผู้ใช้

ไม้โปรแทรกเตอร์จึงทำในสิ่งที่Karmaไม่มี - เรียกใช้แอปพลิเคชันสุดท้ายที่แท้จริงของคุณ สิ่งนี้เผยให้เห็นทั้งพลังและข้อ จำกัด :

การเรียกใช้แอปพลิเคชันที่สมบูรณ์เป็นการทดสอบขั้นสุดท้ายที่เชื่อถือได้เพียงอย่างเดียวว่าแอปพลิเคชันของคุณทำงานได้ตามที่คาดไว้ คุณสามารถเขียนสถานการณ์เรื่องราวของผู้ใช้ที่สมบูรณ์และนำไปทดสอบได้!

แต่จะยากกว่าในการติดตามข้อผิดพลาดโดยไม่แยกหน่วยของซอร์สโค้ดแต่ละหน่วย นี่คือเหตุผลที่คุณยังต้องใช้Karmaเพื่อทดสอบโค้ด JavaScript ของคุณก่อน


ตอนนี้ฉันต้องการเรียกใช้Protractorด้วยKarmaหรือไม่? ฉันสามารถเรียกใช้มันในหน้าต่างเทอร์มินัลแยกต่างหากในแบบขนาน โดยหลักการแล้วฉันสามารถให้พวกเขาแชร์ไฟล์ทดสอบได้หากจำเป็น แต่โดยปกติฉันไม่ต้องการ ทำไม? เพราะฉันต้องการให้การทดสอบของฉันมีขนาดเล็กโดยมีวัตถุประสงค์เฉพาะอย่างเดียว

ยกเว้นอย่างเดียวคือไฟล์กำหนดมาโครการทดสอบที่มีประโยชน์สำหรับนักวิ่งทั้งสองคน นี้ แต่จะไม่เป็นไฟล์ทดสอบแต่ไฟล์การกำหนดมาโคร

นอกเหนือจากนั้นฉันชอบการแยกที่ชัดเจนระหว่างการทดสอบของฉัน สิ่งเหล่านี้ต้องทำงานบ่อยและเร็วและสำหรับแอปที่สมบูรณ์ ที่ทำให้แยกชัดเจนระหว่างเมื่อใช้พลังน้ำใจและเมื่อไม้โปรแทรกเตอร์


หากฉันต้องการทดสอบหน่วยและทดสอบ e2e ฉันต้องกำหนดค่าสภาพแวดล้อมกรรมสำหรับการทดสอบหน่วยและไม้โปรแทรกเตอร์สำหรับการทดสอบ ui หรือการทดสอบ e2e
Sunil Garg

@SunilGarg ใช่ถ้าต้องการใช้ทั้งสองอย่าง แต่อย่างที่ฉันเขียน Karma ไม่ได้มีไว้สำหรับการทดสอบหน่วยเท่านั้น
Dmitri Zaitsev

1

Karma เป็นนักวิ่งทดสอบที่จัดทำโดยทีม Angular Karma จะดำเนินการทดสอบของคุณในหลายเบราว์เซอร์ซึ่งจะทำให้มั่นใจได้ว่าแอปพลิเคชันของเราเข้ากันได้กับทุกเบราว์เซอร์ การทดสอบหน่วยสำหรับ js เชิงมุมสามารถใช้กรรม + จัสมิน

จัสมินเป็นกรอบการทดสอบหน่วยจาวาสคริปต์และจะให้ยูทิลิตี้สำหรับทดสอบแอปพลิเคชันของเรา วิธีนี้ทำงานได้ดีที่สุดในเฟรมเวิร์กเชิงมุมดังนั้นเราจึงเลือกใช้ "เครื่องมือทดสอบหน่วยอัตโนมัติ" https://github.com/shahing/testingangularjs

และ Protractor เป็นกรอบการทดสอบแบบ end-to-end สำหรับแอปพลิเคชัน Angular และ AngularJS ไม้โปรแทรกเตอร์ทำการทดสอบกับแอปพลิเคชันของคุณที่ทำงานในเบราว์เซอร์จริงเบราว์เซอร์ที่ไม่มีหัวการทดสอบข้ามเบราว์เซอร์และสามารถโฮสต์บนจานรองได้

https://github.com/shahing/Protractor-Web-Automation


1

ใช่คุณสามารถใช้กรรมและไม้โปรแทรกเตอร์ร่วมกัน Karma ใช้สำหรับการทดสอบหน่วยส่วนประกอบที่คุณสร้างขึ้นโดยใช้คำสั่งเชิงมุมซึ่งคุณสามารถทดสอบส่วนประกอบเหล่านั้นโดยใช้กรรม ไม้โปรแทรกเตอร์ใช้สำหรับการทดสอบแบบ end to end ส่วนใหญ่จะใช้สำหรับการทดสอบ UI


เพื่อให้บรรลุสิ่งนี้คุณต้องเพิ่มการกำหนดค่าสำหรับทั้งกรรมและไม้โปรแทรกเตอร์
Rahul Solanki
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.