Thực tiễn tốt nhất về thử nghiệm Node.js & JavaScript (2019)

Note Lưu ý quan trọng: Bài viết này đã trở thành kho lưu trữ GitHub với 15 thực tiễn tốt nhất và thảo luận cộng đồng

Giới thiệu ngắn

Là một nhà tư vấn độc lập của Node.js, tôi đã tham gia và xem xét hơn 10 dự án mỗi năm và khách hàng của tôi yêu cầu chính đáng tập trung vào thử nghiệm. Vài tháng trước, tôi đã bắt đầu ghi lại ở đây những hiểu biết và lặp lại lỗi tôi quan sát được tại hiện trường và đột nhiên nó chồng chất thành 30 thử nghiệm thực tiễn tốt nhất.

Các ý tưởng dưới đây trải rộng các chủ đề như chọn đúng loại thử nghiệm, mã hóa chúng chính xác, đo lường hiệu quả của chúng và lưu trữ chúng trong một đường ống CI / CD theo đúng cách. Một số ví dụ được minh họa bằng Jest, một số khác với Mocha - bài này ít nói về công cụ và nhiều hơn về cách tiếp cận và kỹ thuật phù hợp.

Tên tôi là Yoni Goldberg, một nhà tư vấn độc lập của Node.JS và là đồng tác giả của các thực tiễn tốt nhất của Node.js. Tôi làm việc với các khách hàng tại Hoa Kỳ, Châu Âu và Israel trong việc đánh bóng các ứng dụng Node.js của họ. Trong số các dịch vụ của tôi cũng có kế hoạch kiểm tra, đánh giá kiểm tra và thiết lập CI / CD. Theo dõi tôi trên Twitter

Được đánh giá và cải thiện bởi Bruno Scheufler

️ 0. Nguyên tắc vàng: Kiểm tra phải ở trạng thái chết và rõ ràng như ban ngày

Bạn có quen thuộc với người bạn cười đó, thành viên gia đình hoặc có thể là một nhân vật điện ảnh luôn sẵn sàng giúp đỡ đôi bàn tay làm việc tốt của anh ấy, hỗ trợ 24/7 khi bạn cần anh ấy điều chỉnh năng lượng tích cực mà vẫn tự hỏi mình rất ít? Đây là cách mã thử nghiệm được thiết kế - dễ dàng, có giá trị và thú vị. Điều này có thể đạt được bằng cách chọn lọc các kỹ thuật, công cụ và mục tiêu thử nghiệm có hiệu quả về chi phí và mang lại ROI tuyệt vời. Chỉ kiểm tra càng nhiều càng tốt, cố gắng giữ cho nó nhanh nhẹn, đôi khi nó thậm chí còn đáng để bỏ một số thử nghiệm và đánh giá độ tin cậy để nhanh nhẹn và đơn giản.

Việc kiểm tra không nên được coi là mã ứng dụng truyền thống - một nhóm điển hình bị thách thức trong việc duy trì ứng dụng chính của nó (các tính năng chúng tôi mã hóa và bán), nó không thể chịu đựng được thêm dự án phức tạp. Nếu thử nghiệm phát triển thành một nguồn đau đớn bổ sung - nó sẽ bị bỏ rơi hoặc làm chậm quá trình phát triển.

Theo nghĩa đó, mã kiểm tra phải ở trạng thái đơn giản, với sự phụ thuộc tối thiểu, trừu tượng hóa và mức độ gián tiếp. Người ta nên nhìn vào một bài kiểm tra và có được ý định ngay lập tức. Hầu hết các lời khuyên dưới đây là dẫn xuất của nguyên tắc này

*** Phần : Giải phẫu thử nghiệm ***

️ 1. Bao gồm 3 phần trong mỗi tên kiểm tra

Do: Báo cáo thử nghiệm sẽ cho biết liệu bản sửa đổi ứng dụng hiện tại có đáp ứng các yêu cầu cho những người không nhất thiết phải làm quen với mã hay không: người thử nghiệm, kỹ sư DevOps đang triển khai và tương lai của bạn sau hai năm nữa. Điều này có thể đạt được tốt nhất nếu các bài kiểm tra nói ở cấp độ yêu cầu và bao gồm 3 phần:

(1) Điều gì đang được thử nghiệm? Ví dụ: phương thức ProductsService.addNewSản phẩm

(2) Trong hoàn cảnh và kịch bản nào? Ví dụ, không có giá nào được truyền cho phương thức

(3) Kết quả mong đợi là gì? Ví dụ: sản phẩm mới không được phê duyệt

Mặt khác: Việc triển khai vừa thất bại, một thử nghiệm có tên là Thêm sản phẩm, đã thất bại. Điều này cho bạn biết chính xác những gì đang trục trặc?

Thực hiện đúng Ví dụ: Tên kiểm tra cấu thành 3 phần

Thực hiện đúng Ví dụ: Báo cáo thử nghiệm giống với tài liệu yêu cầu

Bao gồm 3 phần trong mỗi trường hợp thử nghiệm, nói ngôn ngữ sản phẩm

2. Mô tả kỳ vọng bằng ngôn ngữ sản phẩm: sử dụng các xác nhận theo kiểu BDD

Do: Mã hóa các bài kiểm tra của bạn theo kiểu khai báo cho phép người đọc có thể lấy ngay lập tức mà không tốn một chu kỳ CPU não duy nhất. Khi bạn viết một mã bắt buộc được đóng gói với logic có điều kiện, người đọc sẽ bị ném vào một tâm trạng nỗ lực tinh thần. Theo nghĩa đó, mã hóa kỳ vọng theo ngôn ngữ giống con người, kiểu khai báo BDD bằng cách sử dụng kỳ vọng hoặc không nên và không sử dụng mã tùy chỉnh. Nếu Chai & Jest don Nhận bao gồm xác nhận mong muốn và nó có khả năng lặp lại cao, hãy xem xét mở rộng trình so khớp Jest (Jest) hoặc viết một plugin Chai tùy chỉnh

Mặt khác: Nhóm sẽ viết ít bài kiểm tra hơn và trang trí cho những người khó chịu bằng .skip ()

Example Ví dụ chống mẫu: Người đọc phải đọc lướt qua không quá ngắn và mã bắt buộc chỉ để có được câu chuyện thử nghiệm

Thực hiện đúng Ví dụ: Lướt qua bài kiểm tra khai báo sau đây thật dễ dàng

3. Lint với các plugin dành riêng cho thử nghiệm

Do: Một bộ plugin ESLint được xây dựng riêng để kiểm tra các mẫu mã kiểm tra và khám phá các vấn đề. Ví dụ, eslint-plugin-mocha sẽ cảnh báo khi một bài kiểm tra được viết ở cấp độ toàn cầu (không phải là câu lệnh mô tả ()) hoặc khi các bài kiểm tra bị bỏ qua có thể dẫn đến niềm tin sai lầm rằng tất cả các bài kiểm tra đều vượt qua. Tương tự, ví dụ, eslint-plugin-jest có thể cảnh báo khi một bài kiểm tra không có xác nhận nào cả (không kiểm tra bất cứ điều gì)

Mặt khác: Xem phạm vi bảo hiểm mã 90% và kiểm tra 100% màu xanh lá cây sẽ khiến khuôn mặt bạn chỉ nở một nụ cười lớn cho đến khi bạn nhận ra rằng nhiều thử nghiệm đã được khẳng định cho bất cứ điều gì và nhiều bộ thử nghiệm đã bị bỏ qua. Hy vọng, bạn đã không triển khai bất cứ điều gì dựa trên quan sát sai lầm này

Example Ví dụ chống mẫu: Một trường hợp thử nghiệm đầy lỗi, may mắn là tất cả đều bị Linters bắt

4. Bám sát kiểm tra hộp đen: Chỉ kiểm tra các phương thức công khai

Làm: Kiểm tra nội bộ mang lại chi phí rất lớn mà hầu như không có gì. Nếu mã / API của bạn cung cấp kết quả đúng, bạn có thực sự nên đầu tư 3 giờ tiếp theo để thử nghiệm CÁCH nó hoạt động nội bộ và sau đó duy trì các thử nghiệm dễ vỡ này không? Bất cứ khi nào một hành vi công khai được kiểm tra, việc triển khai riêng tư cũng được kiểm tra ngầm và các kiểm tra của bạn sẽ chỉ bị hỏng nếu có một vấn đề nhất định (ví dụ: đầu ra sai). Cách tiếp cận này cũng được gọi là thử nghiệm hành vi. Mặt khác, bạn có nên kiểm tra các phần bên trong (cách tiếp cận hộp trắng) - trọng tâm của bạn chuyển từ lập kế hoạch kết quả thành phần sang chi tiết khó chịu và thử nghiệm của bạn có thể bị hỏng do các bộ tái cấu trúc mã nhỏ mặc dù kết quả rất tốt - điều này làm tăng đáng kể việc bảo trì gánh nặng

Mặt khác: Thử nghiệm của bạn hoạt động giống như đứa trẻ khóc sói: bắn ra những tiếng kêu dương tính giả (ví dụ: Thử nghiệm thất bại vì tên biến riêng tư đã bị thay đổi). Không có gì đáng ngạc nhiên, mọi người sẽ sớm bắt đầu bỏ qua các thông báo CI cho đến một ngày nào đó một lỗi thực sự sẽ bị bỏ qua

Example Ví dụ chống mẫu: Một trường hợp thử nghiệm đang kiểm tra nội bộ không có lý do chính đáng

️️5. Chọn bài kiểm tra nhân đôi đúng: Tránh chế giễu có lợi cho cuống và gián điệp

Do: Kiểm tra nhân đôi là một điều ác cần thiết bởi vì chúng được kết hợp với các phần bên trong ứng dụng, tuy nhiên một số cung cấp một giá trị to lớn (Đọc ở đây một lời nhắc về kiểm tra nhân đôi: giả so với sơ khai so với gián điệp). Tuy nhiên, các kỹ thuật khác nhau không được sinh ra như nhau: một số trong số họ, gián điệp và sơ khai, được tập trung vào việc kiểm tra các yêu cầu nhưng như một tác dụng phụ không thể tránh khỏi, họ cũng chạm nhẹ vào bên trong. Ngược lại, Mocks tập trung vào việc thử nghiệm các phần bên trong - điều này mang lại chi phí rất lớn như đã được giải thích trong viên đạn Băng dính để thử nghiệm hộp đen.

Trước khi sử dụng kiểm tra nhân đôi, hãy hỏi một câu hỏi rất đơn giản: Tôi có sử dụng nó để kiểm tra chức năng xuất hiện hoặc có thể xuất hiện trong tài liệu yêu cầu không? Nếu không, nó có mùi của thử nghiệm hộp trắng.

Ví dụ: nếu bạn muốn kiểm tra ứng dụng của mình hoạt động hợp lý khi dịch vụ thanh toán ngừng hoạt động, bạn có thể bỏ qua dịch vụ thanh toán và kích hoạt một số ‘Không trả lời Phản hồi để đảm bảo rằng đơn vị được kiểm tra trả về đúng giá trị. Điều này kiểm tra hành vi / phản ứng / kết quả ứng dụng của chúng tôi trong các tình huống nhất định. Bạn cũng có thể sử dụng một gián điệp để xác nhận rằng một email đã được gửi khi dịch vụ đó ngừng hoạt động - đây lại là một kiểm tra hành vi có khả năng xuất hiện trong tài liệu yêu cầu (Gửi Gửi email nếu thanh toán không thể được lưu lại). Mặt khác, nếu bạn chế nhạo dịch vụ Thanh toán và đảm bảo rằng nó được gọi với các loại JavaScript phù hợp - thì thử nghiệm của bạn sẽ tập trung vào những thứ bên trong không có gì với chức năng của ứng dụng và có khả năng thay đổi thường xuyên

Mặt khác: Mọi cấu trúc lại mã bắt buộc phải tìm kiếm tất cả các giả trong mã và cập nhật tương ứng. Các bài kiểm tra trở thành gánh nặng hơn là một người bạn hữu ích

Example Ví dụ chống mẫu: Mocks tập trung vào phần bên trong

Thực hiện đúng Ví dụ: các điệp viên tập trung vào việc kiểm tra các yêu cầu nhưng vì tác dụng phụ là không thể tránh khỏi việc chạm vào bên trong

6. Hãy đặt tên cho bạn, sử dụng dữ liệu đầu vào thực tế

Do: Thông thường các lỗi sản xuất được tiết lộ dưới một số đầu vào rất cụ thể và đáng ngạc nhiên - đầu vào thử nghiệm càng thực tế, cơ hội bắt lỗi sớm càng lớn. Sử dụng các thư viện chuyên dụng như Faker để tạo dữ liệu giả giống với dữ liệu sản xuất và sự đa dạng. Ví dụ, các thư viện như vậy sẽ tạo ra các số điện thoại ngẫu nhiên nhưng thực tế, tên người dùng, thẻ tín dụng, tên công ty và thậm chí cả văn bản i lumem ipsum. Xem xét thậm chí nhập dữ liệu thực từ môi trường sản xuất của bạn và sử dụng trong các thử nghiệm của bạn. Bạn muốn đưa nó lên cấp độ tiếp theo? xem viên đạn tiếp theo (thử nghiệm dựa trên tài sản)

Mặt khác: Tất cả các thử nghiệm phát triển của bạn sẽ có vẻ sai màu xanh lá cây khi bạn sử dụng các đầu vào tổng hợp như Từ Foo, nhưng sau đó, quá trình sản xuất có thể chuyển sang màu đỏ khi tin tặc đi vào một chuỗi khó chịu như Hồi @ 3e2ddsf. ## 1 1 fdsfds. fds432 AAAA

Example Ví dụ chống mẫu: Một bộ thử nghiệm vượt qua do dữ liệu không thực tế

Thực hiện đúng ví dụ: Ngẫu nhiên nhập liệu thực tế

7. Kiểm tra nhiều kết hợp đầu vào bằng cách sử dụng thử nghiệm dựa trên Thuộc tính

Do: Thông thường chúng tôi chọn một vài mẫu đầu vào cho mỗi thử nghiệm. Ngay cả khi định dạng đầu vào giống với dữ liệu trong thế giới thực (xem dấu đầu dòng 'Đừng foo'), chúng tôi chỉ bao gồm một vài kết hợp đầu vào (phương thức ('', true, 1), phương thức (chuỗi String, sai, 0) ), Tuy nhiên, trong sản xuất, một API được gọi với 5 tham số có thể được gọi với hàng ngàn hoán vị khác nhau, một trong số chúng có thể khiến quá trình của chúng tôi ngừng hoạt động (xem Kiểm tra Fuzz). Điều gì sẽ xảy ra nếu bạn có thể viết một bài kiểm tra tự động gửi 1000 hoán vị của các đầu vào khác nhau và bắt cho đầu vào mà mã của chúng tôi không trả về đúng phản hồi? Kiểm tra dựa trên thuộc tính là một kỹ thuật thực hiện chính xác điều đó: bằng cách gửi tất cả các kết hợp đầu vào có thể đến đơn vị của bạn đang được kiểm tra, nó làm tăng tính ngẫu nhiên của việc tìm lỗi. Ví dụ: được cung cấp một phương thức - addNewSản phẩm (id, name, isDiscount) - các thư viện hỗ trợ sẽ gọi phương thức này với nhiều kết hợp (số, chuỗi, boolean) như (1, iPhone iPhone, sai), (2, Thẻ Galaxy ", thật). Bạn có thể chạy thử nghiệm dựa trên thuộc tính bằng cách sử dụng trình chạy thử yêu thích của bạn (Mocha, Jest, v.v.) bằng các thư viện như js-verify hoặc testcheck (tài liệu tốt hơn nhiều). Cập nhật: Nicolas Dubien gợi ý trong các bình luận bên dưới để kiểm tra nhanh kiểm tra dường như cung cấp một số tính năng bổ sung và cũng được duy trì tích cực

Mặt khác: Vô thức, bạn chọn các đầu vào kiểm tra chỉ bao gồm các đường dẫn mã hoạt động tốt. Thật không may, điều này làm giảm hiệu quả của thử nghiệm như một phương tiện để phát hiện ra lỗi

Thực hiện đúng Ví dụ: Kiểm tra nhiều hoán vị đầu vào với mocha-testcheck

️ 8. Ở trong thử nghiệm: Tối thiểu hóa các trợ giúp bên ngoài và trừu tượng hóa

Làm: Đến bây giờ, có lẽ rõ ràng là tôi đã ủng hộ các thử nghiệm đơn giản: Nhóm có thể kiếm được một dự án phần mềm khác đòi hỏi một nỗ lực tinh thần để hiểu mã. Michael Lync giải thích điều này trong bài viết tuyệt vời của mình:

Mã sản xuất tốt là yếu tố tốt; mã kiểm tra tốt là hiển nhiên khi bạn viết một bài kiểm tra, hãy nghĩ về nhà phát triển tiếp theo, người sẽ thấy bài kiểm tra bị phá vỡ. Họ không muốn đọc toàn bộ bộ kiểm tra của bạn và chắc chắn họ không muốn đọc toàn bộ cây thừa kế của các tiện ích kiểm tra.

Để người đọc có được toàn bộ câu chuyện mà không cần rời khỏi bài kiểm tra, giảm thiểu các tiện ích, móc hoặc bất kỳ tác động bên ngoài nào trên một trường hợp thử nghiệm. Quá nhiều sự lặp lại và dán sao chép? OK, một bài kiểm tra có thể để lại với một người trợ giúp bên ngoài và rõ ràng. Nhưng khi nó phát triển lên ba và bốn người trợ giúp và móc nó ngụ ý rằng nó là một cấu trúc phức tạp đang dần hình thành

Mặt khác: Đột nhiên bạn thấy mình có 4 người trợ giúp cho mỗi bộ kiểm tra, 2 trong số họ thừa hưởng từ cơ sở sử dụng, rất nhiều thiết lập và móc treo? Xin chúc mừng, bạn vừa giành được một dự án đầy thách thức khác để duy trì, bạn có thể viết bài kiểm tra sớm so với bộ thử nghiệm của bạn

Ví dụ chống mẫu: Cấu trúc thử nghiệm lạ mắt và gián tiếp. Bạn có hiểu trường hợp thử nghiệm mà không điều hướng đến các phụ thuộc bên ngoài?

Thực hiện đúng Ví dụ: Một bài kiểm tra bạn có thể hiểu mà không nhảy qua các tệp khác nhau

9. Tránh đồ đạc và hạt giống thử nghiệm toàn cầu, thêm dữ liệu cho mỗi thử nghiệm

Do: Thực hiện theo quy tắc vàng (viên đạn 0), mỗi thử nghiệm nên thêm và hành động trên tập hợp các hàng DB riêng của mình để ngăn khớp nối và dễ dàng lý giải về luồng thử nghiệm. Trong thực tế, điều này thường bị vi phạm bởi những người thử nghiệm gieo hạt DB với dữ liệu trước khi chạy thử nghiệm (còn được gọi là fix thử nghiệm thử nghiệm) vì mục đích cải thiện hiệu suất. Mặc dù hiệu năng thực sự là một mối quan tâm hợp lệ - tuy nhiên, nó có thể được giảm thiểu (xem phần thử nghiệm của Thành phần trong vụ nổ), tuy nhiên, độ phức tạp của thử nghiệm là một nỗi buồn rất đau đớn nên chi phối mọi sự cân nhắc khác trong hầu hết thời gian. Thực tế, làm cho mỗi trường hợp thử nghiệm thêm rõ ràng các bản ghi DB cần thiết và chỉ hành động trên các bản ghi đó. Nếu hiệu suất trở thành mối quan tâm quan trọng - một sự thỏa hiệp cân bằng có thể xuất hiện dưới dạng gieo mầm bộ thử nghiệm duy nhất không làm thay đổi dữ liệu (ví dụ: truy vấn)

Mặt khác: Rất ít bài kiểm tra thất bại, việc triển khai bị hủy bỏ, nhóm của chúng tôi sẽ dành thời gian quý báu, chúng tôi có lỗi không? hãy để điều tra, ồ không - có vẻ như hai bài kiểm tra đã làm thay đổi cùng một dữ liệu hạt giống

Example Ví dụ chống mẫu: các thử nghiệm không độc lập và dựa vào một số hook toàn cầu để cung cấp dữ liệu DB toàn cầu

Thực hiện đúng ví dụ: Chúng tôi có thể ở trong thử nghiệm, mỗi thử nghiệm hoạt động trên tập dữ liệu riêng của mình

10. Don bắt lỗi, mong đợi chúng

Do: Khi cố gắng xác nhận rằng một số đầu vào gây ra lỗi, có thể có vẻ đúng khi sử dụng try-Catch-cuối cùng và khẳng định rằng mệnh đề bắt được nhập. Kết quả là một trường hợp thử nghiệm vụng về và dài dòng (ví dụ bên dưới) che giấu ý định thử nghiệm đơn giản và kết quả mong đợi

Một cách khác thanh lịch hơn là sử dụng xác nhận Chai dành riêng một dòng: wish (phương thức) .to.throw (hoặc trong Jest: wish (phương thức) .toThrow ()). Nó cũng hoàn toàn bắt buộc để đảm bảo ngoại lệ có chứa một thuộc tính cho biết loại lỗi, nếu không chỉ là một lỗi chung, ứng dụng won đã có thể làm được nhiều việc hơn là hiển thị một thông báo đáng thất vọng cho người dùng

Mặt khác: Sẽ rất khó để suy ra các báo cáo thử nghiệm (ví dụ: báo cáo CI) đã xảy ra lỗi

Example Ví dụ chống mẫu: Một trường hợp thử nghiệm dài cố gắng xác nhận sự tồn tại của lỗi với tính năng bắt thử

Thực hiện đúng ví dụ: Một kỳ vọng có thể đọc được của con người có thể hiểu được một cách dễ dàng, thậm chí có thể bằng QA hoặc PM kỹ thuật

️10. Gắn thẻ bài kiểm tra của bạn

Do: Các thử nghiệm khác nhau phải chạy trên các kịch bản khác nhau: hút thuốc nhanh, không có IO, các thử nghiệm sẽ chạy khi nhà phát triển lưu hoặc xác nhận tệp, các thử nghiệm đầu cuối đầy đủ thường chạy khi yêu cầu kéo mới được gửi, v.v. có thể đạt được bằng cách gắn thẻ các thử nghiệm với các từ khóa như #cold #api #sanity để bạn có thể grep với khai thác thử nghiệm của mình và gọi tập hợp con mong muốn. Ví dụ: đây là cách bạn chỉ gọi nhóm thử nghiệm độ tỉnh táo với Mocha: mocha - grep ‘sanity,

Mặt khác: Chạy tất cả các thử nghiệm, bao gồm các thử nghiệm thực hiện hàng tá truy vấn DB, bất cứ khi nào nhà phát triển thực hiện một thay đổi nhỏ có thể cực kỳ chậm và khiến nhà phát triển tránh chạy thử nghiệm

Thực hiện đúng Ví dụ: Gắn thẻ kiểm tra dưới dạng # kiểm tra lạnh cho phép người chạy thử chỉ thực hiện các kiểm tra nhanh (Cold === kiểm tra nhanh không thực hiện IO và có thể được thực thi thường xuyên ngay cả khi nhà phát triển đang gõ)

11. Vệ sinh xét nghiệm tốt chung chung khác

Do: Bài đăng này tập trung vào kiểm tra lời khuyên có liên quan đến, hoặc ít nhất có thể được minh họa bằng Node JS. Tuy nhiên, viên đạn này nhóm một số mẹo không liên quan đến Node nổi tiếng

Học và thực hành các nguyên tắc TDD - chúng cực kỳ có giá trị đối với nhiều người nhưng don không bị đe dọa nếu họ không phù hợp với phong cách của bạn, bạn không phải là người duy nhất. Cân nhắc viết các bài kiểm tra trước mã theo kiểu tái cấu trúc màu đỏ-xanh, đảm bảo mỗi bài kiểm tra kiểm tra chính xác một điều, khi bạn tìm thấy một lỗi - trước khi sửa, hãy viết một bài kiểm tra sẽ phát hiện lỗi này trong tương lai, hãy để mỗi bài kiểm tra thất bại ít nhất một lần trước khi chuyển sang màu xanh lá cây, tránh mọi sự phụ thuộc vào môi trường (đường dẫn, hệ điều hành, v.v.)

Mặt khác: Bạn sẽ bỏ lỡ những viên ngọc khôn ngoan được thu thập trong nhiều thập kỷ

*** Phần : Các loại kiểm tra ***

️ 12. Làm phong phú danh mục thử nghiệm của bạn: Nhìn xa hơn các thử nghiệm đơn vị và kim tự tháp

Do: Kim tự tháp thử nghiệm, mặc dù đã 10 năm tuổi, là một mô hình tuyệt vời và phù hợp, gợi ý ba loại thử nghiệm và ảnh hưởng đến hầu hết các nhà phát triển chiến lược thử nghiệm. Đồng thời, hơn một số ít các kỹ thuật thử nghiệm mới sáng bóng đã xuất hiện và đang ẩn nấp trong bóng tối của kim tự tháp thử nghiệm. Với tất cả những thay đổi mạnh mẽ mà chúng tôi đã thấy trong 10 năm gần đây (microservice, cloud, serverless), thậm chí có khả năng một mô hình khá cũ sẽ phù hợp với * tất cả * loại ứng dụng không? Nên thế giới thử nghiệm xem xét chào đón các kỹ thuật thử nghiệm mới?

Donith hiểu sai, năm 2019, kim tự tháp thử nghiệm, TDD và thử nghiệm đơn vị vẫn là một kỹ thuật mạnh mẽ và có lẽ là kết hợp tốt nhất cho nhiều ứng dụng. Chỉ giống như bất kỳ mô hình khác, mặc dù tính hữu dụng của nó, đôi khi nó phải sai. Ví dụ: hãy xem xét một ứng dụng IOT nhập nhiều sự kiện vào một bus thông báo như Kafka / RabbitMQ, sau đó chảy vào một số kho dữ liệu và cuối cùng được một số UI phân tích truy vấn. Chúng ta có nên thực sự dành 50% ngân sách thử nghiệm của mình cho việc viết bài kiểm tra đơn vị cho một ứng dụng tập trung vào trung tâm và gần như không có logic? Khi sự đa dạng của các loại ứng dụng tăng (bot, tiền điện tử, kỹ năng Alexa) lớn hơn là cơ hội tìm thấy các kịch bản trong đó kim tự tháp thử nghiệm không phù hợp nhất.

Đã đến lúc làm phong phú danh mục thử nghiệm của bạn và làm quen với nhiều loại thử nghiệm hơn (những viên đạn tiếp theo gợi ý vài ý tưởng), các mô hình tư duy như kim tự tháp thử nghiệm nhưng cũng khớp các loại thử nghiệm với các vấn đề trong thế giới thực mà bạn gặp phải ('Này, API của chúng tôi bị hỏng, hãy viết thử nghiệm hợp đồng hướng tới người tiêu dùng! '), đa dạng hóa các thử nghiệm của bạn như một nhà đầu tư xây dựng danh mục đầu tư dựa trên phân tích rủi ro - đánh giá các vấn đề có thể phát sinh và kết hợp một số biện pháp phòng ngừa để giảm thiểu những rủi ro tiềm ẩn đó

Một lời cảnh báo: đối số TDD trong thế giới phần mềm có một khuôn mặt phân đôi giả điển hình, một số lời rao giảng để sử dụng nó ở khắp mọi nơi, những người khác nghĩ rằng đó là Quỷ dữ. Mọi người nói một cách tuyệt đối đều sai:]

Mặt khác: Bạn sẽ bỏ lỡ một số công cụ có ROI tuyệt vời, một số như Fuzz, lint và đột biến có thể cung cấp giá trị trong 10 phút

Làm đúng ví dụ: Cindy Sridharan gợi ý một danh mục thử nghiệm phong phú trong bài đăng tuyệt vời của cô Kiểm tra microservice - cách lành mạnh

Ví dụ: YouTube: Các bài kiểm tra đơn vị vượt trội: 5 Node sáng bóng. Các loại thử nghiệm (2018) (Yoni Goldberg)

5 kỹ thuật kiểm tra sáng bóng của Yoni Goldberg

13. Kiểm tra thành phần có thể là chuyện tốt nhất của bạn

Do: Mỗi bài kiểm tra đơn vị bao gồm một phần nhỏ của ứng dụng và tốn kém để bao quát toàn bộ, trong khi kiểm tra từ đầu đến cuối dễ dàng bao phủ nhiều mặt đất nhưng lại dễ vỡ và chậm hơn, tại sao không áp dụng cách tiếp cận cân bằng và viết các bài kiểm tra lớn hơn thử nghiệm đơn vị nhưng nhỏ hơn thử nghiệm đầu cuối? Thử nghiệm thành phần là bài hát chưa được biết đến của thế giới thử nghiệm - họ cung cấp tốt nhất từ ​​cả hai thế giới: hiệu suất hợp lý và khả năng áp dụng các mẫu TDD + độ bao phủ thực tế và tuyệt vời.

Các thử nghiệm thành phần tập trung vào 'đơn vị' của microservice, chúng hoạt động chống lại API, không chế nhạo bất cứ thứ gì thuộc về chính microservice (ví dụ DB thực, hoặc ít nhất là phiên bản trong bộ nhớ của DB đó) nhưng bỏ đi mọi thứ bên ngoài như các cuộc gọi đến các dịch vụ khác. Bằng cách làm như vậy, chúng tôi kiểm tra những gì chúng tôi triển khai, tiếp cận ứng dụng từ bên ngoài đến bên trong và có được sự tự tin lớn trong một khoảng thời gian hợp lý.

Mặt khác: Bạn có thể dành nhiều ngày dài để viết bài kiểm tra đơn vị để biết rằng bạn chỉ có 20% bảo hiểm hệ thống

Thực hiện đúng ví dụ: Supertest cho phép tiếp cận Express API trong quá trình (nhanh và bao gồm nhiều lớp)

️ 14. Đảm bảo các bản phát hành mới don vá phá vỡ API bằng các hợp đồng do người tiêu dùng điều khiển

Do: Vì vậy, microservice của bạn có nhiều khách hàng và bạn chạy nhiều phiên bản dịch vụ vì lý do tương thích (giữ cho mọi người hài lòng). Sau đó, bạn thay đổi một số lĩnh vực và ‘boom!, Một số khách hàng quan trọng dựa vào lĩnh vực này đang tức giận. Đây là Catch-22 của thế giới tích hợp: Rất khó khăn cho phía máy chủ xem xét tất cả các kỳ vọng của nhiều khách hàng - Mặt khác, các máy khách có thể thực hiện bất kỳ thử nghiệm nào vì máy chủ kiểm soát ngày phát hành. Các hợp đồng do người tiêu dùng điều khiển và PACT khuôn khổ được sinh ra để chính thức hóa quy trình này với cách tiếp cận rất đột phá - không phải máy chủ tự xác định kế hoạch kiểm tra mà là máy khách xác định các thử nghiệm của máy chủ! PACT có thể ghi lại kỳ vọng của khách hàng và đặt vào một vị trí được chia sẻ, môi giới trực tuyến, vì vậy máy chủ có thể kéo các kỳ vọng và chạy trên mọi bản dựng bằng thư viện PACT để phát hiện các hợp đồng bị hỏng - một kỳ vọng của khách hàng không được đáp ứng. Bằng cách làm như vậy, tất cả các lỗi không khớp API máy chủ-máy khách được phát hiện sớm trong quá trình xây dựng / CI và có thể giúp bạn tiết kiệm rất nhiều sự thất vọng

Mặt khác: Các lựa chọn thay thế đang cạn kiệt thử nghiệm thủ công hoặc sợ triển khai

Làm đúng ví dụ:

15. Kiểm tra phần mềm trung gian của bạn một cách cô lập

Do: Nhiều người tránh kiểm tra Middleware vì chúng chiếm một phần nhỏ trong hệ thống và yêu cầu máy chủ Express trực tiếp. Cả hai lý do đều sai - Middleware nhỏ nhưng ảnh hưởng đến tất cả hoặc hầu hết các yêu cầu và có thể được kiểm tra dễ dàng dưới dạng các hàm thuần có được các đối tượng JS {req, res}. Để kiểm tra chức năng phần mềm trung gian, người ta chỉ cần gọi nó và theo dõi (ví dụ sử dụng Sinon) về sự tương tác với các đối tượng {req, res} để đảm bảo chức năng thực hiện đúng hành động. Nút thư viện-mock-http đưa nó đi xa hơn và tính các đối tượng {req, res} cùng với gián điệp về hành vi của chúng. Ví dụ: nó có thể xác nhận xem trạng thái http được đặt trên đối tượng res có khớp với mong đợi hay không (Xem ví dụ bên dưới)

Mặt khác: Lỗi trong Express middleware === một lỗi trong tất cả hoặc hầu hết các yêu cầu

Thực hiện đúng Ví dụ: Kiểm tra phần mềm trung gian một cách cô lập mà không thực hiện các cuộc gọi mạng và đánh thức toàn bộ máy Express

16. Đo và tái cấu trúc bằng các công cụ phân tích tĩnh

Do: Sử dụng các công cụ phân tích tĩnh giúp bằng cách đưa ra các cách khách quan để cải thiện chất lượng mã và giữ cho mã của bạn có thể duy trì. Bạn có thể thêm các công cụ phân tích tĩnh vào bản dựng CI của mình để hủy bỏ khi thấy mã có mùi. Điểm bán hàng chính của nó đối với việc nhuộm đơn giản là khả năng kiểm tra chất lượng trong ngữ cảnh của nhiều tệp (ví dụ: phát hiện trùng lặp), thực hiện phân tích nâng cao (ví dụ: độ phức tạp của mã) và theo dõi lịch sử và tiến trình của các vấn đề về mã. Hai ví dụ về các công cụ bạn có thể sử dụng là Sonarqube (2.600+ sao) và Code Climate (1.500 sao)

Tín dụng: Keith Holliday

Mặt khác: Với chất lượng mã kém, lỗi và hiệu suất sẽ luôn là vấn đề mà không có thư viện mới hay tính năng hiện đại nào có thể khắc phục

Thực hiện đúng Ví dụ: CodeClimat, một công cụ thương mại có thể xác định các phương thức phức tạp:

️ 17. Kiểm tra sự sẵn sàng của bạn cho sự hỗn loạn liên quan đến Node

Làm: Thật kỳ lạ, hầu hết các thử nghiệm phần mềm chỉ về logic & dữ liệu, nhưng một số điều tồi tệ nhất xảy ra (và thực sự khó giảm thiểu) là các vấn đề về cơ sở hạ tầng. Ví dụ: bạn đã bao giờ kiểm tra những gì xảy ra khi bộ nhớ quá trình của bạn bị quá tải hoặc khi máy chủ / tiến trình chết hoặc hệ thống giám sát của bạn nhận ra khi API trở nên chậm hơn 50%?. Để kiểm tra và giảm thiểu những điều tồi tệ này - Kỹ thuật Chaos được sinh ra bởi Netflix. Nó nhằm mục đích cung cấp nhận thức, khung và công cụ để kiểm tra khả năng phục hồi ứng dụng của chúng tôi cho các vấn đề hỗn loạn. Ví dụ, một trong những công cụ nổi tiếng của nó, khỉ hỗn loạn, giết ngẫu nhiên các máy chủ để đảm bảo rằng dịch vụ của chúng tôi vẫn có thể phục vụ người dùng và không phụ thuộc vào một máy chủ duy nhất (cũng có phiên bản Kubernetes, kube-khỉ, giết chết pod). Tất cả các công cụ này hoạt động ở cấp độ lưu trữ / nền tảng, nhưng nếu bạn muốn kiểm tra và tạo hỗn loạn Node thuần túy như kiểm tra xem quy trình Node của bạn xử lý các lỗi chưa được xử lý như thế nào, từ chối lời hứa chưa được xử lý, bộ nhớ v8 bị quá tải với mức tối đa cho phép là 1,7 GB hay không UX của bạn vẫn đạt yêu cầu khi vòng lặp sự kiện bị chặn thường xuyên? để giải quyết điều này tôi đã viết, nút hỗn loạn (alpha) cung cấp tất cả các loại hành vi hỗn loạn liên quan đến Node

Mặt khác: Không có lối thoát ở đây, luật Murphy Murphy sẽ đánh vào sản xuất của bạn không thương tiếc

Thực hiện đúng Ví dụ: Node-chaos có thể tạo ra tất cả các loại trò đùa của Node.js để bạn có thể kiểm tra khả năng phục hồi của ứng dụng đối với sự hỗn loạn

*** Phần : Đo lường hiệu quả kiểm tra ***

️ 18. Nhận đủ bảo hiểm để tự tin, ~ 80% dường như là con số may mắn

Làm: Mục đích của kiểm tra là để có đủ tự tin để di chuyển nhanh, rõ ràng càng nhiều mã được kiểm tra thì nhóm càng có thể tự tin hơn. Độ bao phủ là thước đo xem có bao nhiêu dòng mã (và các nhánh, câu lệnh, v.v.) đang đạt được bằng các thử nghiệm. Vậy bao nhiêu là đủ? 103030% rõ ràng là quá thấp để có bất kỳ ý nghĩa nào về tính chính xác của bản dựng, mặt khác 100% là rất tốn kém và có thể chuyển trọng tâm của bạn từ các đường dẫn quan trọng sang các góc kỳ lạ của mã. Câu trả lời dài là nó phụ thuộc vào nhiều yếu tố như loại ứng dụng - nếu bạn xây dựng thế hệ tiếp theo của Airbus A380 hơn 100% thì đối với một trang web hình ảnh hoạt hình 50% có thể là quá nhiều. Mặc dù hầu hết những người đam mê thử nghiệm đều cho rằng ngưỡng bảo hiểm phù hợp là theo ngữ cảnh, nhưng hầu hết trong số họ cũng đề cập đến con số 80% là ngón tay cái của quy tắc (Fowler: INTERN ở trên 80 hoặc 90s trên) có lẽ sẽ đáp ứng hầu hết các ứng dụng .

Mẹo triển khai: Bạn có thể muốn định cấu hình tích hợp liên tục (CI) của mình để có ngưỡng bảo hiểm (liên kết Jest) và dừng một bản dựng không tuân theo tiêu chuẩn này (cũng có thể định cấu hình ngưỡng cho mỗi thành phần, xem ví dụ mã bên dưới) . Trên hết, hãy xem xét việc phát hiện mức độ bao phủ của bản dựng giảm (khi một mã mới được cam kết có độ bao phủ ít hơn) - điều này sẽ thúc đẩy các nhà phát triển tăng hoặc ít nhất là bảo toàn số lượng mã được kiểm tra. Tất cả những gì đã nói, phạm vi bảo hiểm chỉ là một biện pháp, một biện pháp dựa trên định lượng, không đủ để nói lên sự mạnh mẽ của thử nghiệm của bạn. Và nó cũng có thể bị đánh lừa như minh họa trong những viên đạn tiếp theo

Mặt khác: Sự tự tin và con số song hành với nhau, mà không thực sự biết rằng bạn đã thử nghiệm hầu hết hệ thống - cũng sẽ có một số nỗi sợ. và nỗi sợ sẽ làm bạn chậm lại

Ví dụ: Một báo cáo bảo hiểm điển hình

Báo cáo bảo hiểm Istanbul

Thực hiện đúng Ví dụ: Thiết lập vùng phủ sóng cho mỗi thành phần (sử dụng Jest)

Bảo hiểm bối cảnh

19. Kiểm tra các báo cáo bảo hiểm để phát hiện các khu vực chưa được kiểm tra và các vấn đề kỳ lạ khác

Do: Một số vấn đề lẻn ngay dưới radar và thực sự khó tìm bằng các công cụ truyền thống. Đây không phải là lỗi thực sự nhưng nhiều hành vi ứng dụng đáng ngạc nhiên có thể có tác động nghiêm trọng. Ví dụ: thường một số khu vực mã không bao giờ hoặc hiếm khi được gọi - bạn nghĩ rằng lớp 'Vật giá cả' luôn đặt giá sản phẩm nhưng thực tế nó không bao giờ được gọi mặc dù chúng tôi có 10000 sản phẩm trong DB và nhiều phạm vi bán hàng Mã bảo hiểm báo cáo giúp bạn nhận ra liệu ứng dụng có hoạt động theo cách bạn tin hay không. Ngoài ra, nó cũng có thể làm nổi bật loại mã nào không được kiểm tra - được thông báo rằng 80% mã được kiểm tra không cho biết các phần quan trọng có được bảo hiểm hay không. Tạo báo cáo rất dễ dàng - chỉ cần chạy ứng dụng của bạn trong sản xuất hoặc trong quá trình thử nghiệm với theo dõi phạm vi bảo hiểm và sau đó xem các báo cáo đầy màu sắc làm nổi bật tần suất mỗi vùng mã được gọi. Nếu bạn dành thời gian để xem qua dữ liệu này - bạn có thể tìm thấy một số vấn đề

Mặt khác: Nếu bạn don không biết phần nào trong mã của bạn không được kiểm tra, bạn không biết các vấn đề có thể đến từ đâu

Example Ví dụ chống mẫu: Điều gì đã sai với báo cáo bảo hiểm này? dựa trên một kịch bản trong thế giới thực, nơi chúng tôi đã theo dõi việc sử dụng ứng dụng của mình trong QA và tìm ra các mẫu đăng nhập thú vị (Gợi ý: số lượng lỗi đăng nhập là không theo tỷ lệ, rõ ràng có gì đó không ổn. Cuối cùng, một số lỗi frontend tiếp tục xảy ra API đăng nhập phụ trợ)

️ 20. Đo phạm vi logic bằng cách sử dụng thử nghiệm đột biến

Do: Chỉ số Bảo hiểm Truyền thống thường nói dối: Nó có thể hiển thị cho bạn phạm vi bảo hiểm 100% mã, nhưng không có chức năng nào của bạn, thậm chí không phải là một, trả về đúng phản hồi. Làm thế nào mà? nó chỉ đơn giản là đo các dòng mã mà bài kiểm tra đã truy cập, nhưng nó không kiểm tra xem các bài kiểm tra có thực sự kiểm tra bất cứ điều gì không - khẳng định cho phản hồi đúng. Giống như một người nào đó đi du lịch để kinh doanh và cho xem tem hộ chiếu của mình - điều này không chứng minh bất kỳ công việc nào được thực hiện, chỉ có điều anh ta đã đến thăm một số sân bay và khách sạn.

Thử nghiệm dựa trên đột biến là ở đây để giúp đỡ bằng cách đo lượng mã thực sự được KIỂM TRA không chỉ là VISITED. Stryker là một thư viện JavaScript để thử nghiệm đột biến và việc triển khai thực sự gọn gàng:

(1) nó cố tình thay đổi mã và các nhà máy lỗi bug. Ví dụ: mã newOrder.price === 0 trở thành newOrder.price! = 0. Bọ xít này bị lỗi được gọi là đột biến

(2) nó chạy thử nghiệm, nếu tất cả thành công thì chúng ta có một vấn đề - các thử nghiệm đã không phục vụ mục đích phát hiện ra lỗi của chúng, các đột biến được gọi là sống sót. Nếu các thử nghiệm thất bại, thì tuyệt vời, các đột biến đã bị giết.

Biết rằng tất cả hoặc hầu hết các đột biến đã bị giết mang lại độ tin cậy cao hơn nhiều so với phạm vi bảo hiểm truyền thống và thời gian thiết lập là tương tự

Mặt khác: Bạn sẽ bị lừa khi tin rằng phạm vi bảo hiểm 85% có nghĩa là thử nghiệm của bạn sẽ phát hiện ra lỗi trong 85% mã của bạn

Ví dụ chống mẫu: Bảo hiểm 100%, kiểm tra 0%

Thực hiện đúng Ví dụ: Stryker báo cáo, một công cụ để kiểm tra đột biến, phát hiện và đếm số lượng mã không được kiểm tra (Đột biến)

Báo cáo của Stryker - Biết rằng tất cả hoặc hầu hết các đột biến đã bị giết mang lại độ tin cậy cao hơn nhiều so với phạm vi bảo hiểm truyền thống và thời gian thiết lập là tương tự

*** Phần : CI & Các biện pháp chất lượng khác ***

️ 21. Làm phong phú các linters của bạn và hủy bỏ các bản dựng có vấn đề về lint

Do: Linters là một bữa ăn trưa miễn phí, với thiết lập 5 phút bạn nhận được miễn phí một trình điều khiển tự động bảo vệ mã của bạn và nắm bắt được vấn đề quan trọng khi bạn nhập. Đã qua rồi cái thời mà linting nói về mỹ phẩm (không có dấu chấm phẩy!). Ngày nay, Linters có thể bắt gặp các vấn đề nghiêm trọng như lỗi không được ném chính xác và mất thông tin. Ngoài bộ quy tắc cơ bản của bạn (như tiêu chuẩn ESLint hoặc kiểu Airbnb), hãy xem xét bao gồm một số Linters chuyên dụng như eslint-plugin-chai-mong đợi có thể khám phá các bài kiểm tra mà không cần xác nhận, eslint-plugin-hứa có thể khám phá những lời hứa mà không cần giải quyết ( mã sẽ không bao giờ tiếp tục), eslint-plugin-security có thể khám phá các biểu thức regex háo hức có thể được sử dụng cho các cuộc tấn công DOS và eslint-plugin-you-dont-need-lodash-underscore có khả năng báo động khi mã sử dụng các phương thức thư viện tiện ích đó là một phần của các phương thức lõi V8 như Lodash._map (Mạnh)

Mặt khác: Hãy xem xét một ngày mưa khi sản phẩm của bạn tiếp tục gặp sự cố nhưng các bản ghi don don hiển thị dấu vết ngăn xếp lỗi. Chuyện gì đã xảy ra? Mã của bạn đã ném nhầm một đối tượng không có lỗi và dấu vết ngăn xếp bị mất, một lý do chính đáng để đập đầu bạn vào một bức tường gạch. Thiết lập linter 5 phút có thể phát hiện TYPO này và tiết kiệm ngày của bạn

Ví dụ chống mẫu: Đối tượng Lỗi sai bị ném nhầm, không có dấu vết ngăn xếp nào xuất hiện cho lỗi này. May mắn thay, ESLint bắt lỗi sản xuất tiếp theo

Đối tượng Lỗi sai được ném nhầm, không có dấu vết ngăn xếp nào xuất hiện cho lỗi này. May mắn thay, ESLint bắt lỗi sản xuất tiếp theo

22. Rút ngắn vòng phản hồi với nhà phát triển địa phương-CI

Làm: Sử dụng CI với các kiểm tra chất lượng sáng bóng như kiểm tra, linting, kiểm tra lỗ hổng, v.v? Giúp các nhà phát triển chạy đường ống này cũng cục bộ để thu hút phản hồi tức thì và rút ngắn vòng phản hồi. Tại sao? một quy trình kiểm tra hiệu quả cấu thành nhiều vòng lặp và lặp lại: (1) thử lại -> (2) phản hồi -> (3) tái cấu trúc. Phản hồi càng nhanh, các nhà phát triển có thể thực hiện càng nhiều lần cải tiến và hoàn thiện kết quả. Mặt khác, khi thông tin phản hồi đến muộn, số lần lặp cải tiến ít hơn có thể được đóng gói trong một ngày, nhóm có thể đã chuyển sang chủ đề / nhiệm vụ / mô-đun khác và có thể không sẵn sàng tinh chỉnh mô-đun đó.

Thực tế, một số nhà cung cấp CI (Ví dụ: CircleCI tải CLI) cho phép chạy đường ống cục bộ. Một số công cụ thương mại như wallaby cung cấp những hiểu biết sâu sắc và thử nghiệm dưới dạng nguyên mẫu của nhà phát triển (không liên kết). Ngoài ra, bạn chỉ có thể thêm tập lệnh npm vào gói.json chạy tất cả các lệnh chất lượng (ví dụ: kiểm tra, lint, lỗ hổng) - sử dụng các công cụ như đồng thời để mã hóa song song và mã thoát không bằng 0 nếu một trong các công cụ không thành công. Bây giờ, nhà phát triển chỉ cần gọi một lệnh - ví dụ: ‘Npm chạy chất lượng - để nhận phản hồi ngay lập tức. Cũng xem xét hủy bỏ cam kết nếu kiểm tra chất lượng không thành công khi sử dụng githook (husky có thể giúp)

Mặt khác: Khi kết quả chất lượng đến vào ngày sau mã, thử nghiệm không trở thành một phần thông thạo của sự phát triển thay vì sau khi thực tế chính thức

Thực hiện đúng Ví dụ: các tập lệnh npm thực hiện kiểm tra chất lượng mã, tất cả được chạy song song theo yêu cầu hoặc khi nhà phát triển đang cố gắng đẩy mã mới

23. Thực hiện kiểm tra e2e trên gương sản xuất thực

Do: Thử nghiệm từ đầu đến cuối (e2e) là thách thức chính của mọi đường ống CI - tạo ra một gương sản xuất phù du giống hệt nhau khi đang bay với tất cả các dịch vụ đám mây liên quan có thể rất tẻ nhạt và tốn kém. Tìm kiếm sự thỏa hiệp tốt nhất là trò chơi của bạn: Docker-compose cho phép tạo ra môi trường được neo riêng biệt với các thùng chứa giống hệt nhau bằng một tệp văn bản đơn giản nhưng công nghệ sao lưu (ví dụ: mạng, mô hình triển khai) khác với các sản phẩm trong thế giới thực. Bạn có thể kết hợp nó với ‘AWS Local, để hoạt động với các dịch vụ AWS thực sự. Nếu bạn đã đi nhiều máy chủ như nhiều máy chủ như serverless và AWS SAM cho phép gọi mã Faas cục bộ.

Hệ sinh thái Kubernetes khổng lồ vẫn chưa chính thức hóa một công cụ thuận tiện tiêu chuẩn để phản chiếu cục bộ và phản chiếu CI mặc dù nhiều công cụ mới được ra mắt thường xuyên. Một cách tiếp cận là chạy Kubernetes tối thiểu hóa bằng cách sử dụng các công cụ như Minikube và MicroK8 giống với vật thật chỉ đi kèm với ít chi phí hơn. Một cách tiếp cận khác là thử nghiệm trên một ern real-Kubernetes, một số nhà cung cấp CI (ví dụ Codefresh) đã tích hợp tự nhiên với môi trường Kubernetes và giúp dễ dàng chạy đường ống CI trên thực tế, những người khác cho phép kịch bản tùy chỉnh chống lại Kubernetes từ xa.

Mặt khác: Sử dụng các công nghệ khác nhau cho sản xuất và thử nghiệm yêu cầu duy trì hai mô hình triển khai và giữ cho các nhà phát triển và nhóm ops tách biệt

Ví dụ: một đường ống CI tạo ra cụm Kubernetes một cách nhanh chóng (Tín dụng: Môi trường động Kubernetes)

triển khai:
giai đoạn: triển khai
hình ảnh: registry.gitlab.com/gitlab-examples/kubernetes-deploy
kịch bản:
- ./coolCluster.sh $ KUBE_CA_PEM_FILE $ KUBE_URL $ KUBE_TOKEN
- kubectl tạo ns $ NnamPACE
- kubectl tạo bí mật "$ GITLAB_USER_EMAIL"
- mkdir. được tạo ra
- tiếng vang "$ CI_BUILD_REF_NAME- $ CI_BUILD_REF"
- sed -e "s / TAG / $ CI_BUILD_REF_NAME- $ CI_BUILD_REF / g" mẫu / deal.yaml | tee ".generated / deal.yaml"
- áp dụng kubectl - tên gọi $ NAMESPACE -f .generated / deal.yaml
- áp dụng kubectl - tên mẫu $ NAMESPACE -f mẫu / my-sock-shop.yaml
xung quanh:
tên: test-for-ci

24. Song song thực hiện kiểm tra

Làm: Khi thực hiện đúng, kiểm tra là người bạn 24/7 của bạn cung cấp phản hồi gần như ngay lập tức. Trong thực tế, việc thực hiện 500 bài kiểm tra đơn vị giới hạn CPU trên một luồng có thể mất nhiều thời gian. May mắn thay, các trình chạy thử nghiệm hiện đại và nền tảng CI (như các phần mở rộng Jest, AVA và Mocha) có thể song song thử nghiệm thành nhiều quy trình và đạt được sự cải thiện đáng kể về thời gian phản hồi. Một số nhà cung cấp CI cũng thực hiện song song các thử nghiệm trên các container (!) Để rút ngắn vòng phản hồi hơn nữa. Cho dù cục bộ qua nhiều quy trình, hoặc qua một số CLI trên đám mây bằng cách sử dụng nhiều máy - song song nhu cầu giữ cho các thử nghiệm tự chủ vì mỗi quy trình có thể chạy trên các quy trình khác nhau

Mặt khác: Nhận kết quả thử nghiệm dài 1 giờ sau khi đẩy mã mới, vì bạn đã mã hóa các tính năng tiếp theo, là một công thức tuyệt vời để làm cho thử nghiệm ít liên quan hơn

Thực hiện đúng Ví dụ: Mocha song song & Jest dễ dàng vượt qua Mocha truyền thống nhờ kiểm tra song song (Tín dụng: Điểm chuẩn chạy thử JavaScript)

25. Tránh xa các vấn đề pháp lý bằng cách sử dụng giấy phép và kiểm tra đạo văn

Làm: Vấn đề cấp phép và đạo văn có lẽ không phải là mối quan tâm chính của bạn ngay bây giờ, nhưng tại sao không đánh dấu vào ô này trong 10 phút? Một loạt các gói npm như kiểm tra giấy phép và kiểm tra đạo văn (thương mại với gói miễn phí) có thể dễ dàng được đưa vào đường ống CI của bạn và kiểm tra các nỗi buồn như phụ thuộc với giấy phép hạn chế hoặc mã được sao chép từ Stackoverflow và rõ ràng vi phạm một số bản quyền

Mặt khác: Vô tình, nhà phát triển có thể sử dụng các gói có giấy phép không phù hợp hoặc sao chép-dán mã thương mại và gặp vấn đề pháp lý

Làm đúng ví dụ:

// cài đặt trình kiểm tra giấy phép trong môi trường CI của bạn hoặc cục bộ
npm cài đặt -g kiểm tra giấy phép
// yêu cầu nó quét tất cả các giấy phép và không thành công với mã thoát khác 0 nếu tìm thấy giấy phép trái phép. Hệ thống CI sẽ bắt lỗi này và dừng việc xây dựng
người kiểm tra giấy phép --summary --failOn BSD

️26. Thường xuyên kiểm tra các phụ thuộc dễ bị tổn thương

Do: Ngay cả những phụ thuộc có uy tín nhất như Express cũng có các lỗ hổng đã biết. Điều này có thể dễ dàng được thuần hóa bằng các công cụ cộng đồng như kiểm toán npm hoặc các công cụ thương mại như snyk (cung cấp phiên bản cộng đồng miễn phí). Cả hai có thể được gọi từ CI của bạn trên mọi bản dựng

Mặt khác: Giữ cho mã của bạn sạch khỏi các lỗ hổng mà không có các công cụ chuyên dụng sẽ yêu cầu phải liên tục theo dõi các ấn phẩm trực tuyến về các mối đe dọa mới. Khá tẻ nhạt

Ví dụ: Kết quả kiểm toán NPM

27. Tự động cập nhật phụ thuộc

Do: Giới thiệu mới nhất về gói-lock.json đã giới thiệu một thách thức nghiêm trọng (đường đến địa ngục được lát bằng ý định tốt) - theo mặc định, các gói không còn được cập nhật nữa. Ngay cả một nhóm đang chạy nhiều triển khai mới với bản cập nhật ‘npm cài đặt & & npm cập nhật, won won đã nhận được bất kỳ bản cập nhật mới nào. Điều này dẫn đến các phiên bản gói phụ thuộc tốt nhất hoặc mã dễ bị tổn thương nhất. Các nhóm hiện dựa vào thiện chí và bộ nhớ của nhà phát triển để cập nhật thủ công gói.json hoặc sử dụng các công cụ như ncu theo cách thủ công. Một cách đáng tin cậy hơn có thể là tự động hóa quá trình có được các phiên bản phụ thuộc đáng tin cậy nhất, mặc dù không có giải pháp đạn bạc nào nhưng vẫn có hai con đường tự động hóa có thể: (1) CI có thể thất bại trong các bản dựng có phụ thuộc lỗi thời - sử dụng các công cụ như 'npm lỗi thời 'hoặc' npm-check-update (ncu) '. Làm như vậy sẽ buộc các nhà phát triển cập nhật các phụ thuộc. (2) Sử dụng các công cụ thương mại quét mã và tự động gửi yêu cầu kéo với các phụ thuộc được cập nhật. Một câu hỏi thú vị còn lại là chính sách cập nhật phụ thuộc là gì - cập nhật trên mỗi bản vá tạo ra quá nhiều chi phí, cập nhật ngay khi bản chính được phát hành có thể chỉ ra một phiên bản không ổn định (nhiều gói bị phát hiện vào những ngày đầu tiên sau khi được phát hành, xem sự cố phạm vi eslint). Chính sách cập nhật hiệu quả có thể cho phép một số giai đoạn phù hợp - hãy để mã chậm hơn @latest một thời gian và các phiên bản trước khi coi bản sao cục bộ là lỗi thời (ví dụ: phiên bản cục bộ là 1.3.1 và phiên bản kho lưu trữ là 1.3.8)

Mặt khác: Sản phẩm của bạn sẽ chạy các gói đã được tác giả của chúng gắn thẻ rõ ràng là rủi ro

Ví dụ: ncu có thể được sử dụng thủ công hoặc trong một đường ống CI để phát hiện mức độ mã bị tụt hậu so với các phiên bản mới nhất

28. Các mẹo khác, không liên quan đến Node, CI

Do: Bài đăng này tập trung vào kiểm tra lời khuyên có liên quan đến, hoặc ít nhất có thể được minh họa bằng Node JS. Tuy nhiên, viên đạn này nhóm một số mẹo không liên quan đến Node nổi tiếng

  1. Sử dụng một cú pháp khai báo. Đây là tùy chọn duy nhất cho hầu hết các nhà cung cấp nhưng các phiên bản cũ hơn của Jenkins cho phép sử dụng mã hoặc giao diện người dùng
  2. Chọn một nhà cung cấp có hỗ trợ Docker gốc
  3. Thất bại sớm, chạy thử nghiệm nhanh nhất của bạn đầu tiên. Tạo một ‘Khói thử nghiệm bước / cột mốc của nhóm, nhóm nhiều lần kiểm tra nhanh (ví dụ: linting, kiểm tra đơn vị) và cung cấp phản hồi linh hoạt cho người chuyển mã
  4. Giúp dễ dàng lướt qua tất cả các tạo phẩm xây dựng bao gồm báo cáo thử nghiệm, báo cáo bảo hiểm, báo cáo đột biến, nhật ký, v.v.
  5. Tạo nhiều đường ống / công việc cho mỗi sự kiện, sử dụng lại các bước giữa chúng. Ví dụ: định cấu hình một công việc cho các cam kết của nhánh tính năng và một công việc khác cho PR chính. Để mỗi logic sử dụng lại sử dụng các bước được chia sẻ (hầu hết các nhà cung cấp cung cấp một số cơ chế để sử dụng lại mã
  6. Không bao giờ nhúng các bí mật trong bản tuyên bố công việc, lấy chúng từ một cửa hàng bí mật hoặc từ cấu hình công việc
  7. Phiên bản nâng cấp rõ ràng trong bản dựng phát hành hoặc ít nhất là đảm bảo nhà phát triển đã làm như vậy
  8. Chỉ xây dựng một lần và thực hiện tất cả các kiểm tra đối với tạo phẩm xây dựng đơn (ví dụ: hình ảnh Docker)
  9. Thử nghiệm trong môi trường phù du không trạng thái trôi dạt giữa các bản dựng. Bộ nhớ đệm_modules có thể là ngoại lệ duy nhất

Nếu không: Bạn sẽ bỏ lỡ nhiều năm khôn ngoan

29. Xây dựng ma trận: Chạy các bước CI giống nhau bằng nhiều phiên bản Nút

Làm: Kiểm tra chất lượng là về sự ngẫu nhiên, bạn càng có nhiều cơ sở thì bạn càng gặp nhiều may mắn trong việc phát hiện sớm các vấn đề. Khi phát triển các gói có thể tái sử dụng hoặc chạy sản xuất nhiều khách hàng với các phiên bản Node và cấu hình khác nhau, CI phải chạy hệ thống kiểm tra trên tất cả các hoán vị của cấu hình. Ví dụ: giả sử chúng tôi sử dụng myQuery cho một số khách hàng và Postgres cho những người khác - một số nhà cung cấp CI hỗ trợ một tính năng gọi là 'Ma trận' cho phép chạy thử nghiệm chống lại tất cả các hoán vị của myQuery, Postgres và nhiều phiên bản Node như 8, 9 và 10. Điều này được thực hiện chỉ bằng cách sử dụng cấu hình mà không cần bất kỳ nỗ lực bổ sung nào (giả sử bạn có kiểm tra hoặc bất kỳ kiểm tra chất lượng nào khác). Các TCTD khác không hỗ trợ Ma trận có thể có tiện ích mở rộng hoặc chỉnh sửa để cho phép điều đó

Mặt khác: Vì vậy, sau khi thực hiện tất cả công việc khó khăn đó để kiểm tra viết, chúng ta sẽ để lỗi lén lút chỉ vì vấn đề cấu hình?

Ví dụ: Sử dụng định nghĩa xây dựng Travis (nhà cung cấp CI) để chạy thử nghiệm tương tự trên nhiều phiên bản Nút

ngôn ngữ: node_js
nút_js:
  - "7"
  - "6"
  - "5"
  - "4"
Tải về:
  - cài đặt npm
kịch bản:
  - chạy thử npm

Cảm ơn bạn. Các bài viết khác bạn có thể thích

  • Danh sách kiểm tra: Thực hành tốt nhất về sản xuất Node.js (tháng 8 năm 2018)
  • 19 cách để trở thành nhà phát triển Node.js tốt hơn vào năm 2019
  • Thực tiễn tốt nhất về bảo mật của Node.js (tháng 9 năm 2018)
  • YouTube: 5 kỹ thuật thử nghiệm tiên tiến và sáng bóng
  • Thực tiễn tốt nhất của Node.js - 79 thực tiễn tốt nhất cho ứng dụng Node mạnh mẽ

Muốn nhiều hơn? theo tôi trên Twitter

Có mẹo thử nghiệm của riêng bạn? PR ở đây và tôi chắc chắn sẽ cập nhật bài viết này