RSpec बनाम टेस्ट :: रेल्स में यूनिट


15

मैं वास्तव में उन लाभों के बारे में आश्वस्त नहीं हूं, जो आपको टेस्ट :: आरएसपी ऑन रूबी ऑन रेल्स (आरएसपीईसी के बारे में समय-समय पर पढ़ने के बावजूद) से RSpec पर स्विच करके मिलते हैं।

RSpec के बारे में यह क्या है कि अधिकांश रेल परियोजना इसका उपयोग कर रही है?

(कुछ कोड उदाहरण स्पष्ट रूप से एक के फायदे की ओर संकेत करते हैं जो बहुत सराहे जाएंगे)


4
केवल 1 साल बाद और मैं टेस्ट :: यूनिट ... RSpec FTW पर घृणा से देखता हूं!
Paweł Go Pawcicki

StackOverflow पर डुप्लिकेट के पास: RSpec बनाम टेस्ट :: यूनिट और RSpec बनाम
कंधे

जवाबों:


13

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

ऊपर दिए गए बिंदुओं के लिए आपको कुछ संदर्भ देने के लिए, दो कार्यात्मक समकक्ष इकाई परीक्षणों के आउटपुट / स्रोत कोड की तुलना (यहाँ बहुत ही वंचित) की गई है, एक RSpec का उपयोग करते हुए लिखा गया है और दूसरा टेस्ट :: यूनिट का उपयोग करते हुए।

परीक्षण के तहत कोड

class DeadError < StandardError; end

class Dog
  def bark
    raise DeadError.new "Can't bark when dead" if @dead
    "woof"
  end

  def die
    @dead = true
  end
end

टेस्ट :: यूनिट

 require 'test/unit'
  require 'dog'

  class DogTest < Test::Unit::TestCase
    def setup
      @dog = Dog.new
    end

    def test_barks
      assert_equal "woof", @dog.bark    
    end

    def test_doesnt_bark_when_dead
      @dog.die
      assert_raises DeadError do
        @dog.bark
      end
    end
  end

RSpec

require 'rspec'
require 'dog'

describe Dog do
  before(:all) do
    @dog = Dog.new
  end

  context "when alive" do
    it "barks" do
      @dog.bark.should == "woof"
    end
  end

  context "when dead" do
    before do
      @dog.die
    end

    it "raises an error when asked to bark" do
      lambda { @dog.bark }.should raise_error(DeadError)
    end
  end
end

टेस्ट :: यूनिट आउटपुट (जितना मैं इसे बना सकता था)

Ξ code/examples → ruby dog_test.rb --verbose
Loaded suite dog_test
Started
test_barks(DogTest): .
test_doesnt_bark_when_dead(DogTest): .

Finished in 0.004937 seconds.

RSpec आउटपुट (दस्तावेज़ीकरण फ़ॉर्मेटर)

Ξ code/examples → rspec -fd dog_spec.rb 

Dog
  when alive
    barks
  when dead
    raises an error when asked to bark

Finished in 0.00224 seconds
2 examples, 0 failures

2 tests, 2 assertions, 0 failures, 0 errors

पीएस मुझे लगता है कि बेरिन (पिछले उत्तरदाता) ककड़ी की भूमिकाओं को स्वीकार कर रहा है (जो कि आरएसपीईसी परियोजना से बाहर हो गई लेकिन स्वतंत्र है) और आरएसपीईसी। ककड़ी एक BDD शैली में स्वचालित स्वीकृति परीक्षण के लिए एक उपकरण है, जबकि RSpec परीक्षण के लिए एक कोड लाइब्रेरी है जो इकाई, एकीकरण और कार्यात्मक स्तरों पर उपयोग किया जा सकता है, और है। इसलिए RSpec का उपयोग इकाई परीक्षण को रोकता नहीं है - यह सिर्फ इतना है कि आप अपनी इकाई परीक्षणों को 'चश्मा' कहते हैं।


जब मैं यहाँ आया तो दुखी होने की उम्मीद नहीं कर रहा था
रोमन

3

हाल ही में ऐसा लगता है कि खीरे को रेल समुदाय में अधिक समर्थन मिल रहा है। यहाँ संक्षेप तर्क मैंने RSpec के नेतृत्व के साथ एक साक्षात्कार से सुना है (एक पुरानी रूबी से रेल्स पॉडकास्ट पर)।

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

सरल का नाम बदलने assertके लिएshouldविनिर्देशों को लिखने के लिए मन को सही तरीके से ध्यान केंद्रित करने और डिजाइन के बारे में सोचने में मदद करने के । हालाँकि, यह समीकरण का केवल एक हिस्सा है।

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

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

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.