2013-07-31 57 views
7

Tôi đã viết trình chiếu phương thức cho ứng dụng web trình bày điều hướng cho bộ tài liệu và hiển thị siêu dữ liệu khác nhau cho các tài liệu đó.Giới hạn các bước dưa chuột hoặc các bước tệp đến tính năng hoặc thẻ được chỉ định

Đây là một thành phần lớn của ứng dụng với các yêu cầu bí truyền, vì vậy tôi nghĩ rằng nó đủ công bằng mà các kịch bản cốt lõi của nó (được cho là tiêu chí chấp nhận) phải vừa đủ vừa nội bộ.

Để tránh việc có một bước tiến mới cho mỗi người trong số nhiều kịch bản của chúng tôi, tôi đã thích nghi a helper mà dịch cụm từ con người có thể đọc được như document caption vào selectors:

module SelectorsHelper 
    def selector_for(term) 
    case term 
    # Lightbox/modal/fancybox 
    when 'lightbox' 
     '#fancybox-inner' 
    when 'close button' 
     '.document-viewer__tools__close' 

... cùng với một vài định nghĩa bước chung như như sau:

# Generic click action 
When(/^I click (?:on)?(?:the |a)'(.*?)'?$/) do |element| 
    find(selector_for(element)).click 
end 

vấn đề, cho dù tôi đang hành động theo khái niệm rất chung chung như với các khái niệm trừu tượng trên hoặc cụ thể hơn liên quan đến mẫu mà tái diễn trong một bộ các tính năng, là những thể tàn phá w Các tính năng bí truyền khác, có thể có nhiều bước cụ thể hơn để phân tích chúng. Mỗi ví dụ Cucumber mà tôi đã thấy có các tệp định nghĩa bước có tên tệp mang một mối quan hệ thủ tục với một tệp tính năng cụ thể và giả định rằng trong các trường hợp này, tệp định nghĩa bước đó sẽ chỉ được gọi để phân tích các kịch bản trong tính năng liên quan của nó:

+ features 
| + step_definitions 
| | + global_steps.rb 
| | + modal_steps.rb 
| | + login_steps.rb 
| + modal.feature 
| + login.feature 

Nhưng đó không phải là trường hợp - và tôi đang đấu tranh để từ chức bản thân mình để quan điểm cho rằng dưa chuột cố gắng áp dụng mỗi bước mô hình định nghĩa để mỗi kịch bản. Nếu những thử nghiệm này sẽ có bất kỳ công đức nào, chúng sẽ phát triển nhiều hơn, giới thiệu các khái niệm mới và giữ liên quan mà không cần phải viết lại liên tục. Tôi muốn có thể giới hạn phạm vi các bước của tôi để ngăn chặn chúng can thiệp vào các tính năng mà chúng không được viết, nhưng không biết làm thế nào. Các giải pháp về khái niệm sau đây tôi suy nghĩ:

  • Sử dụng nền hoặc kịch bản @tags và gọi bước chỉ cho các kịch bản với những thẻ
  • định nghĩa bước
  • Nest trong một số loại gói helper hoặc meta bước nét đó là gọi bởi một nền độc quyền được cung cấp

Tôi không quen với Ruby và Cucumber có vẻ rất mỏng, vì vậy tôi bị ám ảnh bởi tiềm năng không giới hạn trên một mặt và không được triển khai trước. Bất kỳ ý tưởng?

Trả lời

4

Theo kinh nghiệm của tôi, các bước quá chung chung dẫn đến cơ sở mã tự động hóa rất khó duy trì. Hãy thử đi cho một sự cân bằng ở đây nếu có thể, chỉ có bạn mới có thể đánh giá sự cân bằng này nằm ở đâu. Bạn không muốn quá nhiều bước lặp đi lặp lại defintions nhưng bạn không muốn một cơn ác mộng siêu chung để gỡ lỗi.

Có thể sử dụng giải pháp để truy cập danh sách thẻ nhưng vui lòng không làm điều này. Đó là tổng, kỳ lạ và không dưa chuột được dự định sẽ được sử dụng như thế nào.

Là một workaround trong step_definitions của bạn, bạn có thể sử dụng một bước xung quanh để có được một danh sách các tên thẻ từ kịch bản -

Around do |scenario, block| 
    begin 
    @tag_names = scenario.tags.collect { |tag| tag.name } 
    block.call 
    ensure 
    $tags = nil 
    end 
end 

Sau đó, trong việc kiểm tra cơ thể step_definition nếu thẻ bạn muốn phát hiện được bao gồm trong danh sách -

Given(/^I am testing a step with a "([^"]*)"$/) do |arg| 
    if @tag_names.include?('@a_tag') 
    puts 'Executing a step definition with tag - @a_tag' 
    else 
    puts 'Executing a step definition without tag - @a_tag' 
    end 
end 

tính năng này -

Feature: Example feature 

    @a_tag 
    Scenario: Example scenario #1 
    Given I am testing a step with a "value" 

    Scenario: Example scenario #1 
    Given I am testing a step with a "value" 

Kết quả trong t đầu ra của anh ấy -

Feature: Example feature 

    @a_tag 
    Scenario: Example scenario #1    # features/example.feature:4 
    Given I am testing a step with a "value" # features/step_definitions/step_definitions.rb:10 
     Executing a step definition with tag - @a_tag 

    Scenario: Example scenario #1    # features/example.feature:7 
    Given I am testing a step with a "value" # features/step_definitions/step_definitions.rb:10 
     Executing a step definition without tag - @a_tag 

2 scenarios (2 passed) 
2 steps (2 passed) 
0m0.004s 

Một lần nữa tôi nghĩ rằng việc sử dụng đây là một ý tưởng cực kỳ tồi tệ. Nó là tốt hơn để có các định nghĩa bước lặp đi lặp lại hơi dễ dàng để làm theo và gỡ lỗi sau đó để có một định nghĩa bước siêu chung duy nhất để cai trị tất cả!

Chỉnh sửa - Sau khi đọc lại câu hỏi và bài đăng trên blog của bạn, tôi không nghĩ điều này thực sự trả lời câu hỏi của bạn. Tuy nhiên, tôi khá chắc chắn rằng bạn đang cố gắng làm điều gì đó không phải là dưa chuột

+0

Tôi nghĩ rằng câu hỏi của tôi đang tìm kiếm một giải pháp quá cụ thể cho một tình huống khó khăn chung chung. Đây là một câu hỏi hay mà tôi có thể hy vọng. Lời khuyên của bạn - _không dưa chuột được dự định sử dụng như thế nào - tạo ra rất nhiều ý nghĩa. Nếu tôi quay trở lại sử dụng dưa chuột, tôi sẽ làm theo lời khuyên đó! – Barney