การทดสอบ Meteor ขับเคลื่อนการพัฒนา [ปิด]


120

ฉันไม่เห็นวิธีทดสอบขับเคลื่อนการพัฒนาในดาวตก

ฉันไม่เห็นมันกล่าวถึงในเอกสารหรือคำถามที่พบบ่อย ไม่เห็นมีตัวอย่างหรืออะไรแบบนั้นเลย

ฉันเห็นว่าบางแพ็คเกจใช้ Tinytest

ฉันต้องการคำตอบจากนักพัฒนาแผนงานเกี่ยวกับเรื่องนี้คืออะไร บางสิ่งบางอย่างตามแนวของ:

  • เป็นไปได้ไม่มีเอกสารใด ๆ คิดออกเอง
  • ดาวตกไม่ได้สร้างขึ้นเพื่อให้คุณสามารถสร้างแอปที่ทดสอบได้
  • นี่คือคุณสมบัติที่วางแผนไว้
  • ฯลฯ

4
ลองดูที่บล็อก xolv.ioดังที่กล่าวไว้ด้านล่างมีตัวอย่างของการสร้าง TDD Unit + End-to-end ที่เหมาะสมโดยใช้ Meteor
Xolv.io

จากน้ำเสียงของคำถามของคุณดูเหมือนว่าคุณจะรู้สึกว่า Meteor หายไปค่อนข้างมาก ในแบบที่เป็นอยู่ แต่ atmosphere.meteor.com มีแพ็คเกจสำหรับทำสิ่งต่างๆส่วนใหญ่ที่คุณนึกออกโดยการรวมไลบรารี JS ที่มีอยู่ในรูปแบบพร้อมใช้งาน มันสามารถเชื่อมโยงกับมากขึ้นในeor.com, IMHO
pipedreambomb

5
คุณควรชำระเงิน laika - arunoda.github.io/laika
Arunoda Susiripala

1
ขณะนี้การทดสอบดาวตกเป็นเรื่องยุ่ง ดูข้อมูลอัปเดตได้ที่trello.com/c/BQ3gu0no/12-official-testing-framework
Andrew Mao

คำตอบ:


83

อัปเดต 3 : ตั้งแต่ Meteor 1.3 ดาวตกมีคู่มือการทดสอบพร้อมคำแนะนำทีละขั้นตอนสำหรับการทดสอบหน่วยการรวมการยอมรับและการโหลด

การปรับปรุงที่ 2 : ณ วันที่ 9 พฤศจิกายน 2015, Velocity จะไม่ได้รับการบำรุงรักษา Xolv.io จะมุ่งเน้นความพยายามของพวกเขาในจ๋อและกลุ่มพัฒนาดาวตกต้องเลือกกรอบการทดสอบอย่างเป็นทางการ

อัปเดต : Velocityเป็นโซลูชันการทดสอบอย่างเป็นทางการของ Meteor ที่ 0.8.1


ไม่ค่อยมีใครเขียนเกี่ยวกับการทดสอบอัตโนมัติกับ Meteor ในขณะนี้ ฉันคาดหวังว่าชุมชน Meteor จะพัฒนาแนวทางปฏิบัติที่ดีที่สุดในการทดสอบก่อนที่จะสร้างสิ่งใด ๆ ในเอกสารอย่างเป็นทางการ ท้ายที่สุดแล้ว Meteor ถึง 0.5 ในสัปดาห์นี้และสิ่งต่างๆยังคงเปลี่ยนแปลงอย่างรวดเร็ว

ข่าวดี: คุณสามารถใช้เครื่องมือทดสอบ Node.jsกับ Meteorได้

สำหรับโครงการ Meteor ของฉันฉันเรียกใช้การทดสอบหน่วยของฉันกับMochaโดยใช้Chaiเพื่อยืนยัน หากคุณไม่ต้องการชุดฟีเจอร์แบบเต็มของ Chai ขอแนะนำให้ใช้should.jsแทน ฉันมีการทดสอบหน่วยในขณะนี้แม้ว่าคุณจะสามารถเขียนการทดสอบการบูรณาการกับ Mocha ได้เช่นกัน

อย่าลืมทำการทดสอบของคุณในโฟลเดอร์ "การทดสอบ"เพื่อไม่ให้ Meteor พยายามทำการทดสอบของคุณ

Mocha รองรับCoffeeScriptซึ่งเป็นภาษาสคริปต์ที่ฉันเลือกสำหรับโครงการ Meteor นี่คือตัวอย่าง Cakefile ที่มีงานสำหรับเรียกใช้การทดสอบ Mocha ของคุณ หากคุณใช้ JS กับ Meteor อย่าลังเลที่จะปรับเปลี่ยนคำสั่งสำหรับ Makefile

โมเดล Meteor ของคุณจะต้องมีการปรับเปลี่ยนเล็กน้อยเพื่อเปิดเผยตัวเองกับ Mocha และสิ่งนี้ต้องใช้ความรู้เกี่ยวกับการทำงานของ Node.js คิดว่าไฟล์ Node.js แต่ละไฟล์ถูกเรียกใช้งานภายในขอบเขตของมันเอง Meteor จะเปิดเผยออบเจ็กต์ในไฟล์ที่ต่างกันโดยอัตโนมัติ แต่แอปพลิเคชัน Node ทั่วไปเช่น Mocha จะไม่ทำเช่นนี้ เพื่อให้โมเดลของเราทดสอบได้โดย Mocha ให้ส่งออกโมเดล Meteor แต่ละแบบด้วยรูปแบบ CoffeeScript ต่อไปนี้:

# Export our class to Node.js when running
# other modules, e.g. our Mocha tests
#
# Place this at the bottom of our Model.coffee
# file after our Model class has been defined.
exports.Model = Model unless Meteor?

... และที่ด้านบนของการทดสอบ Mocha ของคุณให้นำเข้าโมเดลที่คุณต้องการทดสอบ:

# Need to use Coffeescript's destructuring to reference
# the object bound in the returned scope
# http://coffeescript.org/#destructuring
{Model} = require '../path/to/model'

ด้วยวิธีนี้คุณสามารถเริ่มเขียนและเรียกใช้การทดสอบหน่วยด้วยโครงการ Meteor ของคุณได้!


2
ฉันได้ลองแล้วและพบปัญหาเมื่อรหัสของฉันที่อยู่ระหว่างการทดสอบใช้Meteor.whateverฟังก์ชันใด ๆ ฉันได้รับ Meteor คือข้อผิดพลาดที่ไม่ได้กำหนด มีวิธีที่จะต้องใช้ Meteor อย่างชัดเจนเพื่อหลีกเลี่ยงสิ่งนี้หรือไม่?
Christian Schlensker

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

@ChristianSchlensker: หากคุณใช้ Mocha สำหรับการทดสอบการทำงาน / หน่วยในฝั่งไคลเอ็นต์คุณจะมีวัตถุ Meteor พร้อมใช้งาน ดูโค้ดตัวอย่างในคำตอบของฉันด้านล่าง
jerico

@jerico ใช่นั่นดูดีไม่ได้ใช้กับคลาสฝั่งเซิร์ฟเวอร์ใด ๆ นอกจากนี้ฉันชอบให้มอคค่า - นาฬิกาทำงานในการทดสอบหน่วยทั้งหมดตลอดเวลา พวกเขาทำงานฝั่งเซิร์ฟเวอร์ที่รวดเร็วมากซึ่งทำให้ได้รับข้อเสนอแนะในการทดสอบที่ดีมาก
Christian Schlensker

1
ขณะนี้มีการทดสอบ 1.3 ในดาวตกโปรดดูที่guide.meteor.com
bigmadwolf

44

สวัสดีทุกเช็คเอาท์laika - กรอบการทดสอบใหม่ทั้งหมดสำหรับดาวตก http://arunoda.github.io/laika/

คุณสามารถทดสอบทั้งเซิร์ฟเวอร์และไคลเอนต์พร้อมกันได้

ข้อจำกัดความรับผิดชอบ: ฉันเป็นคนเขียนไลก้า


สวัสดีอรุโณดา ขอขอบคุณที่ทำงานหนักเพื่อ Meteor ที่ StackOverflow คุณควรชี้ให้เห็นว่าคุณเป็นคนที่อยู่เบื้องหลังไลก้าอย่างไรก็ตาม
nalply

5
เป็นวิธีที่จะทำหรือไม่?
Arunoda Susiripala

1
ขอบคุณสำหรับความร่วมมือของคุณ.
nalply

14

ฉันรู้ว่าคำถามนี้มีคำตอบแล้ว แต่ฉันคิดว่าอาจใช้บริบทมากกว่านี้ในรูปแบบของคำตอบเพิ่มเติมที่ให้บริบทดังกล่าว

ฉันได้ทำบางพัฒนา app ที่มีดาวตกเช่นเดียวกับการพัฒนาแพคเกจทั้งโดยการใช้แพคเกจสำหรับหลักดาวตก, เช่นเดียวกับบรรยากาศ

ดูเหมือนคำถามของคุณอาจเป็นคำถามในสามส่วน:

  1. เราจะรันชุดทดสอบดาวตกทั้งหมดได้อย่างไร?
  2. หนึ่งจะเขียนและเรียกใช้การทดสอบสำหรับแพ็คเกจอัจฉริยะแต่ละชุดได้อย่างไร
  3. เราเขียนและเรียกใช้การทดสอบสำหรับแอปพลิเคชันของตัวเองได้อย่างไร?

และดูเหมือนว่าอาจมีคำถามโบนัสอยู่ในนั้น: 4. เราจะใช้การผสานรวมแบบต่อเนื่องสำหรับ 1, 2 และ 3 ได้อย่างไร?

ฉันได้พูดคุยและเริ่มทำงานร่วมกับNaomi Seyfer (@sixolet)ในทีมดาวตกเพื่อช่วยหาคำตอบที่ชัดเจนสำหรับคำถามเหล่านี้ทั้งหมดในเอกสาร

ผมได้ส่งคำขอดึงเริ่มต้นอยู่ที่ 1 และ 2 ไปยังแกนดาวตก: https://github.com/meteor/meteor/pull/573

ฉันเพิ่งตอบคำถามนี้ด้วย: คุณทำการทดสอบดาวตกได้อย่างไร?

ฉันคิดว่า @Blackcoat ได้ตอบ 3 ข้อข้างบนแล้ว

สำหรับโบนัส 4 ฉันขอแนะนำให้ใช้circleci.com เป็นอย่างน้อยเพื่อทำการรวมอย่างต่อเนื่องสำหรับแอพของคุณเอง ปัจจุบันพวกเขาสนับสนุนกรณีการใช้งานที่ @Blackcoat อธิบายไว้ ฉันมีโครงการที่ฉันประสบความสำเร็จในการทดสอบที่เขียนด้วยกาแฟเพื่อเรียกใช้การทดสอบหน่วยด้วยมอคค่าซึ่งค่อนข้างมากอย่างที่ @Blackcoat อธิบายไว้

สำหรับการผสานรวมอย่างต่อเนื่องบนแกนดาวตกและแพ็คเกจอัจฉริยะ Naomi Seyfer และฉันกำลังคุยกับผู้ก่อตั้ง circleci เพื่อดูว่าเราจะสามารถนำสิ่งที่ยอดเยี่ยมไปใช้ในระยะเวลาอันใกล้นี้ได้หรือไม่


12

ขณะนี้ RTD ได้เลิกใช้งานแล้วและแทนที่ด้วย Velocity ซึ่งเป็นกรอบการทดสอบอย่างเป็นทางการสำหรับ Meteor 1.0 เอกสารประกอบยังค่อนข้างใหม่เนื่องจาก Velocity อยู่ระหว่างการพัฒนาอย่างหนัก คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับrepo Velocity Githubที่ความเร็วโฮมเพจและดาวตกทดสอบคู่มือการใช้งาน (เนื้อหาจ่าย)

ข้อจำกัดความรับผิดชอบ: ฉันเป็นหนึ่งในสมาชิกทีมหลักของ Velocity และเป็นผู้เขียนหนังสือ


ตรวจสอบ RTD เป็นกรอบการทดสอบเต็มรูปแบบสำหรับดาวตกที่นี่rtd.xolv.io รองรับ Jasmine / Mocha / custom และทำงานได้กับทั้ง JS ธรรมดาและกาแฟ รวมถึงการครอบคลุมการทดสอบด้วยที่รวมความครอบคลุมของหน่วย / เซิร์ฟเวอร์ / ไคลเอนต์

และตัวอย่างโครงการที่นี่

บล็อกเพื่ออธิบายการทดสอบหน่วยด้วย Meteor ที่นี่

แนวทางการทดสอบการยอมรับ e2e โดยใช้ Selenium WebdriverJS และ Meteor ที่นี่

หวังว่าจะช่วยได้ คำเตือน: ฉันเป็นผู้เขียน RTD


6

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

วิธีนี้ง่ายมากในการเริ่มต้นหากยังไม่ได้รับการจัดทำเป็นเอกสารอย่างครบถ้วนดังนั้นฉันจึงแนะนำสำหรับผู้ที่ต้องการทำ TDD แต่ไม่แน่ใจว่าการทดสอบใน JavaScript ทำงานอย่างไรและไลบรารีใดที่เชื่อมต่อกับอะไร:

https://github.com/mad-eye/meteor-mocha-web

FYI ฉันพบว่าฉันต้องใช้แพ็คเกจ Atmosphere ของเราเตอร์เพื่อสร้างเส้นทาง '/ การทดสอบ' เพื่อเรียกใช้และแสดงผลลัพธ์จากการทดสอบเนื่องจากฉันไม่ต้องการให้แอปของฉันยุ่งทุกครั้งที่โหลด


1
นอกจากนี้คุณยังสามารถใช้meteor-mocha-webกับmocha-phantomjsการทดสอบแบบอัตโนมัติและ CI มันคือสิ่งที่เราใช้ เปิดเผยเต็ม - meteor-mocha-webฉันเป็นหนึ่งในผู้ดูแลของ
jagill

6

เกี่ยวกับการใช้งาน Tinytest คุณอาจต้องการดูแหล่งข้อมูลที่มีประโยชน์เหล่านี้:

  1. มีคำอธิบายพื้นฐานใน screencast นี้: https://www.eventedmind.com/feed/meteor-testing-packages-with-tinytest

  2. เมื่อคุณเข้าใจความคิดที่คุณจะต้องการเอกสาร API tinytestสาธารณะ สำหรับตอนนี้เอกสารเฉพาะที่อยู่ท้ายแหล่งที่มาของtinytestแพ็คเกจ: https://github.com/meteor/meteor/tree/devel/packages/tinytest

  3. นอกจากนี้ screencast พูดถึงtest-helpersคุณอาจต้องการดูตัวช่วยทั้งหมดที่มีอยู่ที่นี่: https://github.com/meteor/meteor/tree/devel/packages/test-helpers มักจะมีเอกสารบางอย่างอยู่ในแต่ละ ไฟล์

  4. การขุดในการทดสอบหีบห่อของดาวตกจะให้ตัวอย่างมากมาย วิธีหนึ่งในการทำเช่นนี้คือการค้นหาTinytest.หรือtest.ในไดเรกทอรีแพ็คเกจของซอร์สโค้ดของดาวตก


5

การทดสอบกลายเป็นส่วนสำคัญของ Meteor ในรุ่น 1.3 ที่กำลังจะมาถึง การแก้ปัญหาเบื้องต้นขึ้นอยู่กับมอคค่าและชัย

การอภิปรายเดิมของการออกแบบที่ทำงานได้ขั้นต่ำที่สามารถพบได้ที่นี่และรายละเอียดของการดำเนินการครั้งแรกที่สามารถพบได้ที่นี่

MDG ได้มีการผลิตกระดูกเริ่มต้นของเอกสารคู่มือสำหรับการทดสอบซึ่งสามารถพบได้ที่นี่และมีบางการทดสอบตัวอย่างที่นี่

นี่คือตัวอย่างการทดสอบสิ่งพิมพ์จากลิงค์ด้านบน:

  it('sends all todos for a public list when logged in', (done) => {
    const collector = new PublicationCollector({userId});
    collector.collect('Todos.inList', publicList._id, (collections) => {
      chai.assert.equal(collections.Todos.length, 3);
      done();
    });
  });

4

ฉันกำลังทำการทดสอบการทำงาน / การรวมกับ Meteor + Mocha ในเบราว์เซอร์ ฉันมีบางอย่างตามบรรทัดต่อไปนี้ (ในรูปแบบกาแฟเพื่อให้อ่านง่ายขึ้น):

บนไคลเอนต์ ...

Meteor.startup ->
    Meteor.call 'shouldTest', (err, shouldTest) ->
        if err? then throw err
        if shouldTest then runTests()

# Dynamically load and run mocha. I factored this out in a separate method so
# that I can (re-)run the tests from the console whenever I like.
# NB: This assumes that you have your mocha/chai scripts in .../public/mocha.
# You can point to a CDN, too.
runTests = ->
    $('head').append('<link href="https://stackoverflow.com/mocha/mocha.css" rel="stylesheet" />')
    $.getScript '/mocha/mocha.js', ->
      $.getScript '/mocha/chai.js', ->
        $('body').append('<div id="mocha"> </div>')
        chai.should() # ... or assert or explain ...
        mocha.setup 'bdd'
        loadSpecs() # This function contains your actual describe(), etc. calls.
        mocha.run()

... และบนเซิร์ฟเวอร์:

Meteor.methods 'shouldTest': -> true unless Meteor.settings.noTests  # ... or whatever.

แน่นอนคุณสามารถทำการทดสอบหน่วยฝั่งไคลเอ็นต์ได้ในลักษณะเดียวกัน สำหรับการทดสอบการรวมเป็นเรื่องดีที่จะมีโครงสร้างพื้นฐานของ Meteor ทั้งหมด


BTW: โซลูชันนี้เพื่อรอองค์ประกอบ DOMมีประโยชน์เมื่อทำการทดสอบการทำงานในไคลเอนต์ Meteor ด้วย jQuery
jerico

3

ดังที่ Blackcout กล่าวว่า Velocity เป็นเฟรมเวิร์ก TDD อย่างเป็นทางการสำหรับ Meteor แต่ในขณะนี้หน้าเว็บของ velocity ไม่มีเอกสารที่ดี ดังนั้นฉันขอแนะนำให้คุณดู:


โพสต์ที่เป็นประโยชน์ ขอบคุณสำหรับการแบ่งปันลิงก์
Laran Evans

2

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

จากนั้นคุณสามารถใช้ประโยชน์จาก Tinytest ของ Meteor ซึ่งเหมาะสำหรับการทดสอบแอพ Meteor


0

ฉันประสบความสำเร็จในการใช้ xolvio: แตงกวาและความเร็วในการทดสอบของฉัน ทำงานได้ดีและทำงานอย่างต่อเนื่องเพื่อให้คุณเห็นได้ตลอดเวลาว่าการทดสอบของคุณผ่าน


0

ดาวตก + TheIntern

ฉันจัดการเพื่อทดสอบแอปพลิเคชัน Meteor ด้วย TheIntern.js

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

มีexecuteฟังก์ชั่นที่ช่วยให้เราสามารถเรียกใช้รหัส JS thorugh ซึ่งเราสามารถเข้าถึงwindowวัตถุเบราว์เซอร์และด้วยเหตุMeteorนี้

ต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับการดำเนินการ

นี่คือtest suiteลักษณะของฉันสำหรับการทดสอบฟังก์ชัน

define(function (require) {
    var registerSuite = require('intern!object');
    var assert = require('intern/chai!assert');
    registerSuite({
        name: 'index',

        'greeting form': function () {
            var rem = this.remote;
            return this.remote
                .get(require.toUrl('localhost:3000'))
                .setFindTimeout(5000)
                .execute(function() {
                        console.log("browser window object", window)
                        return Products.find({}).fetch().length
                    })
                .then(function (text) {
                    console.log(text)
                    assert.strictEqual(text, 2,
                        'Yes I can access Meteor and its Collections');
                });
        }
    });
});

หากต้องการทราบข้อมูลเพิ่มเติมนี่คือส่วนสำคัญของฉัน

หมายเหตุ: ฉันยังอยู่ในช่วงเริ่มต้นของการแก้ปัญหานี้ ฉันไม่รู้ว่าฉันสามารถทำการทดสอบที่ซับซ้อนด้วยสิ่งนี้ได้หรือไม่ แต่ฉันค่อนข้างมั่นใจในเรื่องนี้


0

Velocity ยังไม่โตเต็มที่ ฉันประสบปัญหา setTimeout ในการใช้ความเร็ว สำหรับการทดสอบยูนิตฝั่งเซิร์ฟเวอร์คุณสามารถใช้แพ็คเกจนี้ได้

มันเร็วกว่าความเร็ว Velocity ต้องใช้เวลาอย่างมากในการทดสอบข้อมูลจำเพาะด้วยการเข้าสู่ระบบ ด้วยรหัสจัสมินเราสามารถทดสอบวิธีการฝั่งเซิร์ฟเวอร์และสิ่งพิมพ์ใด ๆ

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