5

Tôi biết cách để chạy thử nghiệm chức năng/tích hợp trong Rails, câu hỏi này là về các phương pháp hay nhất. Hãy nói rằng cho phép được thực hiện sử dụng bốn vai trò người dùng riêng biệt:Kiểm tra chức năng ủy quyền trong Rails

  • cơ bản
  • biên tập
  • quản trị
  • siêu

Điều này có nghĩa rằng đối với mỗi hành động có đến năm hành vi khác nhau có thể (4 vai trò + không được xác thực/ẩn danh). Một cách tiếp cận tôi đã thực hiện là để kiểm tra tất cả các vai trò trên mọi hành động, ví dụ:

  • test_edit_by_anonymous_user
  • test_edit_by_basic_user
  • test_edit_by_editor_user
  • test_edit_by_admin_user
  • test_edit_by_super_user

Nhưng điều này rõ ràng dẫn đến số kiểm tra (mọi hành động điều khiển trên trang web thực sự cần được kiểm tra năm lần). Cách tiếp cận ngược lại sẽ là kiểm tra cơ chế ủy quyền một cách riêng biệt và sau đó xác thực là siêu trước khi thử nghiệm mọi hành động (khi thiết lập) và chỉ kiểm tra một phiên bản của mỗi trang.

Tôi đã thử một số cách tiếp cận với mức độ khác nhau về độ đặc hiệu nhưng chưa hoàn toàn hài lòng với bất kỳ điều gì. Tôi cảm thấy thoải mái hơn khi tôi thử nghiệm nhiều trường hợp hơn, nhưng số lượng mã thử nghiệm và độ khó của sự trừu tượng hóa đã trở thành một lượt tắt. Có ai có cách tiếp cận vấn đề này mà họ hài lòng không?

Trả lời

4

Nó thực sự phụ thuộc vào cách bạn đã thiết lập mã của bạn để kiểm tra ủy quyền và cách bạn kiểm tra nó trong hành động. Tôi có thể cho bạn biết những gì chúng tôi làm như một ví dụ. Chúng tôi có các vai trò như bạn và một số trang yêu cầu đăng nhập, một số yêu cầu vai trò và một số có các đầu ra khác nhau dựa trên vai trò. Chúng tôi kiểm tra từng loại khác nhau một chút.

Trước tiên, chúng tôi kiểm tra ủy quyền và đăng nhập riêng.

Ngoài ra, chúng tôi đã tạo bộ lọc cho các hành động yêu cầu người dùng đã đăng nhập và sau đó là những người khác yêu cầu vai trò nhất định. Ví dụ: check_admin, check_account_owner, v.v. Sau đó chúng tôi có thể kiểm tra xem các bộ lọc đó có hoạt động không.

Chúng tôi sau đó thêm kiểm tra trong các kiểm tra bộ điều khiển mà các bộ lọc chính xác đang được gọi. Chúng tôi sử dụng shoulda và viết một số phần mở rộng dễ dàng vì vậy chúng tôi có thể thêm kiểm tra như:

should_filter_before_with :check_admin, :new 

Bằng cách đó, chúng tôi đang thử nghiệm những gì cần phải được kiểm tra và không còn nữa.

Bây giờ, đối với các hành động phức tạp hơn làm logic khác nhau tùy thuộc vào vai trò, chúng tôi kiểm tra những hành động đó cho từng vai trò chứa logic đặc biệt. Chúng tôi không viết các bài kiểm tra cho các vai trò trên hành động đó sẽ được lọc hoặc là các vai trò của các vai trò khác. Ví dụ: nếu tác vụ thêm nhiều trường vào biểu mẫu nếu bạn là quản trị viên, chúng tôi sẽ kiểm tra không phải quản trị viên và quản trị viên. Chúng tôi không kiểm tra quản trị viên và quản trị viên cấp cao vì mã kiểm tra vai trò của chúng tôi hiểu rằng quản trị viên cấp cao là quản trị viên.Ngoài ra, đối với các mẫu có chứa logic chỉ hiển thị các mục nhất định cho một số vai trò nhất định, chúng tôi cố gắng chuyển mã đó vào người trợ giúp hoặc nếu phổ biến như thanh công cụ quản trị, thành partials. Sau đó, chúng ta có thể tự mình thử nghiệm và không phải trên mọi hành động bao gồm chúng.

Để tổng hợp, chỉ kiểm tra những gì bạn cần cho một hành động cụ thể. Cũng giống như bạn sẽ không kiểm tra nội bộ Rails trong bài kiểm tra Unit của bạn, nếu bạn viết mã chung cho vai trò của bạn kiểm tra và kiểm tra đó, bạn không cần phải kiểm tra lại nó trên mọi hành động.

2

Trong một số trường hợp, bạn có thể được yêu cầu kiểm tra TẤT CẢ các vai trò và cấp phép có thể đối với các hành động khác nhau - ví dụ: khi làm việc cho ngân hàng :) Trong trường hợp này, cần có cách tiếp cận năng động hơn để thử nghiệm. Thay vì xác định từng trường hợp thử nghiệm, bạn sẽ tạo tất cả các kết hợp.

Một vài năm trước, Ryan Davis đã trình bày về "ma trận thử nghiệm chức năng" là một phần của ZenTest. Dr. Nic did a writeup, và ở cuối bài đăng, bạn sẽ tìm thấy các liên kết được cập nhật trong các nhận xét. Giải pháp này được thiết kế cho chính xác vấn đề bạn mô tả. Bạn cũng có thể cuộn giải pháp của riêng bạn, bằng cách chạy thử nghiệm bên trong vòng lặp lồng nhau, ví dụ - ý tưởng về cơ bản giống nhau.

+0

Cảm ơn! Video và các bài viết của Ryan rất hữu ích. Tôi rất vui khi được biết có người nói về vấn đề này. –

+0

Nếu có ai khác gặp sự cố khi truy cập video: [Video ở trên youtube tại đây] (http://www.youtube.com/watch?v=KUjnAztX9yk) –

0

Hãy xem xét một ứng dụng mà được có 2 vai trò quản trị và chỉ đọc Thực hiện dưới đây kiểm tra:

  1. đăng nhập với chế độ chỉ đọc thực hiện một số hành động và đăng xuất. Bây giờ từ cùng một hệ thống và đăng nhập cùng một trình duyệt với vai trò quản trị và xem hành vi của hệ thống. Và ngược lại.
  2. đăng nhập bằng vai trò quản trị và sao chép giá trị cookie và đăng xuất. Bây giờ đăng nhập với vai trò bình thường và chỉnh sửa giá trị cookie bằng cách sử dụng công cụ cookimanager + hoặc editthiscookie. Và nếu ứng dụng đang hoạt động như mong đợi thì đó là một vấn đề. Lặp lại trường hợp thử nghiệm trên 2 từ cùng một trình duyệt, cùng một trình duyệt khác nhau, từ máy khác nhau
  3. nếu ứng dụng khách dày thì thực hiện kỹ thuật đảo ngược và phân tích mã. Cố gắng thay đổi logic của quản lý ủy quyền (ai đó cần phải có kinh nghiệm mã hóa cho việc này) biên dịch lại mã và lặp lại kiểm tra 2-3.
  4. sử dụng công cụ gián đoạn proxy như burp suite phân tích nhận/đăng yêu cầu cho cả hai vai trò.

Giờ đây, dựa trên loại vai trò có sẵn cho ứng dụng của bạn, hãy quyết định các trường hợp kiểm tra.

Các vấn đề liên quan