Những cách tốt nhất để kiểm tra các ứng dụng không có máy chủ của bạn

Serverless không chỉ là một mô hình thực thi điện toán đám mây. Nó thay đổi cách chúng ta lập kế hoạch, xây dựng và triển khai các ứng dụng. Nhưng nó cũng thay đổi cách chúng tôi kiểm tra ứng dụng của mình.

Gặp Alex. Alex là một nhà phát triển JavaScript bình thường, gần đây tập trung vào Node.js.

Đây là Alex

Trong vài tháng qua, những người bạn tốt của anh, Anna và Jeff, luôn nói về chuyện không có máy chủ đó. Ngay cả khi thỉnh thoảng họ cũng thấy khó chịu, anh thích ý tưởng về các ứng dụng không có máy chủ. Anh ta thậm chí đã triển khai một vài chức năng đơn giản cho AWS Lambda và Azure tại một số điểm.

Anna và Jeff luôn nói về chuyện không có máy chủ đó

Tại một số điểm, Alex và nhóm của anh ấy đã có một dự án mới. Sau một số phân tích, Alex nghĩ rằng nó sẽ phù hợp hoàn hảo cho máy chủ. Ông trình bày ý tưởng cho nhóm của mình. Một số thành viên trong nhóm rất hào hứng, một trong số họ đã thích điều đó, nhưng hầu hết trong số họ đã không có ý kiến ​​mạnh mẽ. Vì vậy, họ quyết định thử nó - dự án không quá lớn và rủi ro là thấp.

Đội Alex Alex thảo luận về việc sử dụng serverless trong dự án mới của họ

Nhóm nghiên cứu đọc về serverless và họ có ý tưởng về cách cấu trúc ứng dụng mới của họ. Nhưng không ai chắc chắn làm thế nào họ có thể phù hợp với serverless trong quy trình phát triển chung của họ.

Tại thời điểm đó, quá trình của họ trông như thế này:

  1. Họ phân tích một tính năng mới.
  2. Đối với các tính năng ít phức tạp hơn, chúng bắt đầu bằng mã, sau đó chúng chạy mã cục bộ và thêm một số thử nghiệm cuối cùng.
  3. Đối với các tính năng phức tạp hơn, chúng thực hiện phiên bản TDD của chúng: chúng bắt đầu bằng các thử nghiệm, sau đó viết mã và kiểm tra cục bộ.
  4. Khi tính năng đã sẵn sàng, nó sẽ chuyển đến công cụ CI triển khai nó vào môi trường thử nghiệm.
  5. Sau đó, nhóm QA có một tính năng mới cho một vòng thử nghiệm thủ công khác. Nếu mọi thứ đều ổn, ứng dụng sẽ chuyển qua CI để sản xuất.
Quá trình phát triển chung của nhóm Alex

Họ quyết định bắt đầu từng bước, và sau đó giải quyết các vấn đề khi họ gặp phải chúng.

Họ đã chọn một tính năng nhỏ và vì nó đơn giản, họ đã bắt đầu với mã. Khi phần mã hóa đã sẵn sàng, họ đã chạm vào rào cản đầu tiên: làm thế nào để bạn chạy các ứng dụng không có máy chủ cục bộ?

Thử nghiệm cục bộ

Với các ứng dụng không có máy chủ, bạn không thể quản lý cơ sở hạ tầng. Âm thanh tuyệt vời, nhưng làm thế nào để bạn chạy ứng dụng của mình cục bộ? Bạn thậm chí có thể làm điều đó?

Rào cản đầu tiên: làm thế nào để bạn chạy ứng dụng serverless cục bộ?

Tùy thuộc vào ứng dụng của bạn và nhà cung cấp không có máy chủ, bạn có thể chạy một số phần của ứng dụng cục bộ. Để làm như vậy, bạn có thể sử dụng một số công cụ và kỹ thuật sau:

  • Azure Chức năng Công cụ cốt lõi (đối với chức năng Azure)
  • AWS SAM CLI (dành cho ứng dụng AWS Lambda được xây dựng bằng AWS SAM)
  • Các công cụ của bên thứ ba (ví dụ: localstack)
  • docker-lambda cho mô phỏng địa phương AWS Lambda
  • Chạy hàm Node.js cục bộ

Tất nhiên, danh sách này chưa đầy đủ - có nhiều công cụ hơn và chúng tôi thấy các công cụ mới gần như mỗi ngày.

Hầu hết các công cụ này có những hạn chế nhất định. Họ có thể mô phỏng các chức năng không có máy chủ và một vài dịch vụ khác, chẳng hạn như API Gateway. Nhưng những gì về quyền, lớp auth và các dịch vụ khác?

Kiểm tra cục bộ giúp xác nhận nhanh chóng để đảm bảo chức năng của bạn hoạt động. Nhưng có cách nào tốt hơn để đảm bảo ứng dụng serverless của bạn hoạt động như dự định không? Có, có. Bước đầu tiên và quan trọng nhất là: viết bài kiểm tra.

Vì vậy, Alex và nhóm của anh ấy đã thử chức năng đầu tiên của họ tại địa phương, và dường như nó đang hoạt động. Sau đó, họ đã đi đến bước tiếp theo.

Kiểm tra tự động

Alex và nhóm của anh ấy đã chuyển sang Jest để thử nghiệm các ứng dụng Node.js của họ. Họ vẫn làm rất nhiều giao diện người dùng, vì vậy họ muốn sử dụng cùng các công cụ cho toàn bộ ngăn xếp bất cứ khi nào họ có thể. Họ có thể sử dụng Jest để thử nghiệm các ứng dụng không có máy chủ không? Và họ nên kiểm tra cái gì?

Rào cản thứ hai: serverless ảnh hưởng đến thử nghiệm tự động như thế nào?

Sau khi điều tra nhanh, họ nhận ra rằng họ có thể sử dụng các công cụ kiểm tra Node.js yêu thích của mình. Jest, Jasmine, Mocha và những người khác làm việc tốt với serverless.

Bạn nên thử nghiệm gì trong một ứng dụng không có máy chủ?

Với các ứng dụng Node.js của họ, Alex và nhóm của anh ta đi theo kim tự tháp thử nghiệm ba tầng. Kim tự tháp thử nghiệm được Mike Cohn nhắc đến lần đầu tiên trong cuốn sách Thành công với Agile Hồi.

Như kim tự tháp thử nghiệm xác định, họ có:

  • Rất nhiều bài kiểm tra đơn vị, vì chúng rẻ nhất (nhanh nhất để viết và chạy)
  • Ít thử nghiệm tích hợp hơn, vì chúng đắt hơn và chúng mất nhiều thời gian hơn để chạy
  • Một vài thử nghiệm UI, vì chúng đắt nhất (yêu cầu một số công cụ GUI) và chậm nhất để chạy

Bên cạnh đó, họ cũng có thử nghiệm dựa trên phiên thủ công, được thực hiện bởi nhóm QA của họ.

thử nghiệm kim tự tháp với thử nghiệm thủ công

Làm thế nào để serverless ảnh hưởng đến kim tự tháp thử nghiệm?

Câu trả lời phụ thuộc vào cấp bậc. Nhưng kim tự tháp thử nghiệm trông ít giống kim tự tháp Ai Cập, và giống kim tự tháp của người Maya hơn.

Lớp kiểm tra đơn vị không bị ảnh hưởng nhiều. Các bài kiểm tra đơn vị vẫn rẻ nhất để viết và chạy, nhưng các đơn vị có thể nhỏ hơn.

Lớp kiểm thử tích hợp trở nên quan trọng hơn bao giờ hết, bởi vì các ứng dụng không có máy chủ phụ thuộc rất nhiều vào tích hợp. Nó cũng rẻ hơn, bởi vì có một cơ sở dữ liệu máy chủ chỉ để thử nghiệm là rẻ. Vì vậy, trong một kim tự tháp thử nghiệm không có máy chủ, bạn cần phải có nhiều thử nghiệm tích hợp hơn.

Lớp kiểm tra GUI cũng rẻ hơn và nhanh hơn, vì sự song song rẻ hơn.

Lớp kiểm tra thủ công vẫn giữ nguyên. Nhưng serverless có thể giúp bạn cải thiện nó một chút. Chúng tôi sẽ đi sâu vào chi tiết về điều đó sau.

Máy chủ thử nghiệm Serverless Kim tự tháp

Alex và nhóm của anh ấy cuối cùng đã có một số ý tưởng nơi tập trung. Vấn đề tiếp theo là làm thế nào để viết một hàm để kiểm tra chúng dễ dàng hơn.

Làm thế nào để viết một hàm serverless có thể kiểm tra

Bạn cần suy nghĩ về những rủi ro sau trong khi bạn đang viết một chức năng không có máy chủ:

  • Rủi ro cấu hình Cơ sở dữ liệu và bảng có đúng không? Hoặc, bạn có quyền truy cập?
  • Rủi ro quy trình công việc kỹ thuật Bạn có phân tích cú pháp và sử dụng yêu cầu đến như bạn muốn không? Hoặc, bạn đang xử lý các phản hồi và lỗi thành công một cách chính xác?
  • Rủi ro logic kinh doanh Bạn có tuân theo tất cả các quy tắc logic kinh doanh mà ứng dụng của bạn có không?
  • Rủi ro tích hợp Bạn đang đọc chính xác cấu trúc yêu cầu đến? Hoặc bạn đang lưu trữ thứ tự vào cơ sở dữ liệu chính xác?

Để xác nhận rằng chức năng serverless của bạn hoạt động chính xác, bạn cần kiểm tra tất cả các rủi ro này.

Bạn có thể kiểm tra từng thứ như bạn đã làm cho các bài kiểm tra tích hợp. Nhưng việc thiết lập và định cấu hình dịch vụ mỗi lần bạn muốn kiểm tra một trong những rủi ro này là tối ưu. Như bạn tôi, Alexanderar Simovic rất thích nói:

Hãy tưởng tượng nếu thử nghiệm ô tô đã được thực hiện theo cách đó. Điều đó có nghĩa là mỗi khi bạn muốn kiểm tra một ốc vít hoặc thậm chí là một chiếc gương trong xe hơi, bạn sẽ phải lắp ráp và sau đó tháo rời toàn bộ chiếc xe.

Để làm cho ứng dụng dễ kiểm tra hơn, giải pháp rõ ràng là chia nhỏ chức năng của bạn thành nhiều phần nhỏ hơn.

Một trong những cách tuyệt vời để làm như vậy là áp dụng Hexagonal Architecture cho các chức năng không có máy chủ của bạn.

Kiến trúc lục giác, hay Cổng và Bộ điều hợp, là một dạng kiến ​​trúc ứng dụng nhằm thúc đẩy sự phân tách mối quan tâm thông qua các lớp trách nhiệm. Là người tạo ra nó, Alistair Cockburn, giải thích:

Cho phép ứng dụng được điều khiển bởi người dùng, chương trình, kiểm tra tự động hoặc tập lệnh bó và được phát triển và kiểm tra tách biệt với các thiết bị và cơ sở dữ liệu thời gian chạy cuối cùng của nó.

Vì vậy, làm thế nào mà áp dụng cho các chức năng máy chủ?

Khi Alex và nhóm của anh ấy sử dụng AWS, họ đã kết thúc với một cấu trúc như sau:

  • Chức năng logic kinh doanh phơi bày vài cổng trên mạng (hoặc mong đợi một vài đối số). Ví dụ: một cho sự kiện đến, một cho lưu trữ vĩnh viễn và một cho thông báo.
  • Họ có hai bộ điều hợp cho sự kiện kích hoạt chức năng, một cho bộ kích hoạt AWS Lambda thực và một bộ khác để thử nghiệm cục bộ.
  • Họ có một số bộ điều hợp để lưu trữ và thông báo vĩnh viễn. Ví dụ: bộ điều hợp bảng DynamoDB và bộ điều hợp trong bộ nhớ.
Kiến trúc lục giác của hàm AWS Lambda

Alex và đội của anh ấy rất vui khi họ tiến về phía trước. Nhưng trước khi chúng ta tiếp tục, hãy cùng để xem cách Kiến trúc lục giác ảnh hưởng đến từng tầng của kim tự tháp thử nghiệm.

Kiểm tra đơn vị

Các bài kiểm tra đơn vị giữ nguyên. Nhưng nó dễ dàng hơn để viết các bài kiểm tra đơn vị vì Kiến trúc lục giác. Họ có thể chỉ cần sử dụng bộ điều hợp cục bộ hoặc giả làm bộ điều hợp để kiểm tra riêng lớp chức năng kinh doanh.

Thử nghiệm hội nhập

Các thử nghiệm tích hợp được hưởng lợi rất nhiều từ Kiến trúc lục giác. Họ đã có thể kiểm tra đầy đủ các tích hợp mà họ sở hữu. Tích hợp của bên thứ ba được mô phỏng với các bộ điều hợp khác.

Làm thế nào mà nó hoạt động trong thực tế?

Mỗi chức năng không có máy chủ của họ có tệp lambda.js và main.js. Tệp chính chứa logic nghiệp vụ của hàm serverless. Và tệp lambda.js chịu trách nhiệm nối các bộ điều hợp và gọi tệp main.js.

Các tập tin chính có đơn vị riêng và kiểm tra tích hợp. Nhưng các thử nghiệm tích hợp của nó không thử nghiệm tích hợp đầy đủ với các dịch vụ cuối, như AWS S3, vì điều đó sẽ làm chậm chúng. Thay vào đó, họ sử dụng bộ điều hợp trong bộ nhớ để kiểm tra chức năng tích hợp lưu trữ tệp.

Tích hợp AWS S3 được thực hiện thông qua FileRep repository, nơi có các bài kiểm tra đơn vị và tích hợp riêng. Kiểm tra tích hợp sử dụng AWS S3 để đảm bảo rằng tích hợp cuối thực sự hoạt động.

Trái ngược với main.js, tệp lambda.js không có các bài kiểm tra, bởi vì hầu hết thời gian nó chỉ có một vài dòng mã.

Biểu diễn trực quan của chức năng AWS Lambda với các bài kiểm tra

Cách tiếp cận này giống như kỹ thuật mà nhóm MindMup đang sử dụng để kiểm tra các chức năng không có máy chủ. Với nó, bạn có thể dễ dàng kiểm tra tích hợp các chức năng của mình và vẫn giúp kiểm tra tích hợp nhanh hơn.

Kiểm tra GUI

Vì Alex và nhóm của anh ấy đang xây dựng một phần cuối cho ứng dụng, tầng kiểm tra GUI không liên quan. Nhưng khi họ tìm hiểu thêm về serverless, họ nhận ra rằng họ có thể sử dụng nó để cải thiện tầng kiểm tra GUI cho các ứng dụng khác mà họ đang làm việc.

Kiểm tra giao diện người dùng rất tốn kém và chậm, vì chúng chạy trong trình duyệt. Nhưng, serverless là rẻ và nó có quy mô nhanh.

Nếu họ có thể chạy một trình duyệt trong AWS Lambda, họ sẽ có được sự song song hóa giá rẻ. Điều đó sẽ làm cho các bài kiểm tra UI của họ rẻ hơn và nhanh hơn.

Nhưng, bạn có thể chạy một trình duyệt, chẳng hạn như Chrome, bên trong chức năng không có máy chủ không?

Đúng! Và thật dễ dàng với sự trợ giúp của một công cụ như Serverless Chrome, Chromless và Puppeteer.

Sử dụng các chức năng AWS Lambda để song song hóa các bài kiểm tra UI

Một sự kết hợp giữa các trình duyệt không có máy chủ và không đầu có thể mang đến cho chúng ta một thế hệ công cụ kiểm tra giao diện người dùng mới. Chúng tôi đã có thể xem và thử một số trong số họ, chẳng hạn như Thẩm định.

CI / CD

Khi Alex và nhóm của anh thử nghiệm chức năng không có máy chủ đầu tiên của họ, đã đến lúc triển khai mã đến môi trường thử nghiệm. Điều đó đưa ra một câu hỏi mới: làm thế nào họ có thể sử dụng các công cụ CI / CD để triển khai ứng dụng không có máy chủ của họ?

Câu trả lời rất đơn giản: họ có thể sử dụng công cụ CI để chạy thử nghiệm và triển khai ứng dụng. Để triển khai ứng dụng, hãy sử dụng bất kỳ công cụ phổ biến nào, chẳng hạn như Claudia.js, AWS SAM và Serverless Framework.

Bạn vẫn có thể sử dụng công cụ CI yêu thích của mình (như Jenkins, TravisCI hoặc SemaphoreCI) hoặc nếu bạn muốn gắn bó với AWS, bạn có thể thử AWS CodeBuild.

Kiểm tra bằng tay

Ngay cả thông qua kiểm tra thủ công không bị ảnh hưởng trực tiếp bởi serverless, nhóm đã tìm ra cách cải thiện quy trình QA của họ.

Các giai đoạn và triển khai ứng dụng serverless có giá rẻ và thường nhanh để thiết lập. Ngoài ra, với serverless, bạn không nên trả tiền cho ứng dụng nếu không có ai sử dụng.

Điều này có nghĩa là có một môi trường thử nghiệm chưa bao giờ rẻ hơn!

Ngoài ra, với serverless, bạn thường có thể quảng bá chức năng từ giai đoạn này sang giai đoạn khác. Điều này có nghĩa là nhóm QA của bạn có thể kiểm tra một chức năng và khi họ xác nhận rằng nó hoạt động, bạn có thể quảng bá chức năng tương tự để sản xuất.

Ngoài thử nghiệm

Alex và nhóm của anh đã chuyển chức năng không có máy chủ đầu tiên của họ sang tiền sản xuất, và nhóm rất vui khi họ học cách kiểm tra các ứng dụng không có máy chủ.

Họ tiếp tục sử dụng serverless trong dự án và giới thiệu nó với một vài dự án khác. Alex đã tham gia cùng với bạn của mình Anna và Jeff, với tư cách là một nhà thuyết giáo không có máy chủ thứ ba, đôi khi khó chịu. Và họ sống hạnh phúc mãi mãi về sau.

Phi hành đoàn giảng viên không có thành viên mới

Kịch bản

Nhưng mặc dù ứng dụng của họ đã được thử nghiệm tốt, một cái gì đó đã xảy ra qua đêm.

Sau một cuộc điều tra, họ phát hiện ra rằng một trong những tích hợp đã thay đổi. Họ đã học được rằng thử nghiệm rất quan trọng đối với các ứng dụng không có máy chủ, nhưng nó không đủ.

Vì các ứng dụng không có máy chủ phụ thuộc rất nhiều vào tích hợp, nên rủi ro sẽ chuyển từ mã của bạn sang tích hợp. Và, để có thể nắm bắt các thay đổi tích hợp và phản ứng nhanh, ứng dụng của bạn cần được theo dõi thích hợp.

May mắn thay, ngày càng có nhiều công cụ giám sát không có máy chủ trên thị trường. Một số tùy chọn tốt và phổ biến là IOpipe, Thundra, Dashbird và Epsagon.

Nhưng, các ứng dụng không có máy chủ thường có một máy khách dày, điều đó có nghĩa là giám sát mặt sau là không đủ. Bạn cần một công cụ tương tự cho mặt trước của bạn. Thị trường này cũng có rất nhiều công cụ hay, chẳng hạn như Sentry và Rollbar.

Nhưng theo tinh thần không có máy chủ, chúng tôi đã tạo ra một ứng dụng theo dõi lỗi nguồn mở có tên là Desole. Đây là một ứng dụng không có máy chủ mà bạn có thể cài đặt trong tài khoản AWS của mình. Nó cho phép các tổ chức theo dõi các trường hợp ngoại lệ và lỗi ứng dụng mà không phải lựa chọn giữa sự tiện lợi của phần mềm dưới dạng dịch vụ và tính bảo mật của giải pháp tự lưu trữ. Bạn có thể kiểm tra nó ở đây: https://desole.io.

Desole, theo dõi lỗi nguồn mở, tích hợp chặt chẽ với AWS
Tất cả các hình minh họa được tạo bằng ứng dụng SimpleDiagrams4.

Nếu bạn muốn tìm hiểu thêm về thử nghiệm và xây dựng các ứng dụng không có máy chủ bằng Node.js và AWS, hãy xem ứng dụng Server Serverless của Node.js, cuốn sách tôi đã viết với Aleksandar Simovic cho Manning Publications:

Cuốn sách sẽ dạy cho bạn nhiều hơn về thử nghiệm không có máy chủ, với các ví dụ về mã, nhưng bạn cũng sẽ học cách xây dựng và gỡ lỗi API không có máy chủ trong thế giới thực (với DB và xác thực) bằng Node và Claudia.js. Và bạn sẽ học cách xây dựng các chatbot, cho Facebook Messenger và SMS (sử dụng Twilio) và các kỹ năng của Alexa.