2013-04-16 3 views
26

चल रही परियोजनाओं के लिए और हमारी विकास प्रक्रिया में सुधार के लिए हमने विकास दर्शन के रूप में TDD को अपनाने पर विचार किया। सर्वोत्तम प्रथाओं के लिए शोध करते समय और मेरे सहयोगियों/डेवलपर्स के लिए नए दृष्टिकोण को "बेचने" के लिए, मैं BDD पर आया और हमें यह आवश्यक लगता है कि हमें क्या चाहिए और किसी भी तरह से टीडीडी के अगले पुनरावृत्ति के लिए। समस्या यह है कि अब तक मैंने केवल tool को Dan North, JBehave द्वारा विकसित किया है और मैं यह नहीं कह सकता कि मैं आश्चर्यचकित हूं।व्यवहार जावा के लिए प्रेरित विकास - किस ढांचे का उपयोग करना है?

सेटअप मुझे बोझिल लगता है और मुझे इसके लिए बहुत उपयुक्त दस्तावेज नहीं मिल सका। दूसरी तरफ मैंने spock ग्रोवी टूल की कोशिश की और अब तक मुझे यह पसंद है।

प्रश्न: क्या बीडीडी के लिए उपयोग करने के लिए कोई उचित उपकरण हैं?
प्रश्न: आप इसके बजाय स्पॉक का उपयोग करेंगे और दूसरी भाषा शुरू करने के ऊपरी हिस्से से निपटेंगे?

+1

हाय ओलिंपू, [बीडीडी के विभिन्न स्वाद] हैं [https://stackoverflow.com/questions/3359327/atdd-versus-bdd-and-the-proper-use-of-a-framework/26524511#26524511)। क्या गैर-तकनीकी हितधारकों को शामिल करना मूल्यवान होगा? यदि हां, तो [FitNesse] (http://fitnesse.org/) या [Concordion] (http://concordion.org/) जैसे टूल का उपयोग करने के बारे में क्या? – user3632158

+0

@ user3632158 - हां यह भी गैर-तकनीकी हितधारकों को शामिल करने की अत्यधिक सराहना की जाएगी। क्या आपने इस दिशा में प्रयोग किया था? –

+0

हम हमारी टीम में [Concordion] (http://concordion.org) का उपयोग कर रहे हैं। गैर-तकनीकी व्यवसाय विशेषज्ञ मुफ्त WYSIWYG HTML संपादक (http://www.microsoft.com/en-us/download/details.aspx?id=36179) के साथ विनिर्देश लिख रहे हैं। तब विनिर्देशों को स्वचालित स्वीकृति परीक्षण बनाने के लिए डेवलपर्स द्वारा निर्देशित किया जाता है। – user3632158

उत्तर

33

व्यवहार संचालित विकास केवल एक तकनीक है जिसका उपयोग किसी भी उपकरण के बिना किया जा सकता है। आप बस बीडीडी शैली में परीक्षण लिख सकते हैं - उदा। should के साथ परीक्षण विधियों को शुरू करें और इस विधि के साथ कुछ अलग सुविधा पेश करें। When और then अनुभागों को केवल टिप्पणियों के साथ प्रतिस्थापित किया जा सकता है, उदा।

@Test 
public void should_do_something() { 
    // given 
    Something something = getSomething(); 

    // when 
    something.doSomething(); 
    // then 
    assertSomething(); 

    // when 
    something.doSomethingElse(); 
    // then 
    assertSomethingElse(); 
} 

उल्लेख किया चौखटे पर मेरे विचार:

  • JBehave के साथ समस्या यह परीक्षण एक जटिल अंतरिक्ष यान की तरह लग रही है। दूसरी ओर यह आपके विनिर्देशों के लिए सुंदर उत्पादन है।

  • spock वास्तव में अच्छा है। कॉम्पैक्ट सिंटैक्स, सुंदर आउटपुट, बहुत सारी विशेषताएं, शक्तिशाली ग्रोवी भाषा के साथ लिखी गई हैं, जिसका अर्थ है geb के साथ संयोजन में उपयोग की संभावना। लेकिन यह ग्रोवी है और यह किसी के लिए बहुत महत्वपूर्ण हो सकता है।

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

मैं भी लगता है कि जावा के लिए सबसे सफल BDD चौखटे उन है कि जावा में नहीं लिखा जाता है के बाद से जावा भाषा डीएसएल के लिए ऐसी कोई लचीलापन (डोमेन विशिष्ट भाषा) निर्माण ग्रूवी या स्काला है कि है कर रहे हैं।

+0

धन्यवाद, अच्छा अवलोकन। –

+10

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

12

जब तक आपके उत्पाद स्वामी/qa/ग्राहक को परीक्षण पढ़ने में सक्षम होने की आवश्यकता नहीं है, Spock का उपयोग करें। यह बहुत आसान उपकरण है, लेकिन परीक्षण की पठनीयता में सुधार करता है। इसकी शक्तिशाली सुविधाओं के लिए धन्यवाद, आपको मॉकिटो, हैमक्रिस्ट और न ही एर्टर्टजे की आवश्यकता नहीं है। और इसमें शानदार पैरामीट्रिज्ड परीक्षण हैं। वास्तव में, यह "बस" एक बेहतर जुनीट है - सरल कार्यों के स्वचालित निष्पादन के लिए एक सामान्य उपकरण, चाहे यूनिट परीक्षण, एकीकरण परीक्षण या स्वीकृति परीक्षण हो।

ग्रोवी से डरते हुए? क्यूं कर? यह जावा के समान ही है। जितना अधिक आप इसे सीखेंगे, उतना ही अधिक अभिव्यक्तिपूर्ण और आपका कोड छोटा होगा। आपके परीक्षण छोटे और अधिक पठनीय होंगे। ग्रोवी जेवीएम के बेहतर पक्ष में गेटवे दवा है।

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

यदि आपको इसकी आवश्यकता है तो जेबीहेव/ककड़ी के साथ जाएं; अन्यथा, स्पॉक का उपयोग करें।

14

JGiven के लेखक के रूप में मुझे सोडी से असहमत होना है कि जावा में डीएसएल निर्माण के लिए पर्याप्त लचीलापन नहीं है। JGiven में, BDD परीक्षण के रूप में निम्नानुसार है:

@Test 
public void users_can_login { 
    given() 
     .a_registered_user() 
     .and().the_login_page_is_shown(); 

    when() 
     .the_user_enters_correct_credentials() 
     .and().the_login_button_is_pressed(); 

    then() 
     .the_welcome_page_is_shown(); 
} 

JGiven JUnit या TestNG के साथ उपयोग किया जाता है और आप सादे जावा में अपने परीक्षण में लिखें।

+2

मुझे आपके दोस्त से असहमत होना है। आपने जो प्रस्तुत किया है वह डीएसएल के साथ कुछ लेना देना नहीं है। यह जावा के लिए कुछ प्रकार की धाराप्रवाह API है (स्थिर विधियों के आधार पर), लेकिन आईएमएचओ ज्यादा पठनीय और न ही उपयोग योग्य है। –

+1

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

+0

मेरे लिए ऐसे एपीआई को ब्रांड्स और डॉट्स की मात्रा के कारण एक डीएसएल कॉल करना मुश्किल है। जावा में आप उन्हें आसानी से छोड़ नहीं सकते हैं। यह सिर्फ मेरी व्यक्तिगत भावना है। –

1

अच्छी चर्चा! मुझे जेजीवन नहीं पता था, लेकिन मैं इसमें एक नज़र डालेगा।

इसके अलावा, मैं COLA Tests का लेखक हूं, जो एक नया ढांचा है जो पूर्ण गेरकिन सिंटैक्स (ठीक से ककड़ी के समान ही) का समर्थन करता है, यह वास्तव में सेटअप करना आसान है, विशेष रूप से जब जेबीहेव की तुलना में तुलना की जाती है और उसे जुनीट धावक की आवश्यकता नहीं होती है।

असल में बस जो भी libs आप पहले से उपयोग कर रहे हैं उसका उपयोग करें!

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration(classes = { WebAppContext.class }) 
public class HelloWorldControllerTest extends BaseColaTest { 

    private final String stories = 
     "Feature: Introduce REST endpoint\n" 
      + "Scenario: Should say hello\n" 
      + "Given a web endpoint\n" 
      + "When hit by a get request\n" 
      + "Then the HTTP status will be OK\n" 
      + "And the body will say hello world"; 

    @Resource 
    private WebApplicationContext webApplicationContext; 
    private MockMvc mockMvc; 
    private ResultActions result; 

    @Given("a web endpoint") 
    public void given() { 
     mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); 
    } 

    @When("hit by a get request") 
    public void when() throws Exception { 
     result = mockMvc.perform(get("/helloWorld")); 
    } 

    @Then("the HTTP status will be OK") 
    public void thenOk() throws Exception { 
     result.andExpect(status().isOk()); 
    } 

    @Then("the body will say hello world") 
    public void thenHello() throws Exception { 
     result.andExpect(content().string("Hello World!")); 
    } 
} 
1

दें Ginkgo4j एक जाना:

यहाँ एक उदाहरण स्प्रिंग नियंत्रक टेस्ट (कहानियों एक फ़ाइल से लोड किया जा सकता है)। यह रूबी के आरएसपीसी और गो के जिन्कगो द्वारा उपयोग किए जाने वाले दृष्टिकोण को दर्पण करने के लिए जावा 8 के लैम्डा का उपयोग करता है।

यह पुस्तकालय आपको अभिव्यक्तिपूर्ण, सामग्री युक्त परीक्षण बनाने की अनुमति देता है।

`` `

package com.github.paulcwarren.ginkgo4j.examples; 

import static com.github.paulcwarren.ginkgo4j.Ginkgo4jDSL.*; 
import static org.hamcrest.CoreMatchers.is; 
import static org.hamcrest.MatcherAssert.assertThat; 

import org.junit.runner.RunWith; 

import com.github.paulcwarren.ginkgo4j.Ginkgo4jRunner; 

@RunWith(Ginkgo4jRunner.class) 
public class BookTests { 
    private Book longBook; 
    private Book shortBook; 
    { 
     Describe("Book",() -> { 
      BeforeEach(() -> { 
       longBook = new Book("Les Miserables", "Victor Hugo", 1488); 
       shortBook = new Book("Fox In Socks", "Dr. Seuss", 24); 
     }); 

     Context("Categorizing book length",() -> { 
      Context("With more than 300 pages",() -> { 
       It("should be a novel",() -> { 
        assertThat(longBook.categoryByLength(), is("NOVEL")); 
       }); 
      }); 

      Context("With fewer than 300 pages",() -> { 
       It("should be a short story",() -> { 
        assertThat(shortBook.categoryByLength(), is("NOVELLA")); 
       }); 
      }); 
     }); 
     }); 
    } 
} 

` ``

इसके अलावा वसंत का समर्थन करता है।

(पूर्ण प्रकटीकरण। मैं इस पुस्तकालय का लेखक हूं)।

3

एक अन्य विकल्प स्पेक्ट्रम होगा - देख https://github.com/greghaskins/spectrum

स्पेक्ट्रम RSpec/मोचा वाक्य रचना का समर्थन करता है और इसकी अगली फिल्म में भी खीरा वाक्य रचना का समर्थन करेंगे, JUnit नियम एकीकरण के साथ (इसलिए यह के माध्यम से Mockito, स्प्रिंग आदि के साथ interoperates @Rule और @ClassRule सदस्य)।

@RunWith(Spectrum.class) 
public class TestSomething {{ 
    Supplier<Something> freshTestObject = let(Something::new); 

    describe("The component",() -> { 
     it("is tested by specs",() -> { 
      // the "let` above gives us a new instance of the object 
      // in each spec 
      freshTestObject.get().doSomething(); 

      // using your favourite assertion framework 
      assertThat(something.get().getSomething()).isEqualTo(42); 
     }); 
    }); 
}} 

स्पेक्ट्रम अपने JUnit कंसोल में एक पदानुक्रमित परीक्षा परिणाम आउटपुट: -

पूर्ण प्रकटीकरण मैं इस ओएस परियोजना

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

स्पेक्ट्रम का उद्देश्य पॉलीग्लोट होना है, इसलिए कई मौजूदा ढांचे के उपयोगकर्ताओं से परिचित होना चाहिए।

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