Đối với các thử nghiệm từ đầu đến cuối (E2E) ổn định, chúng tôi cần một môi trường cách ly với bên ngoài nhất có thể.
Các bài kiểm tra không ổn định là các bài kiểm tra không thành công vì những lý do không liên quan đến mã của bạn. Chúng gây khó khăn cho việc sử dụng E2E như một biện pháp kiểm tra đáng tin cậy về tính chính xác của ứng dụng. Trong những trường hợp cực đoan, các bài kiểm tra không ổn định sẽ dạy cho nhóm của bạn bỏ qua kết quả E2E. Điều này có thể giết chết nỗ lực tự động hóa kiểm soát chất lượng (QA).
Cách tiếp cận được trình bày ở đây giải quyết hai nguồn vấn đề tiềm ẩn lớn trong quá trình chạy thử nghiệm của bạn:
Có những nguồn bong tróc khác không bị ảnh hưởng bởi phương pháp này:
Trước khi tôi và nhóm của mình chạy thử nghiệm với một bộ chứa phụ trợ chuyên dụng, chúng tôi đã sử dụng một trong những máy chủ không sản xuất của mình. Cách tiếp cận này phù hợp ở giai đoạn thử nghiệm giải pháp E2E của chúng tôi.
Khi chỉ có một vài bài kiểm tra, chúng tôi không thể sử dụng kết quả bài kiểm tra để đưa ra quyết định.
Tuy nhiên, khi chúng tôi tiếp tục thêm nhiều thử nghiệm hơn và tạo ra thời gian thực hiện lâu hơn, phương pháp này bắt đầu thất bại. Các vấn đề chính như sau:
Một giải pháp cho vấn đề này là dành riêng một máy chủ phụ trợ và cơ sở dữ liệu cho từng công việc kiểm tra. Cách tiếp cận này sẽ rất khó khăn nếu không có Docker.
Bộ chứa Docker là một công cụ hoàn hảo để tạo một môi trường chứa mọi thứ mà một ứng dụng cần để chạy:
Đối với thử nghiệm của mình, bạn có thể chuẩn bị một bộ chứa cơ sở dữ liệu chuyên dụng đi kèm với dữ liệu thử nghiệm có thể dự đoán được. Bằng cách này, bạn sẽ có thể tái tạo chính xác điểm bắt đầu trong mỗi lần thực thi E2E—làm cho các thử nghiệm của bạn ổn định hơn.
Bạn có thể sử dụng các thẻ khác nhau cho hình ảnh Docker của mình để tạo phiên bản cho cơ sở dữ liệu thử nghiệm. Cơ sở dữ liệu thử nghiệm tương tự cũng có thể được sử dụng trong môi trường phát triển. Đối với các thử nghiệm thủ công trong quá trình phát triển, bạn cần các thực thể ví dụ tương tự như đối với các thử nghiệm tự động.
Nếu bạn đã sử dụng Docker để triển khai chương trình phụ trợ của mình, sẽ khá dễ dàng để sử dụng lại cùng một hình ảnh để chạy E2E của bạn. Trong nhóm của tôi, chúng tôi triển khai một chương trình phụ trợ dưới dạng vùng chứa và chúng tôi cung cấp URL cơ sở dữ liệu cũng như thông tin xác thực dưới dạng biến môi trường.
Phiên bản vùng chứa giống hệt nhau có thể được triển khai trong sản xuất hoặc được sử dụng trong tích hợp liên tục (CI) để chạy thử nghiệm—mỗi môi trường cung cấp các giá trị phù hợp để kết nối với DB.
Tùy thuộc vào chiến lược triển khai của bạn, bạn có thể thực hiện một trong các thao tác sau:
Sử dụng các thùng chứa bạn xây dựng như một phần của bản dựng giao diện người dùng.
Nhận các tệp đã biên dịch và đảm bảo rằng chúng có sẵn qua HTTP để kiểm tra.
Trong trường hợp của chúng tôi, chúng tôi sử dụng tùy chọn 2: chúng tôi triển khai ứng dụng dưới dạng tệp tĩnh, vì vậy chúng tôi chỉ tạo một vùng chứa chuyên dụng để phục vụ các tệp đã tạo trong quá trình chạy công việc E2E.
Chúng tôi sử dụng GitLab làm nền tảng để chạy CI của mình. Mỗi công việc trong GitLab được chạy bên trong một thùng chứa có hình ảnh bạn chọn. Bên cạnh vùng chứa chính, bạn có thể xác định các dịch vụ : Các vùng chứa bổ sung chạy cùng với các thử nghiệm của bạn. Cấu hình dễ dàng như:
<job-name>: services: - name: <image> alias: <container-url>
Các tùy chọn có sẵn tương tự như những gì bạn có trong Docker Compose, nhưng chúng bị hạn chế hơn.
Một "điều cần biết" trong cấu hình GitLab là đặt biến FF_NETWORK_PER_BUILD
thành 1 nếu bạn muốn cho phép các dịch vụ truy cập lẫn nhau trong quá trình chạy thử nghiệm.
Tại một số thời điểm, chúng tôi đang chạy song song tất cả các bài kiểm tra trong một công việc. Vào thời điểm đó, cần phải thực thi cách ly mạnh mẽ hơn nữa—mỗi bài kiểm tra đều sử dụng cùng một cơ sở dữ liệu và phụ trợ.
Để khắc phục sự cố này, chúng tôi đã nâng cấp các thử nghiệm của mình để phụ thuộc chủ yếu vào dữ liệu ngẫu nhiên mà chúng tôi đưa vào ngay bên trong phần before
của thử nghiệm. Điều này cho phép các bài kiểm tra chạy mà không bị ảnh hưởng bởi những thay đổi khác xảy ra trong các luồng khác.
Cách tiếp cận này ban đầu có thể hơi phức tạp, nhưng nó có ý nghĩa tùy thuộc vào hoàn cảnh của bạn.
Mặc dù chúng tôi bắt đầu một cơ sở dữ liệu mới cho từng công việc kiểm thử, nhưng chúng tôi vẫn đang cố gắng làm cho các kiểm thử của mình rời khỏi ứng dụng ở trạng thái giống như khi họ tìm thấy nó. Có lẽ đó là một chút gì đó còn sót lại từ thời kỳ chúng tôi chạy thử nghiệm trong môi trường dùng chung.
Nó không còn quan trọng nữa, nhưng nó vẫn có thể giúp ích trong quá trình phát triển thử nghiệm trong các trường hợp sau:
Có những trường hợp khi chuyển dịch vụ sang vùng chứa không phải là một tùy chọn. Ví dụ:
Trong cả hai trường hợp, để tách biệt các lần chạy thử nghiệm, bạn có thể mô phỏng các yêu cầu chuyển đến các dịch vụ đó. Điều này sẽ ngăn các dịch vụ bên ngoài không thể đoán trước ảnh hưởng đến kết quả kiểm tra của bạn. Nhược điểm của phương pháp này là các thử nghiệm của bạn sẽ ngắt kết nối với ngữ cảnh mà ứng dụng của bạn hoạt động.
Với các bản mô phỏng tại chỗ, các bài kiểm tra của bạn sẽ không phát hiện ra các trường hợp khi các thay đổi trong các dịch vụ đó ảnh hưởng đến ứng dụng của bạn.
Nếu bạn muốn tìm hiểu thêm về thử nghiệm hoặc các chủ đề khác liên quan đến lập trình, bạn có thể đăng ký tại đây để nhận thông tin cập nhật khi tôi xuất bản nội dung liên quan.