Các công cụ kiểm tra đơn vị JavaScript cho TDD


716

Tôi đã xem xét và xem xét nhiều công cụ kiểm tra và thử nghiệm đơn vị JavaScript, nhưng không thể tìm thấy một tùy chọn phù hợp để duy trì hoàn toàn tuân thủ TDD. Vậy, có công cụ kiểm tra đơn vị JavaScript nào tuân thủ TDD hoàn toàn không?

Câu trả lời:


1506

Karma hoặc thước đo góc

Karma là một trình chạy thử nghiệm JavaScript được xây dựng với Node.js và có nghĩa là để thử nghiệm đơn vị.

Protractor dành cho thử nghiệm từ đầu đến cuối và sử dụng Selenium Web Driver để lái thử.

Cả hai đã được thực hiện bởi nhóm Angular. Bạn có thể sử dụng bất kỳ thư viện khẳng định nào bạn muốn với một trong hai.

Screencast: Karma Bắt đầu

liên quan :

ưu :

  • Sử dụng node.js, vì vậy tương thích với Win / OS X / Linux
  • Chạy thử nghiệm từ trình duyệt hoặc không đầu với PhantomJS
  • Chạy trên nhiều khách hàng cùng một lúc
  • Tùy chọn để khởi chạy, chụp và tự động tắt trình duyệt
  • Tùy chọn để chạy máy chủ / máy khách trên máy tính phát triển hoặc riêng biệt
  • Chạy thử nghiệm từ một dòng lệnh (có thể được tích hợp vào ant / maven)
  • Viết bài kiểm tra kiểu xUnit hoặc BDD
  • Hỗ trợ nhiều khung kiểm tra JavaScript
  • Tự động chạy thử nghiệm khi lưu
  • Proxy yêu cầu tên miền chéo
  • Có thể tùy chỉnh:
    • Mở rộng nó để bọc các khung kiểm tra khác (Jasmine, Mocha, QUnit tích hợp)
    • Khẳng định / bác bỏ của riêng bạn
    • Những phóng viên
    • Trình khởi chạy trình duyệt
  • Plugin cho WebStorm
  • Được hỗ trợ bởi Netbeans IDE

Nhược điểm :

mocha.js

Tôi hoàn toàn không đủ điều kiện để nhận xét về các tính năng, điểm mạnh và điểm yếu của mocha.js, nhưng nó chỉ được đề xuất cho tôi bởi một người mà tôi tin tưởng trong cộng đồng JS.

Danh sách các tính năng, như báo cáo của trang web của mình:

  • hỗ trợ trình duyệt
  • hỗ trợ async đơn giản, bao gồm cả những lời hứa
  • kiểm tra báo cáo bảo hiểm
  • chuỗi hỗ trợ khác
  • javascript # API để chạy thử nghiệm
  • trạng thái thoát thích hợp cho hỗ trợ CI, v.v.
  • tự động phát hiện và vô hiệu hóa màu cho non-ttys
  • ánh xạ các trường hợp ngoại lệ đến trường hợp kiểm tra chính xác
  • hỗ trợ thời gian chờ kiểm tra async
  • thời gian chờ cụ thể
  • hỗ trợ thông báo gầm gừ
  • báo cáo thời lượng thử nghiệm
  • làm nổi bật các bài kiểm tra chậm
  • hỗ trợ xem hồ sơ
  • phát hiện rò rỉ biến toàn cầu
  • tùy chọn chạy thử nghiệm phù hợp với một biểu thức chính
  • tự động thoát để ngăn "treo" với một vòng lặp hoạt động
  • dễ dàng tạo bộ meta & trường hợp thử nghiệm
  • hỗ trợ tập tin mocha.opts
  • tiêu đề bộ có thể nhấp để lọc thực hiện kiểm tra
  • hỗ trợ trình gỡ lỗi nút
  • phát hiện nhiều cuộc gọi để thực hiện ()
  • sử dụng bất kỳ thư viện khẳng định nào bạn muốn
  • báo cáo mở rộng, đi kèm với hơn 9 phóng viên
  • DSL thử nghiệm mở rộng hoặc "giao diện"
  • trước, sau, trước mỗi, sau mỗi móc
  • hỗ trợ transpiler tùy ý (coffee-script, v.v.)
  • Gói TextMate

lòng đỏ

lòng đỏ

Điều này không còn tồn tại, chuyển hướng đến sequential.js thay vào đó

Yolpo là một công cụ để trực quan hóa việc thực thi javascript. Các nhà phát triển API Javascript được khuyến khích viết các trường hợp sử dụng của họ để hiển thị và cho biết API của họ. Các trường hợp sử dụng như vậy tạo thành cơ sở của các bài kiểm tra hồi quy.

AVA

Logo AVA

Người chạy thử tương lai với sự hỗ trợ tích hợp cho ES2015. Mặc dù JavaScript là một luồng đơn, IO trong Node.js có thể xảy ra song song do tính chất không đồng bộ của nó. AVA tận dụng lợi thế này và chạy các bài kiểm tra của bạn đồng thời, điều này đặc biệt có lợi cho các bài kiểm tra nặng IO. Ngoài ra, các tệp kiểm tra được chạy song song dưới dạng các quy trình riêng biệt, mang lại cho bạn hiệu suất cao hơn và môi trường tách biệt cho mỗi tệp kiểm tra.

  • Tối thiểu và nhanh chóng
  • Cú pháp kiểm tra đơn giản
  • Chạy thử nghiệm đồng thời
  • Thực thi viết bài kiểm tra nguyên tử
  • Không có toàn cầu ngầm
  • Môi trường biệt lập cho mỗi tệp thử nghiệm
  • Viết bài kiểm tra của bạn trong ES2015
  • Hứa hẹn hỗ trợ
  • Hỗ trợ chức năng tạo
  • Hỗ trợ chức năng Async
  • Hỗ trợ quan sát
  • Khẳng định nâng cao
  • Tùy chọn TAP o utput
  • Làm sạch dấu vết ngăn xếp

Buster.js

Trình chạy thử nghiệm JavaScript được xây dựng với Node.js. Rất mô-đun và linh hoạt. Nó đi kèm với thư viện khẳng định riêng của nó, nhưng bạn có thể thêm thư viện của riêng bạn nếu bạn muốn. Các thư viện khẳng định được tách rời, vì vậy bạn cũng có thể sử dụng nó với thử vận động viên khác. Thay vì sử dụng assert(!...)hoặc expect(...).not..., nó sử dụng refute(...)đó là một imho xoắn đẹp.

Một bộ công cụ kiểm tra JavaScript trình duyệt. Nó thực hiện kiểm tra trình duyệt với tự động hóa trình duyệt (nghĩ JsTestDriver), kiểm tra trang HTML tĩnh kiểu QUnit, kiểm tra trong các trình duyệt không đầu (PhantomJS, jsdom, ...), v.v. Hãy nhìn vào tổng quan !

Một bộ công cụ thử nghiệm Node.js. Bạn nhận được cùng thư viện trường hợp thử nghiệm, thư viện xác nhận, v.v ... Điều này cũng tuyệt vời cho trình duyệt lai và mã Node.js. Viết trường hợp thử nghiệm của bạn với Buster.JS và chạy cả hai trong Node.js và trong một trình duyệt thực.

Screencast: Buster.js Bắt đầu (2:45)

ưu :

  • Sử dụng node.js, vì vậy tương thích với Win / OS X / Linux
  • Chạy thử nghiệm từ trình duyệt hoặc không đầu với PhantomJS (sớm)
  • Chạy trên nhiều khách hàng cùng một lúc
  • Hỗ trợ thử nghiệm NodeJS
  • Không cần chạy máy chủ / máy khách trên máy tính phát triển (không cần IE)
  • Chạy thử nghiệm từ một dòng lệnh (có thể được tích hợp vào ant / maven)
  • Viết bài kiểm tra kiểu xUnit hoặc BDD
  • Hỗ trợ nhiều khung kiểm tra JavaScript
  • Trì hoãn kiểm tra thay vì nhận xét chúng ra
  • SinonJS tích hợp
  • Tự động chạy thử nghiệm khi lưu
  • Proxy yêu cầu tên miền chéo
  • Có thể tùy chỉnh:
    • Mở rộng nó để bọc các khung kiểm tra khác (JsTestDriver tích hợp)
    • Khẳng định / bác bỏ của riêng bạn
    • Phóng viên (xUnit XML, dấu chấm truyền thống, đặc điểm kỹ thuật, nhấn, TeamCity và tích hợp nhiều hơn)
    • Tùy chỉnh / thay thế HTML được sử dụng để chạy thử nghiệm trình duyệt
  • Tích hợp TextMate và Emacs

Nhược điểm :

  • Stil trong bản beta nên có thể có lỗi
  • Không có plugin cho Eclipse / IntelliJ (chưa)
  • Không nhóm kết quả theo os / trình duyệt / phiên bản như TestSwarm *. Tuy nhiên, nó in ra tên và phiên bản trình duyệt trong kết quả kiểm tra.
  • Không có lịch sử kết quả kiểm tra trước như TestSwarm *
  • Không hoạt động đầy đủ trên windows kể từ tháng 5 năm 2014

* TestSwarm cũng là một máy chủ Tích hợp liên tục, trong khi bạn cần một máy chủ CI riêng cho Buster.js. Tuy nhiên, nó thực hiện các báo cáo XML xUnit, do đó, nó có thể dễ dàng tích hợp với các máy chủ Hudson , Bamboo hoặc CI khác.

TestSwarm

https://github.com/jquery/testswarm

TestSwarm chính thức không còn được phát triển tích cực như đã nêu trên trang web GitHub của họ. Họ đề xuất Karma, browserstack-runner hoặc Intern.

Hoa nhài

Hoa nhài

Đây là khung theo hướng hành vi (như được nêu trong trích dẫn bên dưới) có thể khiến các nhà phát triển quan tâm quen thuộc với Ruby hoặc Ruby on Rails. Cú pháp dựa trên RSpec được sử dụng để thử nghiệm trong các dự án Rails.

Thông số kỹ thuật của Jasmine có thể được chạy từ một trang html (theo kiểu qUnit) hoặc từ một người chạy thử nghiệm (dưới dạng Karma).

Jasmine là một khung phát triển dựa trên hành vi để kiểm tra mã JavaScript của bạn. Nó không phụ thuộc vào bất kỳ khung JavaScript nào khác. Nó không yêu cầu DOM.

Nếu bạn có kinh nghiệm với khung thử nghiệm này, vui lòng đóng góp với nhiều thông tin hơn :)

Trang chủ dự án: http://jasmine.github.io/

QUnit

QUnit tập trung vào việc thử nghiệm JavaScript trong trình duyệt đồng thời cung cấp càng nhiều tiện lợi cho nhà phát triển càng tốt. Blurb từ trang web:

QUnit là bộ kiểm tra đơn vị JavaScript mạnh mẽ, dễ sử dụng. Nó được sử dụng bởi các dự án jQuery, jQuery UI và jQuery Mobile và có khả năng kiểm tra bất kỳ mã JavaScript chung nào

QUnit chia sẻ một số lịch sử với TestSwarm (ở trên):

QUnit ban đầu được phát triển bởi John Resig như một phần của jQuery. Vào năm 2008, nó đã có tài liệu về nhà, tên và API của riêng mình, cho phép những người khác sử dụng nó để thử nghiệm đơn vị của họ. Tại thời điểm đó nó vẫn phụ thuộc vào jQuery. Một bản viết lại vào năm 2009 đã sửa lỗi đó, bây giờ QUnit chạy hoàn toàn độc lập. Các phương thức khẳng định của QUnit tuân theo thông số kỹ thuật Kiểm tra đơn vị CommonJS, ở một mức độ nào đó chịu ảnh hưởng của QUnit.

Trang chủ dự án: http://qunitjs.com/

Sinon

Một công cụ tuyệt vời khác là sinon.js của Christian Johansen, tác giả của Phát triển JavaScript dựa trên thử nghiệm . Mô tả tốt nhất của mình:

Các gián điệp thử nghiệm độc lập, sơ khai và giả cho JavaScript. Không phụ thuộc làm việc với bất kỳ khung thử nghiệm đơn vị.

Thực tập

Trang web thực tập cung cấp một so sánh tính năng trực tiếp với các khung thử nghiệm khác trong danh sách này. Nó cung cấp nhiều tính năng vượt trội hơn bất kỳ hệ thống thử nghiệm dựa trên JavaScript nào khác.

JEST

Một khung thử nghiệm mới nhưng rất mạnh mẽ. Nó cho phép thử nghiệm dựa trên ảnh chụp nhanh, điều này cũng làm tăng tốc độ thử nghiệm và tạo ra một động lực mới về mặt thử nghiệm

Kiểm tra một trong những cuộc nói chuyện của họ: https://www.youtube.com/watch?v=cAKYQpTC7MA

Tốt hơn nữa: Bắt đầu


2
Jasmine có thể làm việc không đầu bằng động cơ V8, nhưng bạn cũng có thể sử dụng nó một cách tương tác. Mặc dù DOM không cần thiết đối với Jasmine, nhưng cơ sở mã của bạn có thể truy cập DOM. Với kỷ luật, có thể loại bỏ, bảo vệ với các điều kiện hoặc cung cấp giả cho các phần của mã truy cập DOM và chạy thử nghiệm hoàn toàn ngoài các đồ đạc HTML. Bạn cũng có thể nhận được hỗ trợ dòng lệnh và đồ đạc bằng cách sử dụng các tiện ích bổ sung.
jerseyboy

2
@ Rehevkor5: Selenium là để thử nghiệm tích hợp, trong khi các công cụ ở đây là để thử nghiệm đơn vị. typemock.com/unit-tests-integration-tests
Gregers

26
Hầu như mọi người chạy thử đều dựa vào trình duyệt. Wtf, không ai từng chạy thử nghiệm đơn vị chỉ ở phía máy chủ ????

2
Sẽ tốt hơn nếu chia / chia từng phương án trong các câu trả lời khác nhau? Nó có thể làm mất hiệu lực phiếu bầu hiện tại cho cái này, nhưng tôi nghĩ nó có ý nghĩa nhất.
cregox

2
@Raisen Bạn có thể cắm ES 2015 vào hầu hết trong số họ với Babel , nhưng AVA bởi Sindre Sorhus có nó được xây dựng trong.
Gregers

64

Hãy xem khung kiểm tra đơn vị Dojo khai thác đối tượng (DOH), khai thác độc lập khung khá nhiều để kiểm tra đơn vị JavaScript và không có bất kỳ phụ thuộc Dojo nào. Có một mô tả rất hay về nó tại Đơn vị thử nghiệm các ứng dụng Web 2.0 bằng cách sử dụng Khai thác mục tiêu Dojo .

Nếu bạn muốn tự động hóa kiểm tra giao diện người dùng (một điểm đau của nhiều nhà phát triển) - hãy xem doh.robot (tạm thời xuống. Cập nhật: liên kết khác http://dojotoolkit.org/reference-guide/util/dohrobot.html )dijit .robotx (tạm thời xuống) . Thứ hai được thiết kế để thử nghiệm chấp nhận. Cập nhật:

Các bài viết được tham khảo giải thích cách sử dụng chúng, cách mô phỏng người dùng tương tác với giao diện người dùng của bạn bằng chuột và / hoặc bàn phím và cách ghi lại phiên kiểm tra để bạn có thể "phát" nó sau.


Cảm ơn lời đề nghị của Dojo Object Mining, tôi sẽ không bao giờ tìm thấy nó. Tôi đánh giá cao những gợi ý khác - nhưng từng bước một.
Đánh dấu Levison

Tôi thực sự đã sử dụng điều này trong một dự án trước đó và thấy nó là vô giá. Nhưng một lần nữa, tôi không thể so sánh - chưa sử dụng bất kỳ khung TDD nào khác.
Rakesh Pai

Cảm ơn đã báo cáo các liên kết chết. Tôi đã cập nhật một trong số chúng và sẽ thay thế các liên kết đến tài liệu robot ngay khi tôi lên trang web mới.
Eugene Lazutkin

Một điều tôi không thích về DOH là số dòng không được báo cáo khi các xác nhận thất bại. Nhận xét chúng bằng tay và chạy lại thử nghiệm hoạt động.
Aram Kocharyan

Dojo đang thay thế DOH bằng khung thử nghiệm TheItern. Nội bộ rất mạnh mẽ và có những cải tiến đáng kể. sitepen.com/blog/2014/02/18/ trên
dùng64141

34

Chutzpah - Người chạy thử JavaScript

Tôi đã tạo một dự án nguồn mở có tên Chutzpah, một trình chạy thử nghiệm cho các bài kiểm tra đơn vị JavaScript. Chutzpah cho phép bạn chạy thử nghiệm đơn vị JavaScript từ dòng lệnh và từ bên trong Visual Studio. Nó cũng hỗ trợ chạy trong máy chủ tích hợp liên tục TeamCity.


7
Tôi mới bắt đầu sử dụng Chutzpah để chạy thử nghiệm Jasmine trong phòng thu trực quan - nó được tích hợp độc đáo: nhấp chuột phải vào tệp thử nghiệm và chọn 'chạy thử nghiệm js' hoặc 'chạy thử nghiệm JS trong trình duyệt'. Tôi chạy thử nghiệm hoa nhài tương tự bằng cách sử dụng JSTestDriver. Tôi thích Chutzpah vì tôi chỉ định tệp nào tôi phụ thuộc khi được tải ở đầu tệp thử nghiệm. Đối với JSTestDriver tôi cần một tệp cấu hình riêng.
GarethOwen


14

BusterJS

Ngoài ra còn có BusterJS từ Christian Johansen, tác giả của Test Driven Javascript Development và Sinon framework. Từ trang web:

Buster.JS là một khung thử nghiệm JavaScript mới. Nó thực hiện kiểm tra trình duyệt bằng cách tự động chạy thử nghiệm trong các trình duyệt thực tế (nghĩ là JsTestDriver), cũng như thử nghiệm Node.js.


10

google-js-test:

Khung thử nghiệm JavaScript do Google phát hành: https://github.com/google/gjstest

  • Kiểm tra thời gian khởi động và thực hiện cực nhanh, không cần phải chạy trình duyệt.
  • Đầu ra sạch, dễ đọc trong trường hợp cả hai bài kiểm tra đạt và không đạt.
  • Một trình chạy thử nghiệm dựa trên trình duyệt có thể được làm mới bất cứ khi nào thay đổi JS.
  • Phong cách và ngữ nghĩa giống với Google Test cho C ++.
  • Khung mô phỏng tích hợp sẵn yêu cầu mã soạn sẵn tối thiểu (ví dụ: không $tearDownhoặc $verifyAll) với kiểu dáng và ngữ nghĩa dựa trên Khung mô phỏng Google C ++ .

Hiện tại không có nhị phân cho Windows


1
Nó dường như không có hứng thú với Github, nó cũng yêu cầu hệ điều hành unix-căn cứ và tôi là một fan hâm mộ lớn của cửa sổ, tôi không rời khỏi nhà mà không hôn tạm biệt máy windows của mình.
vsync

8

Chúng tôi hiện đang sử dụng Qunit với Pavlov và JSTestDriver cùng nhau. Cách tiếp cận này hoạt động tốt cho chúng tôi.

QUnit

Pavlov , nguồn

jsTestDriver , nguồn


Bạn có quan tâm để giải thích vai trò của mỗi trong số này trong toàn bộ quá trình thử nghiệm và cách chúng kết nối với nhau không?
vsync

Xin lỗi, đã có một thời gian dài và nhiều công việc hợp đồng trước đây để nhớ lại các chi tiết về điều này.
Tom Stickel 8/11/2015

6

Bạn có "chạy trên trình duyệt thực tế" như một người chuyên nghiệp, nhưng theo kinh nghiệm của tôi đó là một kẻ lừa đảo vì nó chậm. Nhưng điều làm cho nó có giá trị là thiếu sự mô phỏng JS đầy đủ từ các lựa chọn không phải trình duyệt. Có thể là nếu JS của bạn đủ phức tạp để chỉ một bài kiểm tra trong trình duyệt sẽ đủ, nhưng có một vài lựa chọn khác để xem xét:

HtmlUnit : "Nó có hỗ trợ JavaScript khá tốt (liên tục cải thiện) và có thể hoạt động ngay cả với các thư viện AJAX khá phức tạp, mô phỏng Firefox hoặc Internet Explorer tùy thuộc vào cấu hình bạn muốn sử dụng." Nếu mô phỏng của nó đủ tốt để bạn sử dụng thì nó sẽ nhanh hơn nhiều so với lái trình duyệt.

Nhưng có lẽ HtmlUnit có hỗ trợ JS đủ tốt nhưng bạn không thích Java? Sau đó có thể:

Celerity : API Watir chạy trên JRuby được hỗ trợ bởi HtmlUnit.

hoặc tương tự

Schnell : một trình bao bọc khác của JRuby của HtmlUnit.

Tất nhiên, nếu HtmlUnit không đủ tốt và bạn phải lái trình duyệt thì bạn có thể xem xét Watir để điều khiển JS của mình .



3

Bạn cũng có thể quan tâm đến khung thử nghiệm đơn vị là một phần của qooxdoo , khung RIA mã nguồn mở tương tự như Dojo, ExtJS, v.v. nhưng với chuỗi công cụ khá toàn diện.

Hãy thử phiên bản trực tuyến của testrunner . Gợi ý: nhấn mũi tên màu xám ở trên cùng bên trái (nên được làm rõ hơn). Đó là nút "phát" để chạy các bài kiểm tra đã chọn.

Để tìm hiểu thêm về các lớp JS cho phép bạn xác định các bài kiểm tra đơn vị của mình, hãy xem trực tuyến xem trình xem API .

Để kiểm tra giao diện người dùng tự động (dựa trên Selenium RC), hãy xem dự án Trình mô phỏng .



3

Chúng tôi đã thêm tích hợp JUnit vào Java để tạo mã Javascript ST-JS ( http://st-js.org ). Khung công tác tạo ra Javascript tương ứng cho cả mã được kiểm tra và đơn vị kiểm tra và gửi mã đến các trình duyệt khác nhau.

Không cần một máy chủ riêng vì người chạy thử đơn vị sẽ mở cổng http cần thiết (và đóng nó sau khi thử nghiệm kết thúc). Khung công tác thao tác ngăn xếp Java để các xác nhận thất bại được hiển thị chính xác bởi trình cắm JUnit Eclipse. Đây là một ví dụ đơn giản với jQuery và 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;
  }
}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.