Alat uji unit JavaScript untuk TDD

716

Saya telah melihat dan mempertimbangkan banyak pengujian unit JavaScript dan alat pengujian, tetapi tidak dapat menemukan opsi yang sesuai untuk tetap sepenuhnya mematuhi TDD. Jadi, apakah ada alat uji unit JavaScript yang sepenuhnya sesuai dengan TDD?

Mark Levison
sumber

Jawaban:

1506

Karma atau busur derajat

Karma adalah pelari uji JavaScript yang dibangun dengan Node.js dan dimaksudkan untuk pengujian unit.

Protractor adalah untuk pengujian end-to-end dan menggunakan Selenium Web Driver untuk menggerakkan tes.

Keduanya dibuat oleh tim Angular. Anda dapat menggunakan pustaka pernyataan apa pun yang Anda inginkan.

Screencast: Karma Memulai

terkait :

pro :

  • Menggunakan node.js, sangat kompatibel dengan Win / OS X / Linux
  • Jalankan tes dari browser atau tanpa kepala dengan PhantomJS
  • Jalankan pada banyak klien sekaligus
  • Opsi untuk meluncurkan, menangkap, dan secara otomatis mematikan browser
  • Opsi untuk menjalankan server / klien di komputer pengembangan atau secara terpisah
  • Jalankan tes dari baris perintah (dapat diintegrasikan ke semut / pakar)
  • Tulis tes xUnit atau gaya BDD
  • Mendukung beberapa kerangka kerja uji JavaScript
  • Tes otomatis dijalankan saat disimpan
  • Proxy meminta lintas domain
  • Kemungkinan untuk menyesuaikan:
    • Perluas untuk membungkus kerangka uji lainnya (Jasmine, Mocha, QUnit built-in)
    • Penegasan / bantahan Anda sendiri
    • Reporter
    • Peluncur Browser
  • Plugin untuk WebStorm
  • Didukung oleh Netbeans IDE

Cons :

mocha.js

Saya benar-benar tidak memenuhi syarat untuk mengomentari fitur, kekuatan, dan kelemahan mocha.js, tetapi hanya direkomendasikan kepada saya oleh seseorang yang saya percayai di komunitas JS.

Daftar fitur, sebagaimana dilaporkan oleh situs webnya:

  • dukungan browser
  • dukungan async sederhana, termasuk janji
  • pelaporan cakupan pengujian
  • dukungan string diff
  • javascript # API untuk menjalankan tes
  • status keluar yang tepat untuk dukungan CI dll
  • deteksi otomatis dan nonaktifkan pewarnaan untuk non-ttys
  • memetakan pengecualian yang tidak tertangkap ke kasus uji yang benar
  • dukungan batas waktu uji async
  • batas waktu uji khusus
  • dukungan pemberitahuan growl
  • melaporkan durasi uji
  • menyoroti tes lambat
  • dukungan pengamat file
  • deteksi kebocoran variabel global
  • opsional menjalankan tes yang cocok dengan regexp
  • keluar otomatis untuk mencegah "menggantung" dengan loop aktif
  • suite meta-menghasilkan dengan mudah & kasus uji
  • dukungan file mocha.opts
  • judul suite yang dapat diklik untuk memfilter pelaksanaan pengujian
  • dukungan node debugger
  • mendeteksi beberapa panggilan yang harus dilakukan ()
  • gunakan perpustakaan pernyataan yang Anda inginkan
  • pelaporan yang dapat diperluas, digabungkan dengan 9+ reporter
  • DSL atau "antarmuka" uji yang dapat diperluas
  • sebelum, sesudah, sebelum masing-masing, setelah setiap kait
  • dukungan transpiler sewenang-wenang (skrip kopi dll)
  • Bundel TextMate

Yolpo

Yolpo

Ini tidak ada lagi, alih-alih ke sequential.js sebagai gantinya

Yolpo adalah alat untuk memvisualisasikan pelaksanaan javascript. Pengembang Javascript API didorong untuk menulis kasus penggunaannya untuk menunjukkan dan memberi tahu API mereka. Kasus penggunaan semacam itu menjadi dasar dari uji regresi.

AVA

Logo AVA

Pelari ujian futuristik dengan dukungan bawaan untuk ES2015. Meskipun JavaScript adalah single-threaded, IO di Node.js dapat terjadi secara paralel karena sifatnya yang async. AVA mengambil keuntungan dari ini dan menjalankan tes Anda secara bersamaan, yang sangat bermanfaat untuk tes berat IO. Selain itu, file uji dijalankan secara paralel sebagai proses terpisah, memberikan Anda kinerja yang lebih baik dan lingkungan yang terisolasi untuk setiap file uji.

  • Minimal dan cepat
  • Sintaks tes sederhana
  • Menjalankan tes secara bersamaan
  • Memaksakan menulis tes atom
  • Tidak ada global tersirat
  • Lingkungan terisolasi untuk setiap file uji
  • Tulis tes Anda di ES2015
  • Janji dukungan
  • Dukungan fungsi generator
  • Dukungan fungsi Async
  • Dukungan yang dapat diobservasi
  • Pernyataan yang ditingkatkan
  • TAP o utput opsional
  • Bersihkan jejak tumpukan

Buster.js

Pelari uji JavaScript yang dibuat dengan Node.js. Sangat modular dan fleksibel. Itu datang dengan perpustakaan pernyataan sendiri, tetapi Anda dapat menambahkan sendiri jika Anda suka. The pernyataan perpustakaan dipisahkan, sehingga Anda juga dapat menggunakannya dengan uji-pelari lainnya. Alih-alih menggunakan assert(!...)atau expect(...).not..., ia menggunakan refute(...)yang merupakan twist yang bagus.

Toolkit pengujian JavaScript peramban. Itu melakukan pengujian browser dengan otomatisasi browser (pikirkan JsTestDriver), pengujian halaman HTML statis QUnit, pengujian di browser tanpa kepala (PhantomJS, jsdom, ...), dan banyak lagi. Lihatlah ikhtisar !

Toolkit pengujian Node.js. Anda mendapatkan pustaka uji kasus yang sama, pustaka pernyataan, dll. Ini juga bagus untuk browser hybrid dan kode Node.js. Tulis test case Anda dengan Buster.JS dan jalankan baik di Node.js dan di browser nyata.

Screencast: Buster.js Memulai (2:45)

pro :

  • Menggunakan node.js, sangat kompatibel dengan Win / OS X / Linux
  • Jalankan tes dari browser atau tanpa kepala dengan PhantomJS (segera)
  • Jalankan pada banyak klien sekaligus
  • Mendukung pengujian NodeJS
  • Tidak perlu menjalankan server / klien di komputer pengembangan (tidak perlu untuk IE)
  • Jalankan tes dari baris perintah (dapat diintegrasikan ke semut / pakar)
  • Tulis tes xUnit atau gaya BDD
  • Mendukung beberapa kerangka kerja uji JavaScript
  • Tunda tes alih-alih berkomentar
  • SinonJS bawaan
  • Tes otomatis dijalankan saat disimpan
  • Proxy meminta lintas domain
  • Kemungkinan untuk menyesuaikan:
    • Perluas untuk membungkus kerangka kerja pengujian lainnya (JsTestDriver bawaan)
    • Penegasan / bantahan Anda sendiri
    • Reporter (xUnit XML, titik tradisional, spesifikasi, ketuk, TeamCity, dan lainnya)
    • Kustomisasi / ganti HTML yang digunakan untuk menjalankan tes browser
  • Integrasi TextMate dan Emacs

Cons :

  • Masih dalam versi beta jadi bisa buggy
  • Tidak ada plugin untuk Eclipse / IntelliJ (belum)
  • Tidak mengelompokkan hasil berdasarkan os / browser / versi seperti TestSwarm *. Namun, itu mencetak nama dan versi browser dalam hasil pengujian.
  • Tidak ada riwayat hasil tes sebelumnya seperti TestSwarm *
  • Tidak sepenuhnya bekerja di windows pada Mei 2014

* TestSwarm juga merupakan server Integrasi Berkelanjutan, sementara Anda memerlukan server CI terpisah untuk Buster.js. Namun, itu menghasilkan laporan XML xUnit, sehingga harus mudah diintegrasikan dengan Hudson , Bamboo atau server CI lainnya.

TestSwarm

https://github.com/jquery/testswarm

TestSwarm secara resmi tidak lagi dalam pengembangan aktif sebagaimana dinyatakan pada halaman web GitHub mereka. Mereka merekomendasikan Karma, browser-runner, atau Intern.

Melati

Melati

Ini adalah kerangka kerja yang didorong oleh perilaku (sebagaimana dinyatakan dalam kutipan di bawah) yang mungkin menarik minat pengembang yang akrab dengan Ruby atau Ruby on Rails. Sintaks didasarkan pada RSpec yang digunakan untuk pengujian dalam proyek Rails.

Spesifikasi Jasmine dapat dijalankan dari halaman html (dalam mode qUnit) atau dari pelari ujian (seperti Karma).

Jasmine adalah kerangka kerja pengembangan perilaku untuk menguji kode JavaScript Anda. Itu tidak tergantung pada kerangka kerja JavaScript lainnya. Itu tidak memerlukan DOM.

Jika Anda memiliki pengalaman dengan kerangka kerja pengujian ini, silakan berkontribusi dengan info lebih lanjut :)

Beranda proyek: http://jasmine.github.io/

QUnit

QUnit berfokus pada pengujian JavaScript di peramban sambil memberikan sebanyak mungkin kenyamanan bagi pengembang. Blurb dari situs:

QUnit adalah suite uji unit JavaScript yang kuat dan mudah digunakan. Ini digunakan oleh proyek jQuery, jQuery UI, dan jQuery Mobile dan mampu menguji setiap kode JavaScript umum

QUnit membagikan beberapa riwayat dengan TestSwarm (di atas):

QUnit pada awalnya dikembangkan oleh John Resig sebagai bagian dari jQuery. Pada tahun 2008 ia memiliki rumah sendiri, nama dan dokumentasi API, yang memungkinkan orang lain menggunakannya untuk pengujian unit mereka. Pada saat itu masih tergantung pada jQuery. Sebuah penulisan ulang pada tahun 2009 memperbaikinya, sekarang QUnit berjalan sepenuhnya mandiri. Metode pernyataan QUnit mengikuti spesifikasi CommonJS Unit Testing, yang sedikit banyak dipengaruhi oleh QUnit.

Beranda proyek: http://qunitjs.com/

Sinon

Alat hebat lainnya adalah sinon.js oleh Christian Johansen, penulis Test-Driven JavaScript Development . Paling baik dijelaskan sendiri:

Mata-mata uji mandiri, bertopik dan mengejek untuk JavaScript. Tidak ada dependensi yang berfungsi dengan kerangka pengujian unit apa pun.

Magang

Situs Web Intern menyediakan perbandingan fitur langsung dengan kerangka kerja pengujian lain pada daftar ini. Ini menawarkan lebih banyak fitur di luar kotak daripada sistem pengujian berbasis JavaScript lainnya.

BERSENDA GURAU

Kerangka pengujian baru namun sangat kuat. Ini memungkinkan pengujian berbasis snapshot juga ini meningkatkan kecepatan pengujian dan menciptakan dinamika baru dalam hal pengujian

Lihat salah satu pembicaraan mereka: https://www.youtube.com/watch?v=cAKYQpTC7MA

Lebih baik lagi: Memulai

gregers
sumber
2
Jasmine dapat bekerja tanpa kepala menggunakan V8, tetapi Anda juga dapat menggunakannya secara interaktif. Meskipun DOM tidak diperlukan sehubungan dengan Jasmine, basis kode Anda mungkin mengakses DOM. Dengan disiplin, adalah mungkin untuk menghilangkan, menjaga dengan kondisi, atau memberikan ejekan untuk bagian-bagian dari kode yang mengakses DOM dan menjalankan pengujian sepenuhnya terpisah dari perlengkapan HTML. Anda juga bisa mendapatkan dukungan baris perintah dan perlengkapan menggunakan add-on.
jerseyboy
2
@ rehevkor5: Selenium untuk pengujian integrasi, sedangkan alat di sini untuk pengujian unit. typemock.com/unit-tests-integration-tests
gregers
26
Hampir setiap pelari uji bergantung pada browser. Wtf, tidak adakah yang pernah menjalankan tes unit hanya di sisi server ????
2
Bukankah lebih baik membagi / membagi setiap alternatif dalam jawaban yang berbeda? Mungkin membatalkan suara saat ini, tapi saya pikir itu akan masuk akal.
cregox
2
@Raisen Anda dapat memasang ES 2015 ke sebagian besar dari mereka dengan Babel , tetapi AVA oleh Sindre Sorhus memilikinya.
gregers
64

Lihatlah kerangka kerja pengujian unit Dojo Object Harness (DOH) yang merupakan kerangka kerja independen yang cukup banyak untuk pengujian unit JavaScript dan tidak memiliki dependensi Dojo. Ada deskripsi yang sangat baik tentang hal itu di aplikasi pengujian Web 2.0 menggunakan Dojo Objective Harness .

Jika Anda ingin mengotomatiskan pengujian UI (titik sakit banyak pengembang) - lihat doh.robot ( perbarui sementara. Pembaruan: tautan lain http://dojotoolkit.org/reference-guide/util/dohrobot.html ) dan dijit .robotx (sementara down) . Yang terakhir ini dirancang untuk pengujian penerimaan. Memperbarui:

Artikel yang direferensikan menjelaskan cara menggunakannya, cara meniru pengguna yang berinteraksi dengan UI Anda menggunakan mouse dan / atau keyboard, dan cara merekam sesi pengujian, sehingga Anda dapat "memainkannya" secara otomatis.

Eugene Lazutkin
sumber
Terima kasih atas saran dari Dojo Object Harness, saya tidak akan pernah menemukannya. Saya menghargai saran-saran lainnya - tetapi selangkah demi selangkah.
Mark Levison
Saya sebenarnya menggunakan ini dalam proyek sebelumnya, dan merasa sangat berharga. Tapi sekali lagi, saya tidak bisa membandingkan - belum pernah menggunakan kerangka TDD lainnya.
Rakesh Pai
Terima kasih telah melaporkan tautan mati. Saya memperbarui salah satu dari mereka, dan akan mengganti tautan ke dokumen robot segera setelah saya bangun di situs web baru.
Eugene Lazutkin
Satu hal yang saya tidak suka dari DOH adalah bahwa nomor baris tidak dilaporkan ketika pernyataan gagal. Mengomentari secara manual dan menjalankan kembali tes berhasil.
Aram Kocharyan
Dojo mengganti DOH dengan kerangka pengujian TheIntern. Internet sangat kuat dan memiliki peningkatan substansial. sitepen.com/blog/2014/02/18/…
user64141
34

Chutzpah - Pelari Uji JavaScript

Saya membuat proyek open source bernama Chutzpah yang merupakan pelari uji untuk pengujian unit JavaScript. Chutzpah memungkinkan Anda untuk menjalankan tes unit JavaScript dari baris perintah dan dari dalam Visual Studio. Ini juga mendukung berjalan di server integrasi berkelanjutan TeamCity.

Matthew Manela
sumber
7
Saya baru saja mulai menggunakan Chutzpah untuk menjalankan tes Jasmine di dalam visual studio - terintegrasi dengan baik: klik kanan pada file tes dan pilih 'jalankan uji js' atau 'jalankan uji JS di browser'. Saya menjalankan tes melati yang sama menggunakan JSTestDriver. Saya lebih suka Chutzpah karena saya menentukan file mana yang saya andalkan saat dimuat di bagian atas file tes. Untuk JSTestDriver saya memerlukan file konfigurasi terpisah.
GarethOwen
26

Bagian JavaScript dari entri Wikipedia, Daftar Kerangka Pengujian Unit , menyediakan daftar pilihan yang tersedia. Ini menunjukkan apakah mereka bekerja di sisi klien, sisi server, atau keduanya.

Pete TerMaat
sumber
14

BusterJS

Ada juga BusterJS dari Christian Johansen, penulis Test Driven Javascript Development dan kerangka kerja Sinon. Dari situs:

Buster.JS adalah kerangka kerja pengujian JavaScript baru. Itu melakukan pengujian browser dengan mengotomatisasi uji berjalan di browser yang sebenarnya (pikirkan JsTestDriver), serta pengujian Node.js.

Tauren
sumber
10

google-js-test:

Kerangka pengujian JavaScript dirilis oleh Google: https://github.com/google/gjstest

  • Tes startup dan waktu eksekusi yang sangat cepat, tanpa harus menjalankan browser.
  • Bersihkan, keluaran yang dapat dibaca dalam hal lulus dan gagal tes.
  • Sebuah pelari tes berbasis browser yang hanya dapat di-refresh setiap kali JS berubah.
  • Gaya dan semantik yang menyerupai Tes Google untuk C ++.
  • Kerangka kerja mengejek bawaan yang membutuhkan kode pelat boiler minimal (mis. Tidak $tearDownatau $verifyAll) dengan gaya dan semantik yang didasarkan pada Kerangka Kerja Mengejek Google C ++ .

Saat ini tidak ada binari untuk Windows

pengguna
sumber
1
Tampaknya memiliki hampir nol minat pada Github, juga membutuhkan OS unix-base, dan saya penggemar windows yang besar, saya tidak meninggalkan rumah saya tanpa mencium mesin windows saya selamat tinggal.
vsync
8

Kami sekarang menggunakan Qunit dengan Pavlov dan JSTestDriver secara bersamaan. Pendekatan ini bekerja dengan baik untuk kita.

QUnit

Pavlov , sumber

jsTestDriver , sumber

Tom Stickel
sumber
Maukah Anda menjelaskan apa peran masing-masing dalam seluruh proses pengujian dan bagaimana mereka terhubung satu sama lain?
vsync
Maaf sudah lama dan banyak pekerjaan kontrak yang lalu mengingat detail ini.
Tom Stickel
6

Anda memiliki "berjalan di browser yang sebenarnya" sebagai pro, tetapi dalam pengalaman saya itu adalah penipu karena lambat. Tetapi yang membuatnya berharga adalah kurangnya emulasi JS yang memadai dari alternatif non-browser. Bisa jadi jika JS Anda cukup kompleks sehingga hanya tes browser yang memadai, tetapi ada beberapa opsi untuk dipertimbangkan:

HtmlUnit : "Ini memiliki dukungan JavaScript yang cukup bagus (yang terus membaik) dan mampu bekerja bahkan dengan pustaka AJAX yang cukup kompleks, mensimulasikan Firefox atau Internet Explorer tergantung pada konfigurasi yang ingin Anda gunakan." Jika emulasi ini cukup baik untuk Anda gunakan maka itu akan jauh lebih cepat daripada mengendarai browser.

Tapi mungkin HtmlUnit memiliki dukungan JS yang cukup baik tetapi Anda tidak suka Java? Maka mungkin:

Celerity : Watir API berjalan di JRuby yang didukung oleh HtmlUnit.

atau serupa

Schnell : pembungkus JRuby lain dari HtmlUnit.

Tentu saja jika HtmlUnit tidak cukup baik dan Anda harus menggerakkan peramban maka Anda dapat mempertimbangkan Watir untuk mengarahkan JS Anda .

Jeffrey Fredrick
sumber
3

Anda mungkin juga tertarik dengan kerangka kerja pengujian unit yang merupakan bagian dari qooxdoo , kerangka kerja RIA open source mirip dengan Dojo, ExtJS, dll. Tetapi dengan rantai alat yang cukup komprehensif.

Coba versi testrunner online . Petunjuk: tekan panah abu-abu di kiri atas (harus dibuat lebih jelas). Ini adalah tombol "play" yang menjalankan tes yang dipilih.

Untuk mengetahui lebih lanjut tentang kelas JS yang memungkinkan Anda menentukan tes unit Anda, lihat penampil API online .

Untuk pengujian UI otomatis (berdasarkan Selenium RC), periksa proyek Simulator .

Andreas Ecker
sumber
3

Anda harus melihat di env.js . Lihat blog saya untuk contoh cara menulis unit test dengan env.js.

Aaron Digulla
sumber
3

Kami menambahkan integrasi JUnit ke Java kami ke generator kode Javascript ST-JS ( http://st-js.org ). Kerangka kerja menghasilkan Javascript yang sesuai untuk kode yang diuji dan unit menguji dan mengirimkan kode ke browser yang berbeda.

Tidak perlu untuk server terpisah karena unit test runner membuka port http yang diperlukan (dan menutupnya setelah tes selesai). Kerangka kerja memanipulasi stacktrace Java sehingga pernyataan yang gagal ditampilkan dengan benar oleh plugin JUnit Eclipse. Berikut adalah contoh sederhana dengan jQuery dan Mockjax:

@RunWith(STJSTestDriverRunner.class)
@HTMLFixture("<div id='fortune'></div>")

@Scripts({ "classpath://jquery.js",
       "classpath://jquery.mockjax.js", "classpath://json2.js" })
public class MockjaxExampleTest {
  @Test
  public void myTest() {
    $.ajaxSetup($map("async", false));
    $.mockjax(new MockjaxOptions() {
      {
        url = "/restful/fortune";
        responseText = new Fortune() {
          {
            status = "success";
            fortune = "Are you a turtle?";
          }
        };
      }
    });

    $.getJSON("/restful/fortune", null, new Callback3<Fortune, String, JQueryXHR>() {
      @Override
      public void $invoke(Fortune response, String p2, JQueryXHR p3) {
        if (response.status.equals("success")) {
          $("#fortune").html("Your fortune is: " + response.fortune);
        } else {
          $("#fortune").html("Things do not look good, no fortune was told");
        }

      }
    });
    assertEquals("Your fortune is: Are you a turtle?", $("#fortune").html());
  }

  private static class Fortune {
    public String status;
    public String fortune;
  }
}
alex.c
sumber
2

MochiKit memiliki kerangka kerja pengujian yang disebut SimpleTest yang tampaknya sudah populer. Berikut ini posting blog dari penulis aslinya .

p.campbell
sumber
SimpleTest - pilihan bagus lainnya. Saya senang saya tidak melakukan pekerjaan investigasi di sini ;-)
Mark Levison