শসাবার পদক্ষেপগুলি পুনরায় ব্যবহার করুন


103

আমি কিছু শসাবার পদক্ষেপ পুনরায় ব্যবহার করতে চাই তবে সঠিক উপায়টি খুঁজে পাচ্ছে না।

আমি একটি পদক্ষেপ লিখতে চাই:

Given /^I login with (.*) credentials$/ |type|
  # do stuff with type being one of "invalid" or "valid"
end

তবে এর পরে আর একটি পদক্ষেপ নিন:

Given /^I login successfully$
  # call "Given I login with valid credentials"
end

সুতরাং ব্যবহারকারীর প্রমাণীকরণের পরীক্ষায় আমি আগেরটি ব্যবহার করতে পারি, তবে বেশিরভাগ অন্যান্য জায়গাগুলিতে আমি পরে ব্যবহার করতে পারি, এবং আসলে কোডটি তিরস্কার করতে হয় না।

এই পদক্ষেপটি কল করার কি কোনও উপায় আছে, বা আমি কেবল কোনও সহায়ক পদ্ধতিতে যুক্তি রেখেছি এবং প্রতিটি কাজ থেকে পদ্ধতিটি কল করেছি (মূলত একটি পদ্ধতি আহরণের রিফ্যাক্টরিং, যা আমার প্রশ্নটি পড়ার পরে আমাকে বিশ্বাস করে যে এটি আসলে সবচেয়ে ভাল উপায়) যাহাই হউক না কেন)?


1
যদি কেউ বিভ্রান্ত হয় তবে এখানকার প্রত্যেকে রুবি ধাপ সংজ্ঞায় ব্লকটি doশুরু করার জন্য প্রয়োজনীয় জিনিসটি রেখে চলেছে do...end। এটি আসলে প্রয়োজন।
শান লেবারন

উত্তর:


102

আপডেট : নীচে বর্ণিত পদ্ধতিটি অবচয় করা হয়েছে। অন্য পদক্ষেপের মধ্যে থেকে একটি পদক্ষেপ কল করার প্রস্তাবিত উপায়টি এখন এর মতো দেখায়:

Given /^I login successfully$/
    step "I login with valid credentials" 
end 

পুরানো, অবহেলিত পদ্ধতি (রেফারেন্সের জন্য):

আপনি অন্যান্য পদক্ষেপের মতো পদক্ষেপগুলি কল করতে পারেন:

Given /^I login successfully$/
  Given "I login with valid credentials"
  Then "I should be logged in"
end

যদি কোনও বৈশিষ্ট্যের মধ্যে সমস্ত দৃশ্যের প্রয়োজন হয় (বা অন্যান্য পদক্ষেপ), আপনি প্রতিটি বৈশিষ্ট্যগুলিতে একটি ব্যাকগ্রাউন্ড যুক্ত করতে পারেন, সাধারণ পদক্ষেপগুলি সহ, এর মতো:

Background:
  Given I log in with valid credentials

Scenario: Change my password
  Given I am on the account page

5
এমনকি সহজভাবে steps %Q{Given I am logged in}
ঘেরকিন কোডটি পাস্ট করা

1
@ ব্রেন্ডনডিয়ান যখন এই উত্তরটি গৃহীত হয়েছিল, তখন stepsপদ্ধতিটির অস্তিত্ব ছিল না। আমার উত্তর নীচে দেখুন।
michaeltwofish

দয়া করে নোট করুন যে সংযুক্তি পদক্ষেপগুলি এখন একটি অ্যান্টি-প্যাটার্ন হিসাবে বিবেচিত এবং এড়ানো উচিত। শসা উইকি দেখুন - cucumber.io/docs/guides/anti-
Patterns/…

103

নোট করুন যে ধাপের মধ্যে পদক্ষেপের কল করার পদ্ধতিটি শশার সাম্প্রতিক সংস্করণগুলিতে পরিবর্তিত হয়েছে, যা আপনি দেখতে পাবেন "সতর্কতা: পদক্ষেপ সংজ্ঞায় 'দেওয়া / যখন / তারপরে' এর মতো কোনও ত্রুটি পেয়েছে, এতে 'পদক্ষেপ' ব্যবহার করুন পরিবর্তে অন্যান্য পদক্ষেপগুলি কল করুন: /path/to/step_definitions/foo_steps.rb: 631: `block in '" এ। বিশদ জন্য শশা উইকি দেখুন ।

পরিবর্তনের সংক্ষিপ্তসারটি হ'ল আপনার এখন stepবা stepsপদ্ধতিগুলি ব্যবহার করা উচিত ।

When /^I make all my stuff shiny$/
  step "I polish my first thing"
end

When /^I make all my stuff shiny$/
  steps %Q{
    When I polish my first thing
    When I shine my second thing
  }
end

18
এটি যে মূল্যবান তা জন্য, শসাবার সাথে আরও সময় কাটিয়ে যাওয়ার পরে, আমি ধাপের মধ্যে পদক্ষেপগুলি ব্যবহার না করার পরামর্শ দিই। সমস্যাগুলি ট্র্যাক করা শক্ত এবং এটি আসলে রক্ষণাবেক্ষণকে আরও শক্ত করে তোলে। পরিবর্তে, সহায়ক পদ্ধতি ব্যবহার করুন।
michaeltwofish

2
হতে পারে, আপনার মন্তব্যটি আপনার উত্তরের সাথে অন্তর্ভুক্ত করা উচিত কারণ এটি খুব উজ্জীবিত এবং এখনও ভোট পেয়েছে। এটি লোকেরা এই তথ্যটি লক্ষ্য করতে সহায়তা করবে
আন্দ্রেই বোতালভ

হাই @ মিমহেল্টওফিশ, 2017 এ কি এর কোনও পরিবর্তন আছে? আমি পেয়ে করছি syntax error, unexpected tIDENTIFIER, expecting keyword_end stackoverflow.com/questions/43319331/...
ericn

43

পদক্ষেপ সংজ্ঞা থেকে পদক্ষেপগুলি কল করা একটি খারাপ অভ্যাস এবং এর কিছু অসুবিধা রয়েছে :

  1. যদি পরিস্থিতি ব্যর্থ হয় এবং নেস্টেড পদক্ষেপের অনুরোধগুলি থাকে, আপনি স্ট্যাক ট্রেসের মধ্যে কেবলমাত্র শেষ অনুরোধিত পদক্ষেপ সংজ্ঞাটি পাবেন। সর্বশেষ পদক্ষেপের জন্য কোন জায়গাটি বলা হয়েছিল সেই জায়গা থেকে খুঁজে পাওয়া শক্ত হতে পারে
  2. রুবি পদ্ধতির চেয়ে মাঝে মাঝে স্টেপডিফ-তে কল সন্ধান করা এবং পড়া আরও শক্ত is
  3. রুবি পদ্ধতিগুলি আপনাকে স্টেপ ডিএফ থেকে পদক্ষেপগুলি কল করার চেয়ে বেশি শক্তি দেয়

আসলাক হেলসেই পুনরায় ব্যবহারের পদক্ষেপগুলির পরিবর্তে বিশ্বে জনপ্রিয় ক্রিয়াগুলি সরিয়ে নেওয়ার পরামর্শ দেয় । এটি সেই ক্রিয়াগুলি এক জায়গায় পৃথক করে, এই কোডটি সন্ধান করা সহজ করে তোলে। আপনি সাধারণ রুবি ক্লাস বা মডিউলগুলিতেও কোড এক্সট্রাক্ট করতে পারেন।

#/support/world_extensions.rb
module KnowsUser
  def login
    visit('/login')
    fill_in('User name', with: user.name)
    fill_in('Password', with: user.password)
    click_button('Log in')
  end

  def user
    @user ||= User.create!(:name => 'Aslak', :password => 'xyz')
  end
end
World(KnowsUser)

#/step_definitions/authentication_steps.rb
When /^I login$/ do
  login
end

Given /^a logged in user$/ do
  login
end

শসাবার মেইলিং লিস্টে - লিঙ্কে এই বিষয়টিতে একটি দরকারী আলোচনা রয়েছে


2
আমি বিশ্বাস করি যে উপরে বর্ণিত একই কারণে কলিং স্টেপ বা পদক্ষেপের চেয়ে এই পদ্ধতিরটি অনেক ভাল।
পিসারুক

2
এটির আরও একটি সুবিধা রয়েছে। আইডিয়া (বা রুবাইমাইন) ব্যবহার করে আপনি সহজেই ফাংশন-সংজ্ঞাতে লাফিয়ে উঠতে পারেন, তবে% {... steps পদক্ষেপের পদক্ষেপগুলিতে নয়}
স্লিপসেট

এছাড়াও এই সেটআপটি DRY নীতি অনুসরণ করে
সোরেরিয়ার 86

2
যদিও পদক্ষেপগুলি পুনরায় ব্যবহার করার সমস্যাটি আমি আঘাত করেছি তবে আমি মনে করি এটি কেবল খারাপ। লগইন হ'ল বিভিন্ন পদক্ষেপের যোগফল: "কিছু ভিজিট করুন", "কিছু পূরণ করুন"। প্রাকৃতিক উপায় হ'ল প্রতিটি পদক্ষেপকে একটি ফাংশনে কল হিসাবে রূপান্তরিত করার পরিবর্তে পুনরায় ব্যবহারের পদক্ষেপ। আইএমও, পদক্ষেপের অভ্যন্তরে কলিং পদক্ষেপগুলি কেবল উন্নত করা উচিত।
dgmora

9

উদ্ধৃতিগুলির চেয়ে আপনার পদক্ষেপগুলি% {Best এ সবচেয়ে ভালভাবে মোড়ানো। তারপরে, আপনার ডাবল উদ্ধৃতিগুলি পালাতে হবে না যা আপনাকে ঘন ঘন ব্যবহার করতে হবে .:

Given /^I login successfully$
  step %{I login with valid credentials}
end

Given /^I login with (.*) credentials$/ |type|
  # do stuff with type being one of "invalid" or "valid"
end

5
এটি একটি উত্তর পরিবর্তে একটি মন্তব্য করা উচিত ছিল।
কেলভিন

1

বৈশিষ্ট্য ফাইলে কীওয়ার্ডগুলি পুনরায় ব্যবহার করুন যা কোড পুনরায় ব্যবহারযোগ্যতা সরবরাহ করবে।

স্টেপ ডিফস-এর মধ্যে স্টেপ ডিফসকে কল করার জন্য এটি অত্যন্ত প্রস্তাবিত নয়।

আমি আমার ফিচার ফাইলটি এভাবে লিখব,

Scenario Outline: To check login functionality
    Given I login with "<username>" and "<password>"
    Then I "<may or may not>" login successfully

Examples:
    |username|password|may or may not|
    |paul    |123$    |may           |
    |dave    |1111    |may not       |

আমার পদক্ষেপ সংজ্ঞায়, (এটি জাভা)

@Given(I login with \"([^\"]*)\" and \"([^\"]*)\"$)
public void I_login_with_and(String username, String password){

   //login with username and password

}

@Then(I \"([^\"]*)\" login successfully$)
public void I_login_successully_if(String validity){

    if(validity.equals("may")){
        //assert for valid login
    }
    else
    if(validity.equals("may not")){
        //assert for invalid login
    }
}

এইভাবে, প্রচুর কোড পুনর্ব্যবহারযোগ্যতা রয়েছে। আপনার একই দেওয়া এবং তারপরে বৈধ ও অবৈধ উভয় পরিস্থিতিতেই পরিচালনা করে। একই সময়ে, আপনার বৈশিষ্ট্য ফাইলটি পাঠকদের জন্য অর্থবোধ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.