2013-05-24 3 views
18

आरईएसटी एपीआई परीक्षण के लिए ककड़ी सुविधा चरणों को लिखने की कोशिश कर रहा है।आरईएसटी एपीआई परीक्षण ककड़ी कदम सर्वोत्तम अभ्यास

मैं जो दृष्टिकोण है यकीन नहीं है बेहतर:

Given I log in with username and password 
When I add one "tv" into my cart 
And I check my cart 
Then I should see the item "tv" is in my cart 

या

Given the client authenticate with username and password 
When the client send POST to "/cart/add" with body "{item: body}"  
Then the response code should be "200" 
And the response body should expect "{success: true}" 
When the client send GET to "/cart"  
Then the response code should be "200" 
And the response body should expect "{"items": ["tv"]}" 

वहाँ किसी भी सम्मेलन है, जब लोग बाकी एपीआई के लिए ककड़ी चरणों लिखने की कोशिश कर पालन करने के लिए है?

उत्तर

4

ककड़ी के मूल उद्देश्यों में से एक, जो इसके डिजाइन में योगदान देता है, तकनीकी कार्यान्वयन और व्यापार की जरूरतों को जानने वाले लोगों के बीच के अंतर को पुल करना है, ताकि परीक्षण विवरण गैर-डेवलपर्स द्वारा लिखे और/या समझा जा सके। इस प्रकार, यह विस्तृत तकनीकी चश्मा, या झटका-दर-उड़ा इकाई परीक्षण के लिए एक महान फिट नहीं है।

तो यह मुझे आपके पहले टेस्ट विवरण में इंगित करेगा, अगर यह कारण है कि आप ककड़ी का उपयोग कर रहे हैं।

दूसरे संस्करण की तरह परीक्षण लागू करने में कोई बड़ी समस्या नहीं है, ककड़ी इसका समर्थन कर सकती है। संभवतः बड़ी संख्या में कथन प्रकार नहीं हैं जिन्हें आपको या तो पार्स करने की आवश्यकता होगी। लेकिन आप पहले से ही ककड़ी का उपयोग करने के लिए परीक्षण ढांचे को थोड़ा सा लड़ सकते हैं, या अपने तर्क के खिलाफ जा सकते हैं।

एक सम्मेलन के लिए, मुझे टिप्पणी करने के लिए अभ्यास में पर्याप्त आरईएसटी एपीआई परीक्षणों से अवगत नहीं है, और मैंने जो भी देखा है, मैंने ककड़ी के रूप में ककड़ी का उपयोग नहीं किया है।

अद्यतन: विषय पर एसओ के आसपास ब्राउज़िंग, मुझे यह एक लिंक मिला: https://github.com/jayzes/cucumber-api-steps जो आपके दूसरे प्रारूप के समान है।

7

यहाँ एक क्या व्यावहारिक प्रोग्रामर "ककड़ी पुस्तक" Cuke के माध्यम से बाकी एपीआई परीक्षण के बारे में कहना है कि करने के लिए (बंद करने के लिए पर्याप्त) है उदाहरण के लिए, और इसे और अधिक बारीकी अपने दूसरे उदाहरण से संबंधित लगता है:

Feature: Addresses 
    In order to complete the information on the place 
    I need an address 

Scenario: Addresses 
    Given the system knows about the following addresses: 
    [INSERT TABLE HERE or GRAB FROM DATABASE] 
    When client requests GET /addresses 
    Then the response should be JSON: 
    """ 
    [ 
    {"venue": "foo", "address": "bar"}, 
    { more stuff } 
    ] 
    """ 
STEP DEFINITION: 

Given(/^the system knows about the following addresses:$/) do |addresses| 
# table is a Cucumber::Ast::Table 
    File.open('addresses.json', 'w') do |io| 
    io.write(addresses.hashes.to_json) 
    end 
end  

When(/^client requests GET (.*)$/) do |path| 
    @last_response = HTTParty.get('local host url goes here' + path) 
end 

Then /^the response should be JSON:$/ do |json| 
    JSON.parse(@last_response.body).should == JSON.parse(json) 
end 
ENV File: 

require File.join(File.dirname(__FILE__), '..', '..', 'address_app') 
require 'rack/test' 
require 'json' 
require 'sinatra' 
require 'cucumber' 
require 'httparty' 
require 'childprocess' 
require 'timeout' 

server = ChildProcess.build("rackup", "--port", "9000") 
server.start 
Timeout.timeout(3) do 
    loop do 
    begin 
     HTTParty.get('local host here') 
     break 
    rescue Errno::ECONNREFUSED => try_again 
     sleep 0.1 
    end 
    end 
end 

at_exit do 
    server.stop 
end 
+3

हालांकि मैं सामान्य विचार के लिए इसे ऊपर उठा रहा हूं, मुझे लगता है कि ट्रिपल-उद्धृत JSON (या रूबी, या इसी तरह) आमतौर पर ककड़ी के चरणों के लिए बहुत कम स्तर है। मैं जल्द ही चाबियों और मूल्यों की एक तालिका का उपयोग करता हूं, हालांकि निश्चित रूप से नेस्टेड डेटा को बहुत अच्छी तरह से संभालने का नकारात्मक हिस्सा नहीं है। –

+0

आप पूरी तरह से सही हैं ... मैं एक टेबल पर स्विचिंग कर रहा हूं और प्रत्येक टेबल पंक्ति के लिए FactoryGirl.create को कॉल कर रहा हूं ... इसे जांचें: whitneytaylorimura.wordpress.com –

5

मैं मैं अपने वर्तमान प्रोजेक्ट में rails-api का उपयोग करके बनाए गए एपीआई को दस्तावेज करने के लिए परीक्षण और अधिक महत्वपूर्ण रूप से ककड़ी का उपयोग कर रहा हूं। मैंने कुछ औजारों का उपयोग करने के लिए चारों ओर देखा और मैं cucumber-api-steps और json_spec के संयोजन का उपयोग करके समाप्त हुआ। यह मेरे लिए अच्छा काम किया।

ककड़ी के चरणों को कैसे लिखना है इस पर कोई सम्मेलन नहीं है। जिस तरह से आप अपना कदम लिखते हैं इस पर निर्भर करता है कि आप अपने ककड़ी सूट का उपयोग कैसे करना चाहते हैं। मैंने एपीआई क्लाइंट को लागू करने के लिए हमारे कोणीय जेएस क्लाइंट devs के संदर्भ के रूप में ककड़ी उत्पादन का उपयोग किया। तो मेरे ककड़ी चरणों में प्रत्येक परिदृश्य के लिए स्थिति कोड के साथ वास्तविक JSON अनुरोध और प्रतिक्रियाएं शामिल थीं। जब भी कुछ बदल जाता है तो इसने क्लाइंट साइड टीम के साथ संवाद करना वास्तव में आसान बना दिया (विशेष रूप से जब क्लाइंट साइड टीम मेरे कार्यस्थल पर शारीरिक रूप से मौजूद नहीं थी)।

हर बार जब मैं एक एपीआई बना या अपडेट करता हूं, तो सीआई सर्वर निर्माण के हिस्से के रूप में ककड़ी चलाएगा और HTML स्वरूपित आउटपुट को "build_artifacts" स्थान पर ले जाया जाएगा जिसे ब्राउज़र में खोला जा सकता है। क्लाइंट साइड देव हमेशा इस तरह का सबसे हालिया संदर्भ प्राप्त करेंगे।

मैंने इसे सब blog post about creating a tested, documented and versioned JSON API में लिखा है, उम्मीद है कि यह आपको किसी भी तरह से मदद करता है।

12

मैं सिर्फ यह उपयोगी लेख पर ठोकर खाई: http://gregbee.ch/blog/effective-api-testing-with-cucumber

संक्षेप में प्रस्तुत करने के लिए ...

Scenario: List fruit 
    Given the system knows about the following fruit: 
    | name  | color | 
    | banana  | yellow | 
    | strawberry | red | 
    When the client requests a list of fruit 
    Then the response is a list containing 2 fruits 
    And one fruit has the following attributes: 
    | attribute | type | value | 
    | name  | String | banana | 
    | color  | String | yellow | 
    And one fruit has the following attributes: 
    | attribute | type | value  | 
    | name  | String | strawberry | 
    | color  | String | red  | 

JSON के खिलाफ एक परिणाम मान्य कर रहा है मुश्किल काम है क्योंकि अगर परिणाम एक सरणी है, तत्व है कि कैसे आप परीक्षा में मान्य कर रहे हैं के रूप में एक ही क्रम नहीं हो सकता।

+1

निश्चित रूप से सहमत है कि यह विधि बेहतर है। – iamyojimbo

+0

यदि हितधारक तकनीकी नहीं है और आपको विशेष रूप से एक आरईएसटी एपीआई लिखने के लिए किराए पर नहीं लिया गया है, तो आपको मेरी राय में ककड़ी के साथ अपने एपीआई "परीक्षण" नहीं करना चाहिए। अन्यथा, यह सबसे अच्छा जवाब है। –

+0

यदि हितधारक तकनीकी नहीं है और आपको विशेष रूप से एक आरईएसटी एपीआई लिखने के लिए किराए पर नहीं लिया गया है, तो आपको मेरी राय में ककड़ी के साथ अपने एपीआई "परीक्षण" नहीं करना चाहिए। अन्यथा, यह सबसे अच्छा जवाब है। –

0

मुझे लगता है कि पहला व्यक्ति बेहतर है। मैं तकनीकी को रूबी कक्षाओं और मॉड्यूल में डाल दूंगा। उदाहरण के लिए मॉड्यूल cart.add (आइटम) की तरह जब कदम में और में तो डाल कदम की उम्मीद (cart.item) करें.अभियान शामिल ('आइटम' => (आइटम) a_string_matching)

इस करके, रूबी कक्षाओं और मॉड्यूल को अन्य सुविधाओं के चरणों में पुन: उपयोग किया जा सकता है। उदा। शायद आपके पास एक और परिदृश्य है जो कार्ट में कई आइटम जोड़ देगा और फिर कुल राशि को मान्य करेगा।

हालांकि, दूसरा 1 मुझे लगता है कि यह तकनीकी सुविधाओं की तरह बना सकता है। उदा। सभी एपीआई में सामान्य/वैश्विक हेडर या बॉडी अनुरोध की अपेक्षा की जाती है।

0

यहां देखें: https://github.com/ctco/cukes-rest। यह रीस्टफुल एपीआई का परीक्षण करने के लिए एक ककड़ी डीएसएल प्रदान करता है।

0

रूबी में ककड़ी के साथ सर्वर पक्ष आरईएसटी परीक्षण के लिए अब कुछ पुस्तकालय हैं। यहां एक जोड़ा गया है:

पुस्तकालय मैं सर्वर पक्ष के लिए उपयोग कर रहा हूं ककड़ी के साथ आरईएसटी परीक्षण Cucumber-API-Steps है।

Cucumber-API-Steps

यहां बताया गया है मैं अपने परीक्षण का उपयोग कर लिखते हैं 'ककड़ी-api-कदम' (अनुशंसित):

@success 
Scenario: Successfully add to cart 
    Given I am logged in 
    When I send a POST request to “/cart/add” with the following: 
     | item | body | 
    Then the response status should be “200” 
    And the JSON response should have "success" with the text "true" 
    When I send a GET request to “/cart” 
    Then the response status should be “200” 
    And the JSON response should be "{'items': ['tv']}" 

और यहाँ क्या मेरी परीक्षण का उपयोग कर की तरह लग रही है 'ककड़ी-एपीआई-कदम':

@success 
Scenario: Successfully log in 
    Given I am logged out 
    When I send a POST request to “/login” with: 
     | username | [email protected] | 
     | password | mypassword | 
    Then the response status should be “200” 
    And the JSON response should have "firstName" with the text "Katie" 

Cucumber-API

यहां बताया गया है मैं अपने परीक्षण 'ककड़ी-api' का उपयोग कर लिखना चाहते हैं:

@success 
Scenario: Successfully add to cart 
    Given I am logged in 
    When I send a POST request to “/cart/add” 
     And I set JSON request body to '{item: body}' 
    Then the response status should be “200” 
    And the response should have key “success” with value “true” 
    When I send a GET request to “/cart” 
    Then the response status should be “200” 
    And the response should follow "{'items': ['tv']}" 

और यहाँ क्या मेरी परीक्षण 'ककड़ी-api' का उपयोग कर की तरह लग रही है :

@success 
Scenario: Successfully log in 
    Given I am logged out 
    When I send a POST request to “/login” with: 
     | username | [email protected] | 
     | password | mypassword | 
    Then the response status should be “200” 
    And the response should have key “firstName” 
  • ककड़ी-एपीआई के बारे में नोट: वर्तमान में should have key “firstName” with value “Katie” करने का कोई तरीका नहीं है। "मूल्य के साथ" भाग अभी तक नहीं किया गया है।
  • इसके अलावा "फोलो" एक JSON फ़ाइल

एक और संसाधन here है उम्मीद है, लेकिन यह पुराना है (2011)।

0

मैं आपके पहले परिदृश्य की अनुशंसा करता हूं।

अपने अनुभवों से मैं व्यक्तिगत रूप से महसूस करता हूं कि सॉफ्टवेयर वितरण विधि के रूप में बीडीडी का उपयोग करने से आपको सबसे बड़ा मूल्य मिलता है, जब आप व्यवसाय मूल्य पर जोर देते हैं।

दूसरे शब्दों में परिदृश्य तकनीकी कार्यान्वयन के बजाय व्यवसाय के व्यवहार के उदाहरणों के उदाहरण होना चाहिए। यह सुनिश्चित करता है कि विकास व्यवसाय के लक्ष्यों से प्रेरित होता है और डिलिवरेबल्स उनकी अपेक्षाओं से मेल खाता है।

इसे बाहरी विकास के रूप में जाना जाता है।

प्रणाली व्यवहार के अतिरिक्त परीक्षण और तकनीकी आवश्यकताओं को कवर करने के लिए इस्तेमाल किया जाना चाहिए सकता है, लेकिन मुझे लगता है कि खर्च के प्रयास में कम मूल्य इन ऊपर प्राकृतिक भाषा है, जो अक्सर की एक बड़ी संख्या में समय लगता है और श्रमसाध्य है लेखन में है परिदृश्यों।

1) BAs और पीओ के साथ कार्य करें व्यवहार वे अपना पहला उदाहरण की तरह गैर कार्यान्वयन विशिष्ट भाषा (उपयोग करते हुए) चाहते हैं के उदाहरण को विकसित करने के:

मैं निम्नलिखित दृष्टिकोण सलाह देते हैं।

2) अभियंता इन्हें एक परीक्षण के पहले दृष्टिकोण से विकास करने के लिए उपयोग करते हैं, उन्हें एकीकरण परीक्षण के रूप में स्वचालित करते हैं - ब्राउज़र के नीचे बहुमत के साथ (उदाहरण के लिए आपके आरईएसटी एपीआई के खिलाफ) और ब्राउज़र के माध्यम से सबसे मुख्य परिदृश्य भी (यदि आप एक विकसित कर रहे हैं)।

3) अभियंता यूनिट परीक्षणों के साथ फीचर कोड टीडीडी करते हैं जब तक यूनिट परीक्षण और बीडीडी उदाहरण दोनों पास नहीं होते हैं।

संबंधित मुद्दे